UNPKG

forest-cli

Version:

The Lumberjacks' toolbelt is the Forest CLI which makes easy to manage your back office application directly from the terminal.

117 lines 11.1 kB
const ForestCLIError = require('../../errors/forest-cli-error'); module.exports = class SchemaService { constructor({ assertPresent, constants, database, databaseAnalyzer, forestExpressDumper, env, errorHandler, fs, logger, path, spinner, }) { assertPresent({ constants, database, databaseAnalyzer, forestExpressDumper, env, errorHandler, fs, logger, path, spinner, }); this.constants = constants; this.database = database; this.databaseAnalyzer = databaseAnalyzer; this.dumper = forestExpressDumper; this.env = env; this.errorHandler = errorHandler; this.fs = fs; this.logger = logger; this.path = path; this.spinner = spinner; } _assertOutputDirectory(outputDirectory) { if (!outputDirectory) { this.dumper.checkForestCLIProjectStructure(); } else if (this.fs.existsSync(outputDirectory)) { throw new ForestCLIError(`The output directory "${outputDirectory}" already exists.`); } } _getDatabasesConfig(path) { const configPath = this.path.resolve(this.constants.CURRENT_WORKING_DIRECTORY, path); if (!this.fs.existsSync(configPath)) { throw new ForestCLIError(`The configuration file "${configPath}" does not exist.`); } // eslint-disable-next-line global-require, import/no-dynamic-require const databasesConfig = require(configPath); if (!this.database.areAllDatabasesOfTheSameType(databasesConfig)) { throw new ForestCLIError(`The "${configPath}" file contains different databases types.`); } return databasesConfig; } async _connectToDatabases(databasesConfig) { this.spinner.start({ text: 'Connecting to your database(s)' }); const databasesConnectionPromise = this.database.connectFromDatabasesConfig(databasesConfig); return this.spinner.attachToPromise(databasesConnectionPromise); } async _disconnectFromDatabases(databaseConnections) { this.spinner.start({ text: 'Disconnecting from your database(s)' }); const databasesConnectionPromise = this.database.disconnectFromDatabases(databaseConnections); return this.spinner.attachToPromise(databasesConnectionPromise); } async _analyzeDatabases(databasesConnection, dbSchema) { this.spinner.start({ text: 'Analyzing the database(s)' }); const databasesSchemaPromise = Promise.all(databasesConnection.map(async (databaseConnection) => { const analyzerOptions = { dbDialect: this.database.getDialect(databaseConnection.connection.url), dbSchema, }; const schema = await this.databaseAnalyzer.analyze(databaseConnection.connectionInstance, analyzerOptions, true); return { ...databaseConnection, schema, analyzerOptions, }; })); return this.spinner.attachToPromise(databasesSchemaPromise); } async _dumpSchemas(databasesSchema, appName, isUpdate, useMultiDatabase) { this.spinner.start({ text: 'Generating your files' }); const dumpPromise = Promise.all(databasesSchema.map(databaseSchema => this.dumper.dump({ appConfig: { appName, isUpdate, useMultiDatabase, modelsExportPath: this.path.relative('models', databaseSchema.modelsDir), }, dbConfig: { dbDialect: databaseSchema.analyzerOptions.dbDialect, dbSchema: databaseSchema.analyzerOptions.dbSchema, }, }, databaseSchema.schema))); return this.spinner.attachToPromise(dumpPromise); } _warnIfSingleToMulti(outputDirectory, useMultiDatabase) { const fromSingleToMultipleDatabases = !outputDirectory && useMultiDatabase && !this.dumper.hasMultipleDatabaseStructure(); if (fromSingleToMultipleDatabases) { this.logger.warn('It looks like you are switching from a single to a multiple databases.'); this.logger.log('You will need to move the models files from your existing database to' + ' the dedicated folder, or simply remove them.'); } } async _update({ isUpdate, outputDirectory, dbSchema, dbConfigPath }) { this.dumper.checkLianaCompatiblityForUpdate(); this._assertOutputDirectory(outputDirectory); const databasesConfig = this._getDatabasesConfig(dbConfigPath); const databasesConnection = await this._connectToDatabases(databasesConfig); const databasesSchema = await this._analyzeDatabases(databasesConnection, dbSchema); await this._disconnectFromDatabases(databasesConnection); const useMultiDatabase = databasesSchema.length > 1; await this._dumpSchemas(databasesSchema, outputDirectory, isUpdate, useMultiDatabase); this._warnIfSingleToMulti(outputDirectory, useMultiDatabase); } async update(options) { try { await this._update(options); } catch (error) { await this.errorHandler.handle(error); } } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvc2NoZW1hL3NjaGVtYS1zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0FBRWhFLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxhQUFhO0lBQ2xDLFlBQVksRUFDVixhQUFhLEVBQ2IsU0FBUyxFQUNULFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLEdBQUcsRUFDSCxZQUFZLEVBQ1osRUFBRSxFQUNGLE1BQU0sRUFDTixJQUFJLEVBQ0osT0FBTyxHQUNSO1FBQ0MsYUFBYSxDQUFDO1lBQ1osU0FBUztZQUNULFFBQVE7WUFDUixnQkFBZ0I7WUFDaEIsbUJBQW1CO1lBQ25CLEdBQUc7WUFDSCxZQUFZO1lBQ1osRUFBRTtZQUNGLE1BQU07WUFDTixJQUFJO1lBQ0osT0FBTztTQUNSLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLG1CQUFtQixDQUFDO1FBQ2xDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDO0lBRUQsc0JBQXNCLENBQUMsZUFBZTtRQUNwQyxJQUFJLENB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