/** * @author [Tristan Valcke]{@link https://github.com/Itee} * @license [BSD-3-Clause]{@link https://opensource.org/licenses/BSD-3-Clause} * * @file Todo * * @example Todo * */ import { TAbstractObject } from 'itee-core' import { isNull, isUndefined } from 'itee-validators' import path from 'path' import { TAbstractDatabasePlugin } from '../plugins/TAbstractDatabasePlugin' class TAbstractDatabase extends TAbstractObject { constructor ( parameters = {} ) { const _parameters = { ...{ driver: null, application: null, router: null, plugins: [] }, ...parameters } super( _parameters ) this.driver = _parameters.driver this.application = _parameters.application this.router = _parameters.router this.plugins = _parameters.plugins } get plugins () { return this._plugins } set plugins ( value ) { if ( isNull( value ) ) { throw new TypeError( 'Plugins cannot be null ! Expect an array of TDatabasePlugin.' ) } if ( isUndefined( value ) ) { throw new TypeError( 'Plugins cannot be undefined ! Expect an array of TDatabasePlugin.' ) } this._plugins = value this._registerPlugins() } get router () { return this._router } set router ( value ) { if ( isNull( value ) ) { throw new TypeError( 'Router cannot be null ! Expect a Express Router.' ) } if ( isUndefined( value ) ) { throw new TypeError( 'Router cannot be undefined ! Expect a Express Router.' ) } this._router = value } get application () { return this._application } set application ( value ) { if ( isNull( value ) ) { throw new TypeError( 'Application cannot be null ! Expect a Express Application.' ) } if ( isUndefined( value ) ) { throw new TypeError( 'Application cannot be undefined ! Expect a Express Application.' ) } this._application = value } get driver () { return this._driver } set driver ( value ) { if ( isNull( value ) ) { throw new TypeError( 'Driver cannot be null ! Expect a database driver.' ) } if ( isUndefined( value ) ) { throw new TypeError( 'Driver cannot be undefined ! Expect a database driver.' ) } this._driver = value } setPlugins ( value ) { this.plugins = value return this } addPlugin ( value ) { this._plugins.push( value ) const [ key, data ] = Object.entries( value )[ 0 ] this._registerPlugin( key, data ) return this } setRouter ( value ) { this.router = value return this } setApplication ( value ) { this.application = value return this } setDriver ( value ) { this.driver = value return this } init () {} _registerPlugins () { for ( let [ name, config ] of Object.entries( this._plugins ) ) { this._registerPlugin( name, config ) } } _registerPlugin ( name, config ) { if ( this._registerPackagePlugin( name, config ) ) { return } if ( this._registerLocalPlugin( name, config ) ) { return } this.logger.error( `Unable to register the plugin ${ name } the package or local folder doesn't seem to exist ! Skip it.` ) } _registerPackagePlugin ( name, config ) { let success = false try { //[Itee:01/03/2022] Todo: Waiting better plugin management for package that expose more than instancied plugin let plugin = require( name ) if(plugin.registerPlugin) { plugin = plugin.registerPlugin( config ) } if ( plugin instanceof TAbstractDatabasePlugin ) { this.logger.log( `Use ${ name } plugin from node_modules` ) plugin.__dirname = path.dirname( require.resolve( name ) ) plugin.registerTo( this.driver, this.application, this.router ) success = true } else { this.logger.error( `The plugin ${ name } doesn't seem to be an instance of an extended class from TAbstractDatabasePlugin ! Skip it.` ) } } catch ( error ) { if ( !error.code || error.code !== 'MODULE_NOT_FOUND' ) { this.logger.error( error ) } } return success } _registerLocalPlugin ( name, config ) { let success = false try { //[Itee:01/03/2022] Todo: Waiting better plugin management for package that expose more than instancied plugin // todo use rootPath or need to resolve depth correctly ! const localPluginPath = path.join( __dirname, '../../../', 'databases/plugins/', name, `${ name }.js` ) let plugin = require( localPluginPath ) if(plugin.registerPlugin) { plugin = plugin.registerPlugin( config ) } if ( plugin instanceof TAbstractDatabasePlugin ) { this.logger.log( `Use ${ name } plugin from local folder` ) plugin.__dirname = path.dirname( require.resolve( localPluginPath ) ) plugin.registerTo( this.driver, this.application, this.router ) success = true } else { this.logger.error( `The plugin ${ name } doesn't seem to be an instance of an extended class from TAbstractDatabasePlugin ! Skip it.` ) } } catch ( error ) { this.logger.error( error ) } return success } connect () {} close ( /*callback*/ ) {} on ( /*eventName, callback*/ ) {} } export { TAbstractDatabase }