import { DatabaseType, GenericHelpers, IDatabaseCollections, } from './'; import { UserSettings, } from 'n8n-core'; import { ConnectionOptions, createConnection, getRepository, } from 'typeorm'; import * as config from '../config'; import { MongoDb, MySQLDb, PostgresDb, SQLite, } from './databases'; export let collections: IDatabaseCollections = { Credentials: null, Execution: null, Workflow: null, Webhook: null, }; import { InitialMigration1587669153312, WebhookModel1589476000887, } from './databases/postgresdb/migrations'; import { InitialMigration1587563438936 } from './databases/mongodb/migrations'; import { InitialMigration1588157391238, WebhookModel1592447867632, } from './databases/mysqldb/migrations'; import { InitialMigration1588102412422, WebhookModel1592445003908, } from './databases/sqlite/migrations'; import * as path from 'path'; export async function init(): Promise { const dbType = await GenericHelpers.getConfigValue('database.type') as DatabaseType; const n8nFolder = UserSettings.getUserN8nFolderPath(); let entities; let connectionOptions: ConnectionOptions; const entityPrefix = config.get('database.tablePrefix'); switch (dbType) { case 'mongodb': entities = MongoDb; connectionOptions = { type: 'mongodb', entityPrefix, url: await GenericHelpers.getConfigValue('database.mongodb.connectionUrl') as string, useNewUrlParser: true, migrations: [InitialMigration1587563438936], migrationsRun: true, migrationsTableName: `${entityPrefix}migrations`, }; break; case 'postgresdb': entities = PostgresDb; connectionOptions = { type: 'postgres', entityPrefix, database: await GenericHelpers.getConfigValue('database.postgresdb.database') as string, host: await GenericHelpers.getConfigValue('database.postgresdb.host') as string, password: await GenericHelpers.getConfigValue('database.postgresdb.password') as string, port: await GenericHelpers.getConfigValue('database.postgresdb.port') as number, username: await GenericHelpers.getConfigValue('database.postgresdb.user') as string, schema: config.get('database.postgresdb.schema'), migrations: [InitialMigration1587669153312, WebhookModel1589476000887], migrationsRun: true, migrationsTableName: `${entityPrefix}migrations`, }; break; case 'mariadb': case 'mysqldb': entities = MySQLDb; connectionOptions = { type: dbType === 'mysqldb' ? 'mysql' : 'mariadb', database: await GenericHelpers.getConfigValue('database.mysqldb.database') as string, entityPrefix, host: await GenericHelpers.getConfigValue('database.mysqldb.host') as string, password: await GenericHelpers.getConfigValue('database.mysqldb.password') as string, port: await GenericHelpers.getConfigValue('database.mysqldb.port') as number, username: await GenericHelpers.getConfigValue('database.mysqldb.user') as string, migrations: [InitialMigration1588157391238, WebhookModel1592447867632], migrationsRun: true, migrationsTableName: `${entityPrefix}migrations`, }; break; case 'sqlite': entities = SQLite; connectionOptions = { type: 'sqlite', database: path.join(n8nFolder, 'database.sqlite'), entityPrefix, migrations: [InitialMigration1588102412422, WebhookModel1592445003908], migrationsRun: true, migrationsTableName: `${entityPrefix}migrations`, }; break; default: throw new Error(`The database "${dbType}" is currently not supported!`); } Object.assign(connectionOptions, { entities: Object.values(entities), synchronize: false, logging: false, }); const connection = await createConnection(connectionOptions); await connection.runMigrations({ transaction: 'none', }); collections.Credentials = getRepository(entities.CredentialsEntity); collections.Execution = getRepository(entities.ExecutionEntity); collections.Workflow = getRepository(entities.WorkflowEntity); collections.Webhook = getRepository(entities.WebhookEntity); return collections; }