@janiscommerce/client-creator
Version:
A package that wraps all the client creation in Janis Services
171 lines (122 loc) • 4.02 kB
JavaScript
;
const logger = require('lllog')();
const Settings = require('@janiscommerce/settings');
const ParameterStore = require('./parameter-store');
const CredentialsFetcher = require('./credentials-fetcher');
const replaceKeys = require('./replace-keys');
const ModelFetcher = require('./model-fetcher');
module.exports = class ClientFormatter {
static get ClientModel() {
return ModelFetcher.get(); // se tiene que usar el modelo del servicio
}
static async format({ code, status, ...restOfClient }, currentClient) {
await this.setDependencies();
return {
code,
...this.formatDB(code, currentClient),
...this.formatDatabasesDeprecated(code),
status: currentClient ? status : this.ClientModel.statuses.active,
...this.ClientModel.additionalFields?.reduce((additionalFields, field) => {
if(typeof restOfClient[field] !== 'undefined')
additionalFields[field] = restOfClient[field];
else if(currentClient) {
if(!additionalFields.$unset)
additionalFields.$unset = [];
additionalFields.$unset.push(field); // this sync MS client with ID client
}
return additionalFields;
}, {})
};
}
static formatDB(clientCode, currentClient) {
const newClientsDatabases = ParameterStore.get();
if(!Object.keys(newClientsDatabases).length)
return {};
return Object.entries(newClientsDatabases)
.reduce((clientDatabases, [databaseKey, databaseId]) => {
clientDatabases.db[databaseKey] = {
id: currentClient?.db?.[databaseKey]?.id // current id
|| databaseId,
database: currentClient?.db?.[databaseKey]?.database // current format
|| currentClient?.databases?.[databaseKey]?.write?.database // old format
|| currentClient?.databases?.[databaseKey]?.database // oldest format
|| `${process.env.JANIS_SERVICE_NAME}-${clientCode}` // default
};
return clientDatabases;
}, {
db: {}
});
}
/**
* @deprecated
*/
static formatDatabasesDeprecated(code) {
if(!Object.keys(this.settings).length)
return {};
return Object.entries(this.settings)
.reduce((preparedDatabases, [key, dbConfig]) => {
preparedDatabases.databases[key] = this.formatDatabase(key, code, dbConfig);
return preparedDatabases;
}, {
databases: {}
});
}
/**
* @deprecated
*/
static formatDatabase(key, code, dbConfig) {
/**
* Se formatea cada base de datos de las settings
* - se reemplaza la variable code por el client.code
* - se agregan las credenciales que se encontraron en AWS Secrets Manager para esa config de DB
*/
return Object.entries(dbConfig)
.reduce((formattedConfig, [accessType, config]) => {
formattedConfig[accessType] = {
...replaceKeys('code', code, config),
...CredentialsFetcher.get(key, accessType)
};
return formattedConfig;
}, {});
}
static async setDependencies() {
if(this.dependenciesAreSet)
return;
await Promise.all([
ParameterStore.set(),
this.setSettings()
]);
this.dependenciesAreSet = true;
}
/**
* @deprecated
*/
static async setSettings() {
this.settings = {};
const settings = Settings.get('newClientsDatabases');
if(!settings)
return;
logger.warn('Settings usage is deprecated, newClientsDatabases must be configured in Devops Service');
/**
* recorre las settings de newClientsDatabases del servicio
* - puede ser que el servicio no tenga la forma 'write' y tenga la config directa, arregla ese caso
* - asigna las settings formateadas a this.settings
*/
Object.entries(settings).forEach(([dbKey, dbKeyConfig]) => {
if(!dbKeyConfig.write)
dbKeyConfig = { write: dbKeyConfig };
if(!dbKeyConfig.admin)
dbKeyConfig.admin = dbKeyConfig.write;
this.settings[dbKey] = dbKeyConfig;
});
await CredentialsFetcher.fetch();
}
/**
* Exclusive for testing purposes
*/
static restore() {
this.dependenciesAreSet = undefined;
this.settings = undefined;
ParameterStore.parameter = undefined;
}
};