You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

83 lines
2.1 KiB

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<any>;
/**
* A convenience database service
*/
export class DatabaseService<M extends Microservice = Microservice> extends InternalService<M>
{
/**
* 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
});
}
}