import { InternalService, Microservice } from "@autoplex/microservice"; import { env, secret } from "@autoplex/utils"; import { createConnection, Connection, EntitySchema } from "typeorm"; import * as DB from "./constants"; import * as entities from "./entities"; /** * The type for entity schemas */ export type EntitySchemaTypes = string|Function|EntitySchema; /** * A convenience database service */ export class DatabaseService extends InternalService { /** * The name of the service */ public readonly NAME = "Database"; /** * The active database connection */ public connection!: Connection; /** * The function used to create the connection * This is important because inheriting this service to provide custom entity types will not get * the connection stored in the correct connection manager without overriding this explicitly. */ protected createConnection = createConnection; /** * The database entities */ protected entities: EntitySchemaTypes[] = Object.values(entities); /** * Boot the database service */ public async boot() { let password = await secret(DB.DATABASE_PASSWORD_FILE); let database = env("DATABASE"); this.connection = await this.connectToDatabase( DB.DATABASE_TYPE, DB.DATABASE_HOST, DB.DATABASE_PORT, DB.DATABASE_USER, password, database, this.entities ); } /** * Shutdown the database service */ public async shutdown() { await this.connection.close(); } /** * A convenience function to connect to the database */ protected async connectToDatabase(type: "mysql"|"mariadb", host: string, port: number, user: string, password: string, database: string, entities: EntitySchemaTypes[]) { // Create the database connection return await this.createConnection({ type : type, host : host, port : port, username : user, password : password, database : database, // synchronize: process.env["NODE_ENV"] != "production", synchronize: true, // Seems stable enough for my liking entities }); } }