/* https://docs.nestjs.com/providers#services */ import { Injectable } from '@nestjs/common'; import { connectionOptions } from 'src/configs/typeorm.config'; import { Connection } from 'typeorm'; import { IndexActions } from '../../domain/models/index-action.model'; @Injectable() export class AccessControlService { async getAccessModule(id: number) { const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); try { const sql = 'SELECT ESTACESSOMODULO.CODMODULO as "moduleId" ' + ' ,ESTACESSOMODULO.CODUSUARIO as "userId" ' + ` ,NVL(ESTACESSOMODULO.ACESSO, 'S') as "access" ` + ' FROM ESTACESSOMODULO ' + ' WHERE ESTACESSOMODULO.CODUSUARIO = :1'; const modules = await queryRunner .query(sql, [id]); return modules; } finally { await queryRunner.release(); await connection.close(); } } async getPagesUser(moduleId: number, userId: number) { const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); try { const sql = 'SELECT ESTACESSOATIVIDADE.CODMODULO as "moduleId" ' + ' ,ESTACESSOATIVIDADE.CODPROCESSO as "processId" ' + ' ,ESTACESSOATIVIDADE.CODATIVIDADE as "pageId" ' + ' ,ESTACESSOATIVIDADE.codusuario as "userId" ' + ' ,ESTACESSOATIVIDADE.ACESSO as "access" ' + ' FROM ESTACESSOATIVIDADE ' + ' WHERE ESTACESSOATIVIDADE.CODMODULO = :CODMODULO ' + ' AND ESTACESSOATIVIDADE.CODUSUARIO = :CODUSUARIO '; const pages = await queryRunner .query(sql, [moduleId, userId]); return pages; } finally { await queryRunner.release(); await connection.close(); } } async getActionsUser(moduleId: number, userId: number) { const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); try { const sql = `SELECT ESTACESSOATIVIDADEACAO.CODMODULO as "moduleId" ,ESTACESSOATIVIDADEACAO.CODPROCESSO as "processId" ,ESTACESSOATIVIDADEACAO.CODATIVIDADE as "pageId" ,ESTACESSOATIVIDADEACAO.CODACAO as "actionId" ,ESTACESSOATIVIDADEACAO.codusuario as "userId" ,ESTACESSOATIVIDADEACAO.ACESSO as "access" FROM ESTACESSOATIVIDADEACAO WHERE ESTACESSOATIVIDADEACAO.CODMODULO = :CODMODULO AND ESTACESSOATIVIDADEACAO.CODUSUARIO = :CODUSUARIO`; const actions = await queryRunner .query(sql, [moduleId, userId]); return actions; } finally { await queryRunner.release(); await connection.close(); } } async getPermissionsUser(userId: number) { const sqlModules = `SELECT ESTMODULO.codmodulo as "id" ,ESTMODULO.descricao as "text" ,${userId} as "userId" ,NVL(( SELECT ESTACESSOMODULO.ACESSO FROM ESTACESSOMODULO WHERE ESTACESSOMODULO.CODMODULO = ESTMODULO.CODMODULO AND ESTACESSOMODULO.CODUSUARIO = ${userId} AND ROWNUM = 1),'N') as "allow" FROM ESTMODULO`; const sqlAtividade = `SELECT ESTATIVIDADE.codmodulo as "moduloId" ,ESTATIVIDADE.CODPROCESSO as "processId" ,ESTATIVIDADE.CODATIVIDADE as "id" ,ESTATIVIDADE.descricao as "text" ,NVL(( SELECT ESTACESSOATIVIDADE.ACESSO FROM ESTACESSOATIVIDADE WHERE ESTACESSOATIVIDADE.CODMODULO = ESTATIVIDADE.CODMODULO AND ESTACESSOATIVIDADE.CODPROCESSO = ESTATIVIDADE.codprocesso AND ESTACESSOATIVIDADE.CODATIVIDADE = ESTATIVIDADE.CODATIVIDADE AND ESTACESSOATIVIDADE.CODUSUARIO = ${userId} AND ROWNUM = 1),'N') as "allow" FROM ESTATIVIDADE`; const sqlAction = `SELECT estatividadeacao.codmodulo as "moduloId" ,estatividadeacao.CODPROCESSO as "processId" ,estatividadeacao.CODATIVIDADE as "atividadeId" ,estatividadeacao.CODACAO as "Id" ,estatividadeacao.descricao as "text" ,NVL(( SELECT ESTACESSOATIVIDADEACAO.ACESSO FROM ESTACESSOATIVIDADEACAO WHERE ESTACESSOATIVIDADEACAO.CODMODULO = estatividadeacao.CODMODULO AND ESTACESSOATIVIDADEACAO.CODPROCESSO = estatividadeacao.codprocesso AND ESTACESSOATIVIDADEACAO.CODATIVIDADE = estatividadeacao.CODATIVIDADE AND ESTACESSOATIVIDADEACAO.CODACAO = estatividadeacao.CODACAO AND ESTACESSOATIVIDADEACAO.CODUSUARIO = ${userId} AND ROWNUM = 1),'N') as "allow" FROM estatividadeacao`; const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); try { const modules = await queryRunner.query(sqlModules); const atividades = await queryRunner.query(sqlAtividade); const actions = await queryRunner.query(sqlAction); console.log("acoes:" + JSON.stringify(actions)); console.log("atividaes:" + JSON.stringify(atividades)); const arrayAtividade = []; atividades.map((atividade) => { const data = { ...atividade, items: [...actions.filter((a) => a.moduloId == atividade.moduloId && a.processId == atividade.processId && a.atividadeId == atividade.id)] } arrayAtividade.push(data); }); console.log("atividade acao: " + JSON.stringify(arrayAtividade)); const arrayModules = []; modules.map((module) => { const data = { ...module, items: [...arrayAtividade.filter((a) => a.moduloId == module.id)] } arrayModules.push(data); }); return arrayModules; } finally { await queryRunner.release(); await connection.close(); } } async updatePermissionUser(userId: number, data: any) { console.log(JSON.stringify(data)); const connection = new Connection(connectionOptions); await connection.connect(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); await queryRunner.startTransaction(); try { const sqlDeletePermissionUser = `BEGIN DELETE FROM ESTACESSOMODULO WHERE CODUSUARIO = ${userId}; DELETE FROM ESTACESSOATIVIDADE WHERE CODUSUARIO = ${userId}; DELETE FROM ESTACESSOATIVIDADEACAO WHERE CODUSUARIO = ${userId}; END; `; await queryRunner.query(sqlDeletePermissionUser); for (const action of data.actions) { const sqlCreatePermissionAction = `BEGIN UPDATE ESTACESSOATIVIDADEACAO SET ACESSO = 'S' WHERE CODMODULO = ${action.moduloId} AND CODPROCESSO = ${action.processId} AND CODATIVIDADE = ${action.atividadeId} AND CODACAO = ${action.Id} AND CODUSUARIO = ${userId}; IF SQL%ROWCOUNT = 0 THEN INSERT INTO ESTACESSOATIVIDADEACAO ( CODMODULO, CODPROCESSO, CODATIVIDADE, CODACAO, CODUSUARIO, ACESSO ) VALUES ( ${action.moduloId}, ${action.processId}, ${action.atividadeId}, ${action.Id}, ${userId},'S'); END IF; UPDATE ESTACESSOATIVIDADE SET ACESSO = 'S' WHERE CODMODULO = ${action.moduloId} AND CODPROCESSO = ${action.processId} AND CODATIVIDADE = ${action.atividadeId} AND CODUSUARIO = ${userId}; IF SQL%ROWCOUNT = 0 THEN INSERT INTO ESTACESSOATIVIDADE ( CODMODULO, CODPROCESSO, CODATIVIDADE, CODUSUARIO, ACESSO ) VALUES ( ${action.moduloId}, ${action.processId}, ${action.atividadeId}, ${userId},'S'); END IF; UPDATE ESTACESSOMODULO SET ACESSO = 'S' WHERE CODMODULO = ${action.moduloId} AND CODUSUARIO = ${userId}; IF SQL%ROWCOUNT = 0 THEN INSERT INTO ESTACESSOMODULO ( CODMODULO, CODUSUARIO, ACESSO ) VALUES ( ${action.moduloId}, ${userId}, 'S'); END IF; END; ` await queryRunner.query(sqlCreatePermissionAction); } for (const atividade of data.atividades) { const sqlCreatePermissionAtividade = `BEGIN UPDATE ESTACESSOATIVIDADE SET ACESSO = 'S' WHERE CODMODULO = ${atividade.moduloId} AND CODPROCESSO = ${atividade.processId} AND CODATIVIDADE = ${atividade.id} AND CODUSUARIO = ${userId}; IF SQL%ROWCOUNT = 0 THEN INSERT INTO ESTACESSOATIVIDADE ( CODMODULO, CODPROCESSO, CODATIVIDADE, CODUSUARIO, ACESSO ) VALUES ( ${atividade.moduloId}, ${atividade.processId}, ${atividade.id}, ${userId},'S'); END IF; UPDATE ESTACESSOMODULO SET ACESSO = 'S' WHERE CODMODULO = ${atividade.moduloId} AND CODUSUARIO = ${userId}; IF SQL%ROWCOUNT = 0 THEN INSERT INTO ESTACESSOMODULO ( CODMODULO, CODUSUARIO, ACESSO ) VALUES ( ${atividade.moduloId}, ${userId},'S'); END IF; END; `; await queryRunner.query(sqlCreatePermissionAtividade); } await queryRunner.commitTransaction(); } catch (err) { await queryRunner.rollbackTransaction(); console.log(err); } finally { await queryRunner.release(); await connection.close(); } } }