UNPKG

tuain-ecosystem-lib

Version:

Servicio de gestión mensajería instantanea de la plataforma Tuain

474 lines (447 loc) 20.7 kB
const { ObjectId } = require('mongodb'); const { dbQueries: { environment: envQueries }, collections: { environments: environmentsColl, ecosystemRoles: ecosystemRolesColl, roleRelations: roleRelationsColl, }, } = require('../../config'); const ENV_SEARCH_FIELDS = ['name', 'description']; const ROLE_SEARCH_FIELDS = ['name', 'description']; const modErrs = { findEnv: { notFound: ['01', 'No se encontraron environments que se ajusten a la búsqueda'], }, createEnv: { alreadyExist: ['01', 'Environments ya existe'], }, modifyEnv: { alreadyActive: ['01', 'Environments ya está activo'], alreadyInactive: ['02', 'Environments ya está inactivo'], }, findRole: { notFound: ['01', 'No se encontraron roles que se ajusten a la búsqueda'], }, createRole: { alreadyExist: ['01', 'Rol ya existe'], }, modifyRole: { alreadyActive: ['01', 'Rol ya está activo'], alreadyInactive: ['02', 'Rol ya está inactivo'], }, findRelation: { notFound: ['01', 'No se encontraron relaciones que se ajusten a la búsqueda'], }, createRelation: { alreadyExist: ['01', 'Relación ya existe'], }, modifyRelation: { alreadyActive: ['01', 'Relación actualmente está activa'], alreadyInactive: ['01', 'Relación ya está inactiva'], }, }; class EnvironmentManager { constructor(getDb, logger, errMgr, options) { this.options = options; this.getDb = getDb; this.logger = logger; this.errMgr = errMgr; this.errMgr.addModuleSet('lib-environment', modErrs); } // eslint-disable-next-line no-unused-vars async getEnvironments(reqData = null, constraints = null) { const envsCol = this.getDb().collection(environmentsColl); const envsList = await envsCol.find(envQueries.findByAttributes(constraints, ENV_SEARCH_FIELDS)); const environments = (envsList) ? await envsList.toArray() : null; if (!environments || environments.length < 1) { const errorObj = this.errMgr.get(modErrs.findEnv.notFound); return [errorObj, null]; } return [null, { environments }]; } async getEnvironment(reqData) { const { environmentId } = reqData; const envsCol = this.getDb().collection(environmentsColl); const envDetail = await envsCol.findOne(envQueries.findById(environmentId)); if (!envDetail) { const errorDetail = `Environment con Id ${environmentId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findEnv.notFound, errorDetail); return [errorObj, null]; } return [null, envDetail]; } async createEnvironment(envData) { const { name } = envData; const envsCol = this.getDb().collection(environmentsColl); const envDetail = await envsCol.findOne(envQueries.findByName(name)); if (envDetail) { const errorDetail = `Environment ${name} ya existe`; const errorObj = this.errMgr.get(modErrs.createEnv.alreadyExist, errorDetail); return [errorObj, null]; } const newEnvData = { ...envData, enabled: false, creation: new Date() }; const actionResult = await envsCol.insertOne(newEnvData); this.logger.debug(`Creación de un nuevo ambiente ${newEnvData} con resultado ${actionResult?.insertedId}`); return [null, { environmentId: actionResult?.insertedId }]; } async modifyEnvironment(reqData) { const { environmentId } = reqData; const envsCol = this.getDb().collection(environmentsColl); const envDetail = await envsCol.findOne(envQueries.findById(environmentId)); if (!envDetail) { const errorDetail = `Environment con Id ${environmentId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findEnv.notFound, errorDetail); return [errorObj, null]; } if (envDetail.enabled) { const errorDetail = `Environment con Id ${environmentId} activo`; const errorObj = this.errMgr.get(modErrs.modifyEnv.alreadyActive, errorDetail); return [errorObj, null]; } const updateData = { ...reqData }; delete updateData.environmentId; const actionResult = await envsCol.updateOne(envQueries.findById(environmentId), envQueries.updateObj(updateData)); const result = actionResult?.result?.nModified > 0; this.logger.debug(`Modificación de un ambiente ${updateData} con resultado ${result}`); return [null, { result }]; } async activateEnvironment(reqData) { const { environmentId } = reqData; const envsCol = this.getDb().collection(environmentsColl); const envDetail = await envsCol.findOne(envQueries.findById(environmentId)); if (!envDetail) { const errorDetail = `Environment con Id ${environmentId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findEnv.notFound, errorDetail); return [errorObj, null]; } if (envDetail.enabled) { const errorDetail = `Environment con Id ${environmentId} actualmente activo`; const errorObj = this.errMgr.get(modErrs.modifyEnv.alreadyActive, errorDetail); return [errorObj, null]; } const actionResult = await envsCol.updateOne(envQueries.findById(environmentId), envQueries.updateObj({ enabled: true })); const result = actionResult?.result?.nModified > 0; this.logger.debug(`Activación del ambiente ${environmentId} con resultado ${result}`); return [null, { result }]; } async inactivateEnvironment(reqData) { const { environmentId } = reqData; const envsCol = this.getDb().collection(environmentsColl); const envDetail = await envsCol.findOne(envQueries.findById(environmentId)); if (!envDetail) { const errorDetail = `Environment con Id ${environmentId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findEnv.notFound, errorDetail); return [errorObj, null]; } if (!envDetail.enabled) { const errorDetail = `Environment con Id ${environmentId} actualmente inactivo`; const errorObj = this.errMgr.get(modErrs.modifyEnv.alreadyInactive, errorDetail); return [errorObj, null]; } const actionResult = await envsCol.updateOne(envQueries.findById(environmentId), envQueries.updateObj({ enabled: false })); const result = actionResult?.result?.nModified > 0; this.logger.debug(`Activación del ambiente ${environmentId} con resultado ${result}`); return [null, { result }]; } async deleteEnvironment(reqData) { const { environmentId } = reqData; const envsCol = this.getDb().collection(environmentsColl); const envDetail = await envsCol.findOne(envQueries.findById(environmentId)); if (!envDetail) { const errorDetail = `Environment con Id ${environmentId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findEnv.notFound, errorDetail); return [errorObj, null]; } if (envDetail.enabled) { const errorDetail = `Environment con Id ${environmentId} actualmente activo`; const errorObj = this.errMgr.get(modErrs.modifyEnv.alreadyActive, errorDetail); return [errorObj, null]; } const actionResult = await envsCol.deleteOne(envQueries.findById(environmentId)); this.logger.debug(`Eliminación del ambiente ${environmentId} con resultado ${actionResult?.result?.n}`); const result = actionResult?.result?.n > 0; return [null, { result }]; } /** * Funciones de manejo de roles de un environment */ async getRoles(reqData, constraints = null) { const { environmentId } = reqData; const rolesCol = this.getDb().collection(ecosystemRolesColl); const rolesList = await rolesCol.find(envQueries.findRoles(environmentId, constraints, ROLE_SEARCH_FIELDS)); const roles = (rolesList) ? await rolesList.toArray() : null; if (!roles || roles.length < 1) { const errorObj = this.errMgr.get(modErrs.findRole.notFound); return [errorObj, null]; } return [null, { roles }]; } async getRole(reqData) { const { roleId } = reqData; const rolesCol = this.getDb().collection(ecosystemRolesColl); const [roleDetail] = await rolesCol.aggregate(envQueries.findRole(roleId)).toArray(); if (!roleDetail) { const errorDetail = `Rol con Id ${roleId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findRole.notFound, errorDetail); return [errorObj, null]; } return [null, roleDetail]; } async createRole(roleData) { const { environmentId, name } = roleData; const envsCol = this.getDb().collection(environmentsColl); const envDetail = await envsCol.findOne(envQueries.findById(environmentId)); if (!envDetail) { const errorDetail = `Environment con Id ${environmentId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findEnv.notFound, errorDetail); return [errorObj, null]; } const rolesCol = this.getDb().collection(ecosystemRolesColl); const roleDetail = await rolesCol.findOne(envQueries.findRoleByName(environmentId, name)); if (roleDetail) { const errorDetail = `Rol ${name} ya existe en environmentId ${environmentId}`; const errorObj = this.errMgr.get(modErrs.createRole.alreadyExist, errorDetail); return [errorObj, null]; } delete roleData.environmentId; const newRoleData = { ...roleData, environmentId: ObjectId(environmentId), enabled: false, creation: new Date(), }; const actionResult = await rolesCol.insertOne(newRoleData); this.logger.debug(`Creación de un nuevo rol ${newRoleData} con resultado ${actionResult?.insertedId}`); return [null, { roleId: actionResult?.insertedId }]; } async modifyRole(reqData) { const { roleId } = reqData; const rolesCol = this.getDb().collection(ecosystemRolesColl); const roleDetail = await rolesCol.findOne(envQueries.findById(roleId)); if (!roleDetail) { const errorDetail = `Rol con Id ${roleId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findRole.notFound, errorDetail); return [errorObj, null]; } const updateData = { ...reqData }; delete updateData.roleId; if (updateData.environmentId) { updateData.environmentId = ObjectId(updateData.environmentId); } const actionResult = await rolesCol.updateOne(envQueries.findById(roleId), envQueries.updateObj(updateData)); const result = actionResult?.result?.nModified > 0; this.logger.debug(`Modificación de rol ${updateData} con resultado ${result}`); return [null, { result }]; } async activateRole(reqData) { const { roleId } = reqData; const rolesCol = this.getDb().collection(ecosystemRolesColl); const roleDetail = await rolesCol.findOne(envQueries.findById(roleId)); if (!roleDetail) { const errorDetail = `Role con Id ${roleId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findRole.notFound, errorDetail); return [errorObj, null]; } if (roleDetail.enabled) { const errorDetail = `Rol con Id ${roleId} actualmente activo`; const errorObj = this.errMgr.get(modErrs.modifyRole.alreadyActive, errorDetail); return [errorObj, null]; } const actionResult = await rolesCol.updateOne(envQueries.findById(roleId), envQueries.updateObj({ enabled: true })); const result = actionResult?.result?.nModified > 0; this.logger.debug(`Activación del rol ${roleId} con resultado ${result}`); return [null, { result }]; } async inactivateRole(reqData) { const { roleId } = reqData; const rolesCol = this.getDb().collection(ecosystemRolesColl); const roleDetail = await rolesCol.findOne(envQueries.findById(roleId)); if (!roleDetail) { const errorDetail = `Rol con Id ${roleId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findRole.notFound, errorDetail); return [errorObj, null]; } if (!roleDetail.enabled) { const errorDetail = `Rol con Id ${roleId} actualmente inactivo`; const errorObj = this.errMgr.get(modErrs.modifyRole.alreadyInactive, errorDetail); return [errorObj, null]; } const actionResult = await rolesCol.updateOne(envQueries.findById(roleId), envQueries.updateObj({ enabled: false })); const result = actionResult?.result?.nModified > 0; this.logger.debug(`Inactivación del rol ${roleId} con resultado ${result}`); return [null, { result }]; } async deleteRole(reqData) { const { roleId } = reqData; const rolesCol = this.getDb().collection(ecosystemRolesColl); const roleDetail = await rolesCol.findOne(envQueries.findById(roleId)); if (!roleDetail) { const errorDetail = `Role con Id ${roleId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findRole.notFound, errorDetail); return [errorObj, null]; } if (roleDetail.enabled) { const errorDetail = `Rol con Id ${roleId} actualmente activo`; const errorObj = this.errMgr.get(modErrs.modifyRole.alreadyActive, errorDetail); return [errorObj, null]; } const actionResult = await rolesCol.deleteOne(envQueries.findById(roleId)); const result = actionResult?.result?.n > 0; this.logger.debug(`Eliminación del rol ${roleId} con resultado ${result}`); return [null, { result }]; } async getRoleRelations(reqData) { const { environmentId, relationIds } = reqData; const envsCol = this.getDb().collection(environmentsColl); if (environmentId) { const envDetail = await envsCol.findOne(envQueries.findById(environmentId)); if (!envDetail) { const errorDetail = `Environment con Id ${environmentId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findEnv.notFound, errorDetail); return [errorObj, null]; } } const relationsCol = this.getDb().collection(roleRelationsColl); const relationList = await relationsCol.find(envQueries .findRoleRelations(environmentId, relationIds)).toArray(); return [null, relationList]; } async getRoleRelation(reqData) { const { relationId } = reqData; const relationsCol = this.getDb().collection(roleRelationsColl); const relationDetail = await relationsCol.findOne(envQueries.findById(relationId)); if (!relationDetail) { const errorDetail = `Relación con Id ${relationId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findRelation.notFound, errorDetail); return [errorObj, null]; } return [null, relationDetail]; } async createRoleRelation(roleRelationData) { const { environmentId, name, primaryRoleId, secondaryRoleId } = roleRelationData; const relationsCol = this.getDb().collection(roleRelationsColl); const relationDetail = await relationsCol.findOne(envQueries.findRoleByName(environmentId.name)); if (relationDetail) { const errorDetail = `Relación con nombre ${name} ya existe en entorno ${environmentId}`; const errorObj = this.errMgr.get(modErrs.createRelation.alreadyExist, errorDetail); return [errorObj, null]; } const rolesCol = this.getDb().collection(ecosystemRolesColl); const primaryRoleDetail = await rolesCol.findOne(envQueries.findById(primaryRoleId)); const secondaryRoleIdDetail = await rolesCol.findOne(envQueries.findById(secondaryRoleId)); if (!primaryRoleDetail) { const errorDetail = `Role con Id ${primaryRoleId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findRole.notFound, errorDetail); return [errorObj, null]; } if (primaryRoleDetail.environmentId !== environmentId) { const errorDetail = `Role con Id ${primaryRoleId} no pertenece al mismo entorno ${environmentId}`; const errorObj = this.errMgr.get(modErrs.findRole.notFound, errorDetail); return [errorObj, null]; } if (!secondaryRoleIdDetail) { const errorDetail = `Role con Id ${secondaryRoleId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findRole.notFound, errorDetail); return [errorObj, null]; } if (secondaryRoleIdDetail.environmentId !== environmentId) { const errorDetail = `Role con Id ${secondaryRoleId} no pertenece al mismo entorno ${environmentId}`; const errorObj = this.errMgr.get(modErrs.findRole.notFound, errorDetail); return [errorObj, null]; } const newRelationData = { ...roleRelationData, enabled: false, creation: new Date() }; const actionResult = await relationsCol.insertOne(newRelationData); this.logger.debug(`Creación de una nueva relación ${newRelationData} con resultado ${actionResult?.insertedId}`); return [null, { environmentId: actionResult?.insertedId }]; } async modifyRoleRelation(reqData) { const { relationId } = reqData; const relationsCol = this.getDb().collection(roleRelationsColl); const relationDetail = await relationsCol.findOne(envQueries.findById(relationId)); if (!relationDetail) { const errorDetail = `Relación con Id ${relationId} no encontrada`; const errorObj = this.errMgr.get(modErrs.findRelation.notFound, errorDetail); return [errorObj, null]; } if (relationDetail.enabled) { const errorDetail = `Relación con Id ${relationId} está activa`; const errorObj = this.errMgr.get(modErrs.modifyRelation.alreadyActive, errorDetail); return [errorObj, null]; } const updateData = { ...reqData }; delete updateData.relationId; const actionResult = await relationsCol.updateOne(envQueries.findById(relationId), envQueries.updateObj(updateData)); const result = actionResult?.result?.nModified > 0; this.logger.debug(`Modificación de una rleación ${updateData} con resultado ${result}`); return [null, { result }]; } async activateRoleRelation(reqData) { const { relationId } = reqData; const relationsCol = this.getDb().collection(roleRelationsColl); const relationDetail = await relationsCol.findOne(envQueries.findById(relationId)); if (!relationDetail) { const errorDetail = `Relación con Id ${relationId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findRelation.notFound, errorDetail); return [errorObj, null]; } if (relationDetail.enabled) { const errorDetail = `Relación con Id ${relationId} actualmente activo`; const errorObj = this.errMgr.get(modErrs.modifyRelation.alreadyActive, errorDetail); return [errorObj, null]; } const actionResult = await relationsCol.updateOne(envQueries.findById(relationId), envQueries.updateObj({ enabled: true })); const result = actionResult?.result?.nModified > 0; this.logger.debug(`Activación de la relación ${relationId} con resultado ${result}`); return [null, { result }]; } async inactivateRoleRelation(reqData) { const { relationId } = reqData; const relationsCol = this.getDb().collection(roleRelationsColl); const relationDetail = await relationsCol.findOne(envQueries.findById(relationId)); if (!relationDetail) { const errorDetail = `Relación con Id ${relationId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findRelation.notFound, errorDetail); return [errorObj, null]; } if (!relationDetail.enabled) { const errorDetail = `Relación con Id ${relationId} actualmente inactivo`; const errorObj = this.errMgr.get(modErrs.modifyRelation.alreadyInactive, errorDetail); return [errorObj, null]; } const actionResult = await relationsCol.updateOne(envQueries.findById(relationId), envQueries.updateObj({ enabled: false })); const result = actionResult?.result?.nModified > 0; this.logger.debug(`Inactivación de la relación ${relationId} con resultado ${result}`); return [null, { result }]; } async deleteRoleRelation(reqData) { const { relationId } = reqData; const relationsCol = this.getDb().collection(roleRelationsColl); const relationDetail = await relationsCol.findOne(envQueries.findById(relationId)); if (!relationDetail) { const errorDetail = `Relación con Id ${relationId} no encontrado`; const errorObj = this.errMgr.get(modErrs.findRelation.notFound, errorDetail); return [errorObj, null]; } if (relationDetail.enabled) { const errorDetail = `Relación con Id ${relationId} actualmente activa`; const errorObj = this.errMgr.get(modErrs.modifyRelation.alreadyActive, errorDetail); return [errorObj, null]; } const actionResult = await relationsCol.deleteOne(envQueries.findById(relationId)); const result = actionResult?.result?.n > 0; this.logger.debug(`Eliminación de la relación ${relationId} con resultado ${result}`); return [null, { result }]; } } module.exports = EnvironmentManager;