Skip to content

Commit

Permalink
Added public method formatForCreate
Browse files Browse the repository at this point in the history
  • Loading branch information
juanhapes committed Apr 19, 2021
1 parent 6c322a1 commit 78d38ee
Show file tree
Hide file tree
Showing 12 changed files with 122 additions and 78 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

## [Unreleased]

## [5.2.1] - 2021-04-19
### Added
- Public method `formatForCreate` to formatting

## [5.2.0] - 2021-03-26
### Added
- Fetched credentials in **AWS Secrets Manager** using `@janiscommerce/aws-secrets-manager`.
Expand Down
29 changes: 7 additions & 22 deletions lib/api-create.js
Original file line number Diff line number Diff line change
@@ -1,44 +1,29 @@
'use strict';

const { API } = require('@janiscommerce/api');
const { struct } = require('@janiscommerce/superstruct');

const { Invoker } = require('@janiscommerce/lambda');

const ClientFetcher = require('./helpers/model-fetcher');
const ModelFormatter = require('./helpers/model-formatter');
const saveClients = require('./helpers/save-clients');

module.exports = class ClientCreateAPI extends API {

async validate(data = this.data) {

if(data === null || typeof data !== 'object' || Array.isArray(data))
throw new Error('Invalid data: Should be an object, also not an array.');

if(!Array.isArray(data.clients))
throw new Error('Invalid data: Should have a clients property and must be an array.');
get struct() {
return struct({
clients: struct(['string'])
});
}

async process({ clients: clientCodes } = this.data) {

await this.saveClients(clientCodes);
await saveClients(clientCodes);

await Invoker.call('MongoDBIndexCreator');

return this.postSaveHook(clientCodes);
}

async saveClients(clientCodes) {

await ModelFormatter.prepareSettings();

const clientsToCreate = clientCodes.map(code => ModelFormatter.format(code));

const ClientModel = ClientFetcher.get();

const model = new ClientModel();
return model.multiSave(clientsToCreate);
}

/**
* It executes after saving.
*/
Expand Down
32 changes: 19 additions & 13 deletions lib/helpers/model-formatter.js → lib/helpers/client-formatter.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,36 @@ const replaceKeys = require('./replace-keys');

const CredentialsFetcher = require('./credentials-fetcher');

const ClientFetcher = require('./model-fetcher');
const ModelFetcher = require('./model-fetcher');

module.exports = class ModelFormatter {
module.exports = class ClientFormatter {

static get statusActive() {

if(!this._statusActive) {
const ClientModel = ClientFetcher.get();
const ClientModel = ModelFetcher.get();
this._statusActive = ClientModel.statuses.active;
}

return this._statusActive;
}

static async format(code) {

await this.prepareSettings();

return {
code,
databases: this.prepareDatabases(code),
status: this.statusActive
};
}

static async prepareSettings() {

if(this.settings)
return;

this.settings = {};

const settings = Settings.get('newClientsDatabases');
Expand All @@ -33,8 +47,8 @@ module.exports = class ModelFormatter {

/**
* recorre las settings de newClientsDatabases del servicio
* - puede ser que el servicio no tenga la forma 'write' y tenga la config directa, salva ese caso
* - asigna las settings ya formateadas a this.settings
* - 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
* - guarda shouldFetchCredentials si es necesario consultar en AWS Secrets Manager
*/

Expand Down Expand Up @@ -63,14 +77,6 @@ module.exports = class ModelFormatter {
&& (typeof config.skipFetchCredentials === 'undefined' || config.skipFetchCredentials === false);
}

static format(code) {
return {
code,
databases: this.prepareDatabases(code),
status: this.statusActive
};
}

static prepareDatabases(code) {
return Object.entries(this.settings)
.reduce((preparedDatabases, [key, dbConfig]) => ({
Expand Down
17 changes: 17 additions & 0 deletions lib/helpers/save-clients.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
'use strict';

const ModelFetcher = require('./model-fetcher');
const ModelClient = require('../model-client');

module.exports = async clientCodes => {

const clientsToCreate = await Promise.all(
clientCodes.map(clientCode => ModelClient.formatForCreate(clientCode))
);

const ClientModel = ModelFetcher.get(); // se tiene que usar el modelo del servicio

const model = new ClientModel();

return model.multiSave(clientsToCreate);
};
4 changes: 2 additions & 2 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
'use strict';

const APICreate = require('./api-create');
const ModelClient = require('./model-client');
const APICreate = require('./api-create');
const ListenerCreated = require('./listener-created');
const ListenerUpdated = require('./listener-updated');
const ListenerRemoved = require('./listener-removed');
const clientFunctions = require('./client-functions');

module.exports = {
APICreate,
ModelClient,
APICreate,
ListenerCreated,
ListenerUpdated,
ListenerRemoved,
Expand Down
16 changes: 2 additions & 14 deletions lib/listener-created.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ const { EventListener } = require('@janiscommerce/event-listener');

const MongoDBIndexCreator = require('@janiscommerce/mongodb-index-creator');

const ClientFetcher = require('./helpers/model-fetcher');
const ModelFormatter = require('./helpers/model-formatter');
const saveClients = require('./helpers/save-clients');

const mongoDBIndexCreator = new MongoDBIndexCreator();

Expand All @@ -19,24 +18,13 @@ module.exports = class ClientCreatedListener extends EventListener {

const clientCode = this.eventId;

await this.saveClient(clientCode);
await saveClients([clientCode]);

await mongoDBIndexCreator.executeForClientCode(clientCode);

return this.postSaveHook(clientCode);
}

async saveClient(clientCode) {

await ModelFormatter.prepareSettings();

const ClientModel = ClientFetcher.get();

const model = new ClientModel();

return model.save(ModelFormatter.format(clientCode));
}

/**
* It executes after saving.
*/
Expand Down
4 changes: 2 additions & 2 deletions lib/listener-removed.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
const { EventListener } = require('@janiscommerce/event-listener');
const Model = require('@janiscommerce/model');

const ClientFetcher = require('./helpers/model-fetcher');
const ModelFetcher = require('./helpers/model-fetcher');

module.exports = class ClientRemovedListener extends EventListener {

Expand All @@ -14,7 +14,7 @@ module.exports = class ClientRemovedListener extends EventListener {
get model() {

if(!this._model) {
const ClientModel = ClientFetcher.get();
const ClientModel = ModelFetcher.get();
this._model = new ClientModel();
}

Expand Down
6 changes: 3 additions & 3 deletions lib/listener-updated.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
const { EventListener } = require('@janiscommerce/event-listener');
const MicroserviceCall = require('@janiscommerce/microservice-call');

const ClientFetcher = require('./helpers/model-fetcher');
const ModelFetcher = require('./helpers/model-fetcher');

module.exports = class ClientUpdatedListener extends EventListener {

Expand Down Expand Up @@ -41,7 +41,7 @@ module.exports = class ClientUpdatedListener extends EventListener {

updateServiceClient(updatedClient) {

const ClientModel = ClientFetcher.get();
const ClientModel = ModelFetcher.get();
const model = new ClientModel();

return model.update({
Expand All @@ -52,7 +52,7 @@ module.exports = class ClientUpdatedListener extends EventListener {
}

/**
* It executes after saving.
* It executes after updating.
*/
async postSaveHook() {
return true;
Expand Down
6 changes: 6 additions & 0 deletions lib/model-client.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

const Model = require('@janiscommerce/model');

const ClientFormatter = require('./helpers/client-formatter');

module.exports = class Client extends Model {

get databaseKey() {
Expand All @@ -27,4 +29,8 @@ module.exports = class Client extends Model {
static get excludeFieldsInLog() {
return ['databases'];
}

static formatForCreate(clientCode) {
return ClientFormatter.format(clientCode);
}
};
13 changes: 7 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@janiscommerce/client-creator",
"version": "5.2.0",
"version": "5.2.1",
"description": "A package that wraps all the client creation in Janis Services",
"main": "lib/index.js",
"scripts": {
Expand All @@ -27,7 +27,7 @@
"@janiscommerce/event-listener-test": "^3.0.0",
"eslint-config-airbnb-base": "^13.2.0",
"eslint-plugin-import": "^2.22.1",
"eslint": "^7.22.0",
"eslint": "^7.24.0",
"husky": "^4.3.8",
"mocha": "^8.3.2",
"mock-require": "^3.0.3",
Expand All @@ -45,10 +45,11 @@
"@janiscommerce/api-session": "^3.1.1",
"@janiscommerce/aws-secrets-manager": "^0.2.0",
"@janiscommerce/event-listener": "^3.0.0",
"@janiscommerce/lambda": "^3.1.0",
"@janiscommerce/microservice-call": "^4.2.0",
"@janiscommerce/model": "^5.4.0",
"@janiscommerce/lambda": "^3.2.0",
"@janiscommerce/microservice-call": "^4.3.1",
"@janiscommerce/model": "^5.5.0",
"@janiscommerce/mongodb-index-creator": "^2.3.0",
"@janiscommerce/settings": "^1.0.1"
"@janiscommerce/settings": "^1.0.1",
"@janiscommerce/superstruct": "^1.2.0"
}
}
19 changes: 19 additions & 0 deletions tests/api-create.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const {
stopMock
} = require('./helpers/model-fetcher');

const ClientFormatter = require('../lib/helpers/client-formatter');

const fakeDBSettings = require('./helpers/fake-db-settings');
const prepareFakeClient = require('./helpers/prepare-fake-client');
Expand All @@ -43,6 +44,8 @@ describe('Client Create API', () => {
response: { code: 200 },
before: sandbox => {

delete ClientFormatter.settings;

mockModelClient();

sandbox.stub(Settings, 'get').returns(fakeDBSettings);
Expand Down Expand Up @@ -83,6 +86,8 @@ describe('Client Create API', () => {
response: { code: 200 },
before: sandbox => {

delete ClientFormatter.settings;

mockModelClient();

sandbox.stub(Settings, 'get')
Expand Down Expand Up @@ -124,6 +129,8 @@ describe('Client Create API', () => {
response: { code: 200 },
before: sandbox => {

delete ClientFormatter.settings;

mockModelClient();

sandbox.stub(Settings, 'get').returns(fakeDBSettings);
Expand Down Expand Up @@ -167,6 +174,8 @@ describe('Client Create API', () => {
response: { code: 200 },
before: sandbox => {

delete ClientFormatter.settings;

mockModelClient();

sandbox.stub(Settings, 'get').returns(fakeDBSettings);
Expand Down Expand Up @@ -200,6 +209,8 @@ describe('Client Create API', () => {
response: { code: 200 },
before: sandbox => {

delete ClientFormatter.settings;

mockModelClient();

sandbox.stub(Settings, 'get').returns(fakeDBSettings);
Expand Down Expand Up @@ -231,6 +242,8 @@ describe('Client Create API', () => {
response: { code: 200 },
before: sandbox => {

delete ClientFormatter.settings;

mockModelClient();

sandbox.stub(Settings, 'get').returns(fakeDBSettings);
Expand Down Expand Up @@ -262,6 +275,8 @@ describe('Client Create API', () => {
response: { code: 500 },
before: sandbox => {

delete ClientFormatter.settings;

mockModelClient();

sandbox.stub(Settings, 'get').returns(fakeDBSettings);
Expand Down Expand Up @@ -293,6 +308,8 @@ describe('Client Create API', () => {
response: { code: 500 },
before: sandbox => {

delete ClientFormatter.settings;

mockModelClient();

sandbox.stub(Settings, 'get').returns(fakeDBSettings);
Expand Down Expand Up @@ -346,6 +363,8 @@ describe('Client Create API', () => {
},
before: sandbox => {

delete ClientFormatter.settings;

wrongMockModelClient();

sandbox.stub(Settings, 'get').returns(fakeDBSettings);
Expand Down
Loading

0 comments on commit 78d38ee

Please sign in to comment.