...
 
Commits (5)
const permisos = {
'/usuarios': {
ADMINISTRADOR: ['POST', 'GET', 'PATCH'],
},
'/accesos': {
ADMINISTRADOR: ['PATCH'],
ENTIDAD: ['PATCH'],
},
'/usuarios/[a-zA-Z0-9]+': {
ADMINISTRADOR: ['POST', 'GET', 'PATCH'],
},
'/usuarios/[a-zA-Z0-9]+/cuentas': {
ADMINISTRADOR: ['PATCH'],
ENTIDAD: ['PATCH'],
},
'/entidades': {
ADMINISTRADOR: ['GET', 'POST'],
ENTIDAD: ['GET'],
},
'/entidades/cuentas': {
ADMINISTRADOR: ['GET'],
ENTIDAD: ['GET'],
},
'/entidades/[0-9]+': {
ADMINISTRADOR: ['PATCH', 'GET'],
},
'/entidades/[0-9]+/tramites': {
ENTIDAD: ['GET', 'POST'],
},
'/entidades/[0-9]+/tramites/[0-9]+': {
ENTIDAD: ['PATCH', 'GET'],
},
'/entidades/[0-9]+/cuentas': {
ADMINISTRADOR: ['GET', 'POST'],
ENTIDAD: ['GET', 'POST'],
},
'/entidades/[0-9]+/cuentas/[0-9]+': {
ADMINISTRADOR: ['PATCH', 'GET'],
ENTIDAD: ['GET', 'PATCH'],
},
'/usuariosAplicacion': {
ADMINISTRADOR: ['GET', 'POST', 'PATCH'],
ENTIDAD: ['GET'],
},
'/usuariosAplicacion/[0-9]+': {
ADMINISTRADOR: ['GET', 'POST', 'PATCH'],
ENTIDAD: ['GET'],
},
'/codigosPagoTramites': {
ENDPOINT: ['POST'],
ADMINISTRADOR: ['GET'],
ENTIDAD: ['GET'],
},
'/entidades/[0-9]+/tramites/[0-9]+/token': {
ENTIDAD: ['POST'],
},
'/entidades/[0-9]+/tramites/[0-9]+/token/[0-9]+': {
ENTIDAD: ['PATCH'],
},
'/codigosPagoTramites/[0-9]+': {
ADMINISTRADOR: ['GET'],
ENTIDAD: ['GET'],
ENDPOINT: ['GET', 'PATCH'],
},
'/codigosPagoTramites/movimientos/[0-9|-]+': {
ENTIDAD: ['GET'],
},
'/tramites': {
ENDPOINT: ['GET'],
},
};
module.exports = permisos;
\ No newline at end of file
......@@ -12,6 +12,8 @@ const genFecha = moment().tz('America/La_Paz');
const jwt = require("jwt-simple");
const helmet = require('helmet');
//permisos
const permisos = require('./permisos')
module.exports = app => {
......@@ -46,7 +48,6 @@ module.exports = app => {
// Para poder subir archivos.
app.use(fileupload());
// Permite la visualizacion de los test, en entornos distintos a produccion.
app.use((req, res, next) => {
res.locals.showTests = app.get('env') !== 'production' &&
......@@ -286,7 +287,8 @@ module.exports = app => {
});
}
//permisos middleware
app.use(permisos);
......
const permisos = require('./permisos_apis');
function obtenerPermiso(ruta, rolesUsuario, verboHttp) {
// verificar que ruta existe
if (permisos[ruta] === undefined) return false;
// verificar que algun rol existe
let respu1 = false;
for(let rolUsuario of rolesUsuario) {
if (Object.keys(permisos[ruta]).indexOf(rolUsuario.rol.nombre) !== -1) {
respu1 = true;
break
}
}
if(!respu1) return false;
// verificar que el verbo existe
let respu2 = false;
for (let rolUsuario of rolesUsuario) {
if (permisos[ruta][rolUsuario.rol.nombre].indexOf(verboHttp) !== -1) {
respu2 = true;
break;
}
}
return respu2;
}
function verificarPermiso (rolUsuario, rutaParam, verboHttp) {
try {
let ruta = rutaParam;
ruta = (ruta.split('?'))[0];
let posiblesLlaves = Object.keys(permisos).filter(el => el.startsWith(ruta));
if (posiblesLlaves.length === 0) {
posiblesLlaves = Object.keys(permisos).filter(x => new RegExp(`^${x}$`).test(ruta))
}
console.log('------posiblesLlaves ', posiblesLlaves);
return obtenerPermiso(posiblesLlaves[0], rolUsuario, verboHttp);
} catch (error) {
console.log('--- erro ', error);
return error;
}
}
module.exports = (req, res, next) => {
console.log('----- req.body ', req.body);
console.log('----- req.path ', req.path);
console.log('----- req.method ', req.method);
if (req.path === '/autenticar') return next();
return Promise.resolve()
.then(() => verificarPermiso(req.body.audit_usuario.roles, req.path, req.method))
.then((tienePermiso) => {
if (!tienePermiso) {
return res.status(403).json({error: 'No tiene permiso para acceder a esta ruta.'});
}
next();
})
.catch((err) => {
next(err);
});
};
\ No newline at end of file
const permisos = {
// GET
'/api/v1/presupuesto/resumen/': {
ADMIN: ['GET']
},
'/api/v1/presupuesto/partidas/': {
ADMIN: ['GET']
},
'/api/v1/presupuesto/saldos/': {
ADMIN: ['GET']
},
'/api/v1/presupuesto/gestiones/': {
ADMIN: ['GET']
},
'/api/v1/presupuesto/pagado/': {
ADMIN: ['GET']
},
'/api/v1/presupuesto/comprometido/': {
ADMIN: ['GET']
},
'/api/v1/presupuesto/pdf/': {
ADMIN: ['POST']
},
'/api/v1/notificacion/conf_notificacion/': {},
'/api/v1/seguridad/menu/[0-9]+/': {
ADMIN: ['GET', 'PUT', 'DELETE'],
JEFE: ['GET']
},
'/api/v1/seguridad/menu/': {
ADMIN: ['GET', 'POST'],
JEFE: ['GET', 'POST']
},
'/api/v1/seguridad/virtual/todos/': {
ADMIN: ['GET'],
JEFE: ['GET']
},
'/api/v1/seguridad/virtual/': {
ADMIN: ['GET'],
JEFE: ['GET']
},
'/api/v1/seguridad/virtual/cambiar/[a-zA-Z0-9]+/': {
ADMIN: ['GET'],
JEFE: ['GET']
},
'/api/v1/seguridad/virtual/verificar/': {
ADMIN: ['GET'],
JEFE: ['GET']
},
'/api/v1/seguridad/usuario/': {
ADMIN: ['GET', 'POST']
},
'/api/v1/seguridad/usuario/catalogo/': {
ADMIN: ['GET']
},
'/api/v1/seguridad/usuario_rol/': {
ADMIN: ['GET']
},
'/api/v1/seguridad/usuario/[0-9]+/': {
ADMIN: ['GET', 'PUT', 'DELETE']
},
'/api/v1/seguridad/usuario/[0-9]+/informacion/': {
ADMIN: ['GET']
},
'/api/v1/seguridad/usuario_unidad/[a-zA-Z0-9]+/': {
ADMIN: ['GET']
},
'/api/v1/seguridad/rol/[0-9]+/': {
ADMIN: ['GET', 'PUT', 'DELETE'],
JEFE: ['GET']
},
'/api/v1/seguridad/rol/': {
ADMIN: ['GET', 'POST'],
JEFE: ['GET']
},
'/api/v1/seguridad/unidad/': {
ADMIN: ['GET'],
JEFE: ['GET']
},
'/api/v1/salir/': {},
'/api/v1/monitoreo/pendientes/': {},
'/api/v1/monitoreo/estados/': {},
'/api/v1/monitoreo/global/': {},
'/api/v1/monitoreo/usuario/': {},
'/api/v1/monitoreo/documento/': {},
'/api/v1/monitoreo/[0-9]+/documento/': {},
'/api/v1/monitoreo/monitor/[0-9]+/': {},
'/api/v1/monitoreo/monitor/': {},
'/api/v1/activos/consulta/': {},
'/api/v1/activos/consulta/usuario/[a-zA-Z0-9]+/': {},
'/api/v1/almacen/consulta/': {},
'/api/v1/almacen/proveedor/': {},
'/api/v1/historialFlujo/[0-9]+/ultimo/': {},
'/api/v1/historialFlujo/[0-9]+/': {},
'/api/v1/historialFlujo/[0-9]+/proceso/': {},
'/api/v1/plantillasFormly/contactos/': {
CONTACTOS: ['GET']
},
'/api/v1/plantillasFormly/contactos/tiposEntidad/': {
CONTACTOS: ['GET']
},
'/api/v1/plantillasFormly/contacto/': {
CONTACTOS: ['GET', 'POST']
},
'/api/v1/plantillasFormly/contacto/[0-9]+/': {
CONTACTOS: ['GET', 'POST']
},
'/api/v1/plantillasFormly/plantilla_formly/[0-9]+/': {
ADMIN: ['GET', 'PUT', 'DELETE'],
CONFIGURADOR: ['GET', 'PUT', 'DELETE']
},
'/api/v1/plantillasFormly/plantilla_formly/abreviacion/[a-zA-Z0-9]+/': {
ADMIN: ['GET'],
CONFIGURADOR: ['GET']
},
'/api/v1/plantillasFormly/plantilla_formly/': {
ADMIN: ['POST', 'GET']
},
'/api/v1/plantillasFormly/catalogo/[0-9]+/': {
JEFE: ['GET', 'PUT'],
OPERADOR: ['GET', 'PUT'],
SECRETARIA: ['GET', 'PUT'],
},
'/api/v1/plantillasFormly/catalogo/[0-9]+/miscatalogos/': {
JEFE: ['GET', 'DELETE'],
OPERADOR: ['GET', 'DELETE'],
SECRETARIA: ['GET', 'DELETE'],
},
'/api/v1/plantillasFormly/catalogo/[0-9]+/compartidos/': {
JEFE: ['GET'],
OPERADOR: ['GET'],
SECRETARIA: ['GET'],
},
'/api/v1/documento/firmar/': {
JEFE: ['GET', 'POST'],
OPERADOR: ['GET', 'POST'],
SECRETARIA: ['GET', 'POST'],
CORRESPONDENCIA: ['GET', 'POST'],
},
'/api/v1/documento/firmado/[0-9]+/': {
JEFE: ['GET'],
OPERADOR: ['GET'],
SECRETARIA: ['GET'],
CORRESPONDENCIA: ['GET'],
},
'/api/v1/plantillasFormly/documento/[0-9]+/': {
ADMIN: ['GET', 'PUT'],
JEFE: ['GET', 'PUT'],
OPERADOR: ['GET', 'PUT'],
SECRETARIA: ['GET', 'PUT'],
CONFIGURADOR: ['GET', 'PUT'],
CORRESPONDENCIA: ['GET', 'PUT'],
},
'/api/v1/plantillasFormly/documento/': {
ADMIN: ['GET', 'POST'],
JEFE: ['GET', 'POST'],
OPERADOR: ['GET', 'POST'],
SECRETARIA: ['GET', 'POST'],
CONFIGURADOR: ['GET', 'POST'],
CORRESPONDENCIA: ['GET', 'POST'],
},
'/api/v1/plantillasFormly/documento/[0-9]+/misdocumentos/': {
ADMIN: ['GET', 'POST'],
JEFE: ['GET', 'POST'],
OPERADOR: ['GET', 'POST'],
SECRETARIA: ['GET', 'POST'],
CONFIGURADOR: ['GET', 'POST'],
CORRESPONDENCIA: ['GET', 'POST'],
},
'/api/v1/plantillasFormly/documento/[0-9]+/todo/': {
ADMIN: ['GET'],
JEFE: ['GET'],
OPERADOR: ['GET'],
SECRETARIA: ['GET'],
CONFIGURADOR: ['GET'],
CORRESPONDENCIA: ['GET'],
},
'/api/v1/plantillasFormly/documento/[0-9]+/encurso/': {
JEFE: ['GET'],
},
'/api/v1/plantillasFormly/documento/[0-9]+/info/' : {
ADMIN: ['GET'],
JEFE: ['GET'],
OPERADOR: ['GET'],
SECRETARIA: ['GET'],
CONFIGURADOR: ['GET'],
CORRESPONDENCIA: ['GET'],
},
// POST
'/api/v1/reportes/contables/': {},
'/api/v1/firmasPendientes/': {},
'/api/v1/activos/asignacion/': {},
'/api/v1/activos/devolucion/': {},
'/api/v1/activos/recuperar/': {},
'/api/v1/almacen/recuperar/': {},
'/api/v1/plantillasFormly/catalogo/documento/': {
JEFE: ['POST'],
OPERADOR: ['POST'],
SECRETARIA: ['POST'],
},
'/api/v1/plantillasFormly/generarDocumento/': {
ADMIN: ['POST'],
JEFE: ['POST'],
OPERADOR: ['POST'],
SECRETARIA: ['POST'],
CONFIGURADOR: ['POST'],
CORRESPONDENCIA: ['POST'],
},
'/api/v1/plantillasFormly/plantilla_formly/verificar/': {
ADMIN: ['POST'],
CONFIGURADOR: ['POST']
},
'/api/v1/plantillasFormly/catalogo/': {
JEFE: ['POST'],
OPERADOR: ['POST'],
SECRETARIA: ['POST'],
},
'/api/v1/documento/firmado/': {
JEFE: ['POST'],
OPERADOR: ['POST'],
SECRETARIA: ['POST'],
CORRESPONDENCIA: ['POST'],
},
'/api/v1/plantillasFormly/documentoPDF/': {
ADMIN: ['POST'],
JEFE: ['POST'],
OPERADOR: ['POST'],
SECRETARIA: ['POST'],
CONFIGURADOR: ['POST'],
CORRESPONDENCIA: ['POST'],
},
'/api/v1/plantillasFormly/multiple/': {},
// PUT
'/api/v1/notificacion/conf_notificacion/[0-9]+/': {},
'/api/v1/plantillasFormly/catalogo/documento/[0-9]+/': {
JEFE: ['PUT'],
OPERADOR: ['PUT'],
SECRETARIA: ['PUT'],
},
'/api/v1/plantillasFormly/catalogo/usuario/[0-9]+/': {
JEFE: ['PUT'],
OPERADOR: ['PUT'],
SECRETARIA: ['PUT'],
},
'/api/v1/plantillasFormly/documento/[0-9]+/aprobar/': {
ADMIN: ['PUT'],
JEFE: ['PUT'],
OPERADOR: ['PUT'],
SECRETARIA: ['PUT'],
CONFIGURADOR: ['PUT'],
CORRESPONDENCIA: ['PUT'],
},
'/api/v1/plantillasFormly/documento/[0-9]+/derivar/': {
ADMIN: ['PUT'],
JEFE: ['PUT'],
OPERADOR: ['PUT'],
SECRETARIA: ['PUT'],
CONFIGURADOR: ['PUT'],
CORRESPONDENCIA: ['PUT'],
},
'/api/v1/plantillasFormly/documento/[0-9]+/rechazar/': {
ADMIN: ['PUT'],
JEFE: ['PUT'],
OPERADOR: ['PUT'],
SECRETARIA: ['PUT'],
CONFIGURADOR: ['PUT'],
CORRESPONDENCIA: ['PUT'],
},
// DELETE
'/api/v1/plantillasFormly/documento/[a-zA-Z0-9]+/misdocumentos/[0-9]+/': {
ADMIN: ['DELETE'],
JEFE: ['DELETE'],
OPERADOR: ['DELETE'],
SECRETARIA: ['DELETE'],
CONFIGURADOR: ['DELETE'],
CORRESPONDENCIA: ['DELETE'],
},
'/api/v1/plantillasFormly/documento/[a-zA-Z0-9]+/todo/[0-9]+/': {
ADMIN: ['DELETE'],
JEFE: ['DELETE'],
OPERADOR: ['DELETE'],
SECRETARIA: ['DELETE'],
CONFIGURADOR: ['DELETE'],
CORRESPONDENCIA: ['DELETE'],
}
};
module.exports = permisos;
\ No newline at end of file
......@@ -568,21 +568,32 @@ module.exports = app => {
// app.get('/api/v1/plantillasFormly/documento/:id/misdocumentos', filtros, (req, res) => {
app.get('/api/v1/plantillasFormly/documento/:id/misdocumentos', (req, res) => {
const { limit, page, filter, fields } = req.query;
if(!filter) throw new Error('Debe escribir un texto para buscar.');
let mywhere;
let myselect;
let myorder;
let limite = parseInt(limit);
let pagina = parseInt(page) > 0 ? parseInt(page) : 1;
let strTo = filter.replace(/\s\s+/g, ' ').split(' ').filter(x => x);
let strToSearchFTS = strTo.join('&'); // solo un expacio entre palabras y unidolos con & para el fts
let strToSearch = strTo.join(' '); // para mandar a ilike
let myTsQuery = `to_tsquery('${diccionarioPlanillasFTS}', '${strToSearchFTS}')`;
let myWhere = `estado NOT IN ('ELIMINADO','RECHAZADO') AND _usuario_creacion = ${parseInt(req.params.id)}
AND (document_tokens @@ ${myTsQuery} OR nombre ilike '%${strToSearch}%' OR nombre_plantilla ilike '%${strToSearch}%')
`;
if(!!filter) {
let strTo = filter.replace(/\s\s+/g, ' ').split(' ').filter(x => x);
let strToSearchFTS = strTo.join('&'); // solo un expacio entre palabras y unidolos con & para el fts
let strToSearch = strTo.join(' '); // para mandar a ilike
let myTsQuery = `to_tsquery('${diccionarioPlanillasFTS}', '${strToSearchFTS}')`;
myWhere = `estado NOT IN ('ELIMINADO','RECHAZADO') AND _usuario_creacion = ${parseInt(req.params.id)}
AND (document_tokens @@ ${myTsQuery} OR nombre ilike '%${strToSearch}%' OR nombre_plantilla ilike '%${strToSearch}%')
`;
myselect = `SELECT ${fields}, ts_rank_cd(document_tokens, ${myTsQuery}) as rank, count(*) OVER() AS total_docs`;
myorder = `ORDER BY rank DESC, "_fecha_modificacion" desc`;
} else {
myWhere = `estado NOT IN ('ELIMINADO','RECHAZADO') AND _usuario_creacion = ${parseInt(req.params.id)}`;
myselect = `SELECT ${fields}, count(*) OVER() AS total_docs`;
myorder = `ORDER BY "_fecha_modificacion" desc`;
}
const strQuery = `
SELECT ${fields}, ts_rank_cd(document_tokens, ${myTsQuery}) as rank, count(*) OVER() AS total_docs
${myselect}
FROM documento
WHERE ${myWhere}
ORDER BY rank DESC, "_fecha_modificacion" desc
${myorder}
LIMIT ${limite}
OFFSET ${parseInt(pagina) - 1}*${limite}
;
......@@ -594,7 +605,7 @@ app.get('/api/v1/plantillasFormly/documento/:id/misdocumentos', (req, res) => {
type: dbx.QueryTypes.SELECT
})
.then(respDocumentos => {
if (!respDocumentos) throw new Error('No existen resultados.');
if (respDocumentos.length <= 0) throw new Error('No existen resultados.');
return res.send(util.formatearMensaje("EXITO", 'Obtención de documento exitosa.', {total: parseInt(respDocumentos[0].total_docs), resultado: respDocumentos}));
})
.catch(error => res.status(412).send(util.formatearMensaje("ERROR", error)));
......