diff --git a/app/core/applications/persistenceApplication.js b/app/core/applications/persistenceApplication.js index 37cb5e7c..753b70c8 100644 --- a/app/core/applications/persistenceApplication.js +++ b/app/core/applications/persistenceApplication.js @@ -12,6 +12,7 @@ const Access = require('core/entities/accessRole'); const aclRoles = require('./transforms/aclRoles'); const jsonParser = require('./transforms/jsonParser'); +const strIDtoObjectID = require('./transforms/strIDtoObjectID'); const PersistenceApp = (Entity, PersistenceServices = DPersistenceServices) => { @@ -21,6 +22,7 @@ const PersistenceApp = (Entity, PersistenceServices = DPersistenceServices) => { find (req, res, next) { let {query, user} = req; + query = strIDtoObjectID(query, Entity.mapRelations) query = _.defaults(query, {limit: 20}, {page: 1}); query = jsonParser(query, 'query'); diff --git a/app/core/applications/transforms/strIDtoObjectID.js b/app/core/applications/transforms/strIDtoObjectID.js new file mode 100644 index 00000000..aa79b884 --- /dev/null +++ b/app/core/applications/transforms/strIDtoObjectID.js @@ -0,0 +1,16 @@ +'use strict'; + +const _ = require('lodash'); +const {ObjectId} = require('mongorito'); + +module.exports = function (query, keys) { + + if(!_.isEmpty(keys)) { + _.each(keys, (e) => { + if (query.hasOwnProperty(e)) { + query[e] = ObjectId(query[e]); + } + }); + } + return query; +}; diff --git a/app/core/repositories/daos/DBConnector.js b/app/core/repositories/daos/DBConnector.js index 31e94b42..3b5cafd5 100644 --- a/app/core/repositories/daos/DBConnector.js +++ b/app/core/repositories/daos/DBConnector.js @@ -44,8 +44,9 @@ class Dao extends Model { return this[opp](filter, '$addToSet', options); } - updateByPull(filter, options, many = '') { - const opp = `update${many}Factory`; + updateByPull(filter, options) { + const {oUpdater} = options; + const opp = `update${oUpdater||''}Factory`; return this[opp](filter, '$pull', options); } diff --git a/app/inventory/applications/persistenceSystem.js b/app/inventory/applications/persistenceSystem.js index 64444ee4..507f39dd 100644 --- a/app/inventory/applications/persistenceSystem.js +++ b/app/inventory/applications/persistenceSystem.js @@ -5,25 +5,43 @@ const _ = require('lodash'); const PersistenceServices = require('core/services/PersistenceServices'); const PersistenceSystem = require('../services/PersistenceServices'); const notExist = require('core/applications/validator/validNotExist'); +const hateaosTransform = require('core/applications/transforms/hateoasTransform'); const persistenceSystem = (Entity) => (IEntity) => { return { - insertApp(req, res, next) { - - PersistenceServices(Entity) - .findOne(req.params.id, req.user) - .then(notExist) - .then((e) => { - const ids = _.isArray(_.get(req, 'body.id')) ? req.body.id : []; - const system = _.pick(e, 'name', '_id'); - - PersistenceSystem(IEntity) - .addList(ids, {system}, req.user); - }) - .then(e => res.json(e)) - .catch(next); - } + insertApp(req, res, next) { + + PersistenceServices(Entity) + .findOne(req.params.id, req.user) + .then(notExist) + .then((e) => { + const ids = _.isArray(_.get(req, 'body.id')) ? req.body.id : []; + const system = _.pick(e, 'name', '_id'); + + return PersistenceSystem(IEntity) + .addList(ids, {system}, req.user); + }) + .then(hateaosTransform(Entity).singleTransform) + .then(e => res.status(202).json(e)) + .catch(next); + }, + + removeApp(req, res, next) { + + PersistenceServices(Entity) + .findOne(req.params.id, req.user) + .then(notExist) + .then((e) => { + const ids = _.isArray(_.get(req, 'body.id')) ? req.body.id : []; + const system = _.pick(e, 'name', '_id'); + + return PersistenceSystem(IEntity) + .removeList(ids, {system}, req.user); + }) + .then(e => res.status(204).json(e)) + .catch(next); + } }; }; diff --git a/app/inventory/entities/Application.js b/app/inventory/entities/Application.js index 47b07dfa..726a4cd6 100644 --- a/app/inventory/entities/Application.js +++ b/app/inventory/entities/Application.js @@ -12,19 +12,21 @@ const app = () => { const filled = [..._.slice(singleFilled, 3)]; // delete id return { - name: "applications", + name: "applications", - access: 'roles', + access: 'roles', - validators: require('../validators/applications'), + validators: require('../validators/applications'), - dao: Applications, + dao: Applications, - defaults: {family: 'Application'}, + defaults: {family: 'Application'}, - filled, - singleFilled, - resFilled + mapRelations: ['system._id'], + + filled, + singleFilled, + resFilled }; }; diff --git a/app/inventory/entities/Clients.js b/app/inventory/entities/Clients.js index 77ebfa7f..3faa2f97 100644 --- a/app/inventory/entities/Clients.js +++ b/app/inventory/entities/Clients.js @@ -12,17 +12,21 @@ const clients = () => { const filled = [..._.slice(singleFilled, 3)]; // delete id return { - name: "clients", + name: "clients", - access: 'roles', + access: 'roles', - validators: require('../validators/clients'), + validators: require('../validators/clients'), - dao: Clients, + dao: Clients, - filled, - singleFilled, - resFilled + defaults: {}, + + mapRelations: [], + + filled, + singleFilled, + resFilled }; }; diff --git a/app/inventory/entities/Datacenter.js b/app/inventory/entities/Datacenter.js index d2e863be..e5d248d4 100644 --- a/app/inventory/entities/Datacenter.js +++ b/app/inventory/entities/Datacenter.js @@ -12,17 +12,21 @@ const app = () => { const filled = [..._.slice(singleFilled, 3)]; // delete id return { - name: "datacenters", + name: "datacenters", - access: 'roles', + access: 'roles', - validators: require('../validators/datacenters'), + validators: require('../validators/datacenters'), - dao: Datacenters, + dao: Datacenters, - filled, - singleFilled, - resFilled + defaults: {}, + + mapRelations: [], + + filled, + singleFilled, + resFilled }; }; diff --git a/app/inventory/entities/Servers.js b/app/inventory/entities/Servers.js index 7f2b1749..4456cfd9 100644 --- a/app/inventory/entities/Servers.js +++ b/app/inventory/entities/Servers.js @@ -8,22 +8,26 @@ const servers = () => { const resFilled = ['_id', 'updated_at', 'created_at', 'hostname', 'ipv4_private', 'ipv4_public', 'os.base', 'os.dist', 'dc.name', 'dc.zone', 'role', 'environment', 'auth.name', 'auth.username', 'auth.type', 'tags']; const singleFilled = [...resFilled, 'cpu', 'memory', 'storage', 'services', 'dc', 'os', 'auth', 'role', 'environment', - 'roles', 'owner', 'active', 'status']; + 'roles', 'owner', 'active', 'status']; const filled = [..._.slice(singleFilled, 3)]; // delete id return { - name: "servers", + name: "servers", - access: 'roles', + access: 'roles', - validators: require('../validators/servers'), + validators: require('../validators/servers'), - dao: Servers, + dao: Servers, - filled, - singleFilled, - resFilled + defaults: {}, + + mapRelations: [], + + filled, + singleFilled, + resFilled }; }; diff --git a/app/inventory/entities/System.js b/app/inventory/entities/System.js index 72800868..961b5d38 100644 --- a/app/inventory/entities/System.js +++ b/app/inventory/entities/System.js @@ -12,17 +12,21 @@ const system = () => { const filled = [..._.slice(singleFilled, 3)]; // delete id return { - name: "systems", + name: "systems", - access: 'roles', + access: 'roles', - validators: require('../validators/system'), + validators: require('../validators/system'), - dao: System, + dao: System, - filled, - singleFilled, - resFilled + defaults: {}, + + mapRelations: ['clients._id'], + + filled, + singleFilled, + resFilled }; }; diff --git a/app/inventory/routers/system/system.js b/app/inventory/routers/system/system.js index d86abc85..a91ec32e 100644 --- a/app/inventory/routers/system/system.js +++ b/app/inventory/routers/system/system.js @@ -34,5 +34,7 @@ module.exports = function (router) { /** * Applications */ - .patch('/:id/applications', authenticate(), PersistenceSystem.insertApp); + .patch('/:id/applications', authenticate(), PersistenceSystem.insertApp) + + .delete('/:id/applications', authenticate(), PersistenceSystem.removeApp); }; diff --git a/app/inventory/services/PersistenceServices.js b/app/inventory/services/PersistenceServices.js index 59cd8308..9b69d9cb 100644 --- a/app/inventory/services/PersistenceServices.js +++ b/app/inventory/services/PersistenceServices.js @@ -12,21 +12,37 @@ const Persistence = (Entity, FactoryDBRepository = DFactoryDBRepository) => { const DBRepository = FactoryDBRepository(Entity, {oUpdater: 'Many'}); return { - addList (_id, post, owner, access = Access.ROLE_WRITER) { + addList(_id, post, owner, access = Access.ROLE_WRITER) { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { - const prepared = _.assign({}, - accessMergeTransform(owner, Entity.access, {_id}, access) - ); + const prepared = _.assign({}, + accessMergeTransform(owner, Entity.access, {_id}, access) + ); - return DBRepository - .updateByPushUnique(prepared, post) - .then(resolve) - .catch(reject); - }); + return DBRepository + .updateByPushUnique(prepared, post) + .then(resolve) + .catch(reject); + }); - }, + }, + + removeList(_id, post, owner, access = Access.ROLE_WRITER) { + + return new Promise((resolve, reject) => { + + const prepared = _.assign({}, + accessMergeTransform(owner, Entity.access, {_id}, access) + ); + + return DBRepository + .updateByPull(prepared, post) + .then(resolve) + .catch(reject); + }); + + } };