import path from 'path'; import { BaseEntity, Connection, createConnection, DatabaseType, LoggerOptions, } from 'typeorm'; import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions'; import logger from '@/logger'; import * as entities from '../entities/'; export const shouldCache = (): boolean => { return !['test', 'development'].includes(process.env.NODE_ENV ?? ''); }; /* * Create database connnection */ export default async function connect(): Promise { // Takes care of passing the correct logging option. let logging: LoggerOptions = ['error', 'schema', 'warn', 'migration']; if (process.env.TYPEORM_LOGGING === 'all') { logging = 'all'; } else if (process.env.TYPEORM_LOGGING) { logging = process.env.TYPEORM_LOGGING.split(',') as LoggerOptions; } const config = { database: global?.TYPEORM_DATABASE ?? process.env.TYPEORM_DATABASE, entities: [ process.env.TYPEORM_ENTITIES, ...Object.values(entities).filter( (klass) => klass.prototype instanceof BaseEntity ), ], host: process.env.TYPEORM_HOST, password: process.env.TYPEORM_PASSWORD, port: Number(process.env.TYPEORM_PORT), type: process.env.TYPEORM_CONNECTION as DatabaseType, username: process.env.TYPEORM_USERNAME, synchronize: false, logging, // we never want to dropSchema in production dropSchema: process.env.NODE_ENV !== 'production' && process.env.DROP_SCHEMA, migrations: [ process.env.TYPEORM_MIGRATIONS ?? path.resolve(__dirname, String('../migration/*.js')), ], migrationsRun: true, cache: shouldCache(), poolErrorHandler: (error) => { logger.error(error); }, } as PostgresConnectionOptions; return await createConnection(config); }