utn-cli 2.1.41 → 2.1.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/backend.js +12 -1
- package/package.json +1 -1
- package/templates/backend/rutas/API.js +4 -3
- package/templates/backend/rutas/misc.js +17 -0
- package/templates/backend/servicios/Nucleo/ConsentimientoInformado.js +7 -0
- package/templates/backend/servicios/Nucleo/Miscelaneas.js +9 -3
- package/templates/backend/servicios/Nucleo/Monitoreo.js +14 -3
package/commands/backend.js
CHANGED
|
@@ -153,7 +153,7 @@ export async function initBackend() {
|
|
|
153
153
|
|
|
154
154
|
export async function updateBackend(opciones = { cerrarAlFinalizar: true }) {
|
|
155
155
|
console.log('Actualizando el proyecto de backend...');
|
|
156
|
-
const archivosAExcluir = ['InformacionDelModulo.json', 'rutas.js', '
|
|
156
|
+
const archivosAExcluir = ['InformacionDelModulo.json', 'rutas.js', 'API.js', 'NOMBRE_DEL_CANONICO_DEL_PROYECTO.rest'];
|
|
157
157
|
const directoriodePlantillas = path.join(__dirname, '../templates/backend');
|
|
158
158
|
const directorioDestino = process.cwd();
|
|
159
159
|
|
|
@@ -174,6 +174,17 @@ export async function updateBackend(opciones = { cerrarAlFinalizar: true }) {
|
|
|
174
174
|
mergeRutasBackend(rutaRutasDestino, rutaRutasTemplate);
|
|
175
175
|
}
|
|
176
176
|
|
|
177
|
+
// Validar y agregar ManejadorDeErrores en rutas/API.js
|
|
178
|
+
const rutaApiRutasDestino = path.join(directorioDestino, 'rutas', 'API.js');
|
|
179
|
+
if (fs.existsSync(rutaApiRutasDestino)) {
|
|
180
|
+
let contenidoApiRutas = fs.readFileSync(rutaApiRutasDestino, 'utf-8');
|
|
181
|
+
const importManejador = "const ManejadorDeErrores = require('../servicios/Nucleo/ManejadorDeErrores.js');";
|
|
182
|
+
if (!contenidoApiRutas.includes(importManejador)) {
|
|
183
|
+
console.log('Agregando ManejadorDeErrores a rutas/API.js...');
|
|
184
|
+
fs.writeFileSync(rutaApiRutasDestino, importManejador + '\n' + contenidoApiRutas);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
177
188
|
mostrarVersion(path.join(__dirname, '../package.json')); // Show main CLI version
|
|
178
189
|
|
|
179
190
|
const gitignoreOriginal = path.join(directorioDestino, 'gitignore');
|
package/package.json
CHANGED
|
@@ -2,7 +2,8 @@ const express = require('express');
|
|
|
2
2
|
const Router = express.Router();
|
|
3
3
|
|
|
4
4
|
const Miscelaneo = require('../servicios/Nucleo/Miscelaneas.js');
|
|
5
|
-
const {
|
|
5
|
+
const { monitoreo } = require('../servicios/Nucleo/Monitoreo.js');
|
|
6
|
+
const ManejadorDeErrores = require('../servicios/Nucleo/ManejadorDeErrores.js');
|
|
6
7
|
|
|
7
8
|
// Router.post("/DescargarArchivo", async (solicitud, respuesta) => {
|
|
8
9
|
// if (await Miscelaneo.validarIdentificadorAPI(solicitud.headers)) {
|
|
@@ -14,7 +15,7 @@ const { moitoreo } = require('../servicios/Nucleo/Monitoreo.js');
|
|
|
14
15
|
Router.post('/monitoreo/', async (solicitud, respuesta, next) => {
|
|
15
16
|
try {
|
|
16
17
|
if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
|
|
17
|
-
if (await
|
|
18
|
+
if (await monitoreo()) {
|
|
18
19
|
return respuesta.status(200).json({ 'Estado:': 'Ok' });
|
|
19
20
|
} else {
|
|
20
21
|
return respuesta.status(500).json({ 'Estado:': 'Error' });
|
|
@@ -29,7 +30,7 @@ Router.get('/monitoreoV2', async (solicitud, respuesta, next) => {
|
|
|
29
30
|
try {
|
|
30
31
|
if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
|
|
31
32
|
try {
|
|
32
|
-
if (await
|
|
33
|
+
if (await monitoreo()) {
|
|
33
34
|
return respuesta.status(200).json({ 'Estado:': 'Ok' });
|
|
34
35
|
} else {
|
|
35
36
|
return respuesta.status(500).json({ 'Estado:': 'Error' });
|
|
@@ -473,6 +473,23 @@ Router.get('/obtenerPersonasFuncionarias', async (solicitud, respuesta, next) =>
|
|
|
473
473
|
}
|
|
474
474
|
});
|
|
475
475
|
|
|
476
|
+
Router.get('/obtenerPersonas', async (solicitud, respuesta, next) => {
|
|
477
|
+
try {
|
|
478
|
+
if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
|
|
479
|
+
try {
|
|
480
|
+
return respuesta.json({ body: await Miscelaneo.obtenerPersonas(), error: undefined });
|
|
481
|
+
} catch (error) {
|
|
482
|
+
const MensajeDeError = 'No fue posible obtener los datos de las personas funcionarias';
|
|
483
|
+
console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
|
|
484
|
+
return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
|
|
488
|
+
} catch (error) {
|
|
489
|
+
next(error);
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
|
|
476
493
|
Router.get('/obtenerEnlaceDePortal', async (solicitud, respuesta, next) => {
|
|
477
494
|
try {
|
|
478
495
|
if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
|
|
@@ -28,6 +28,13 @@ class ConsentimientoInformado {
|
|
|
28
28
|
, [await this.ConsentimientoInformadoId(), Datos.LastUser.split("@")[0], Datos.LastUser]);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
async ExisteTablaArchivos() {
|
|
32
|
+
// Por agilidad no se usa el nombre formal de la tabla
|
|
33
|
+
const Resultado = await ejecutarConsulta("SELECT COUNT(*) AS `Total` FROM `information_schema`.`tables` WHERE `table_schema` = ? AND `table_name` = 'Archivos'"
|
|
34
|
+
, [Miscelaneas.obtenerNombreLaBaseDeDatos()]);
|
|
35
|
+
return Resultado[0]['Total'] > 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
31
38
|
async creacionDeConsetimientoInformado() {
|
|
32
39
|
const Consentimiento = "<h2>Aviso de actualización del Sistema SIGU</h2><p><strong>Estimada persona usuaria:</strong></p><p>Le informamos que el módulo del Sistema Integrado de Gestión Universitaria (SIGU) ha sido actualizado a una nueva versión, la cual incorpora mejoras funcionales, ajustes técnicos y actualizaciones orientadas a optimizar la experiencia de uso, fortalecer la seguridad de la información y garantizar el cumplimiento de los procesos institucionales.</p><p>Antes de continuar utilizando este módulo, le solicitamos leer atentamente y aceptar las siguientes condiciones:</p><ul><li>Reconozco que estoy utilizando una versión actualizada del sistema.</li><li>Comprendo que esta versión puede incluir cambios en funcionalidades, interfaces y flujos de trabajo.</li><li>Me comprometo a utilizar el sistema de manera responsable, ética y conforme a la normativa institucional vigente.</li><li>Acepto que el uso del sistema podrá ser monitoreado con fines administrativos, académicos y de seguridad.</li></ul><p>El uso continuo del sistema implica su conformidad con las presentes condiciones y con las políticas institucionales aplicables.</p><p>En caso de presentar dudas, consultas o inconvenientes, puede comunicarse con el área de soporte técnico institucional a través de los canales oficiales.</p><hr><p>Al seleccionar la opción <strong>“Aceptar”</strong>, usted manifiesta expresamente su conformidad con el uso de esta nueva versión del módulo correspondiente del Sistema SIGU.</p>";
|
|
33
40
|
return await ejecutarConsultaSIGU("UPDATE `SIGU`.`SIGU_ConsentimientosInformadosV2` SET `Estado` = 'Inactivo' WHERE\
|
|
@@ -268,13 +268,14 @@ class Miscelaneo {
|
|
|
268
268
|
try {
|
|
269
269
|
const titulo = tarjeta['Título'];
|
|
270
270
|
const existentes = await ejecutarConsultaSIGU(
|
|
271
|
-
`SELECT CAST(JSON_VALUE(\`Datos\`, '$."Posición"') AS UNSIGNED) AS Posicion, JSON_VALUE(\`Datos\`, '$."Título"') AS Titulo, JSON_VALUE(\`Datos\`, '$."Descripción"') AS Descripcion FROM \`SIGU\`.\`SIGU_ModulosV2Tarjetas\` WHERE \`Modulo\` = ? AND JSON_VALUE(\`Datos\`, '$."Título"') = ?`,
|
|
271
|
+
`SELECT CAST(JSON_VALUE(\`Datos\`, '$."Posición"') AS UNSIGNED) AS Posicion, JSON_VALUE(\`Datos\`, '$."Título"') AS Titulo, JSON_VALUE(\`Datos\`, '$."Descripción"') AS Descripcion, \`Datos\` FROM \`SIGU\`.\`SIGU_ModulosV2Tarjetas\` WHERE \`Modulo\` = ? AND JSON_VALUE(\`Datos\`, '$."Título"') = ?`,
|
|
272
272
|
[this.NombreCanonicoDelModulo, titulo]
|
|
273
273
|
);
|
|
274
274
|
|
|
275
275
|
let datosFinales;
|
|
276
276
|
if (existentes.length > 0) {
|
|
277
|
-
|
|
277
|
+
const datosExistentes = typeof existentes[0].Datos === 'string' ? JSON.parse(existentes[0].Datos) : existentes[0].Datos;
|
|
278
|
+
datosFinales = { ...datosExistentes, ...tarjeta, 'Posición': existentes[0].Posicion, 'Título': existentes[0].Titulo, 'Descripción': existentes[0].Descripcion, 'Archivo': archivo };
|
|
278
279
|
await ejecutarConsultaSIGU(
|
|
279
280
|
`UPDATE \`SIGU\`.\`SIGU_ModulosV2Tarjetas\` SET \`Datos\` = ?, \`LastUser\` = 'Sistema' WHERE \`Modulo\` = ? AND JSON_VALUE(\`Datos\`, '$."Título"') = ?`,
|
|
280
281
|
[JSON.stringify(datosFinales), this.NombreCanonicoDelModulo, titulo]
|
|
@@ -1181,6 +1182,12 @@ class Miscelaneo {
|
|
|
1181
1182
|
);
|
|
1182
1183
|
}
|
|
1183
1184
|
|
|
1185
|
+
async obtenerPersonas() {
|
|
1186
|
+
return await ejecutarConsultaSIGU("SELECT `Identificador`, `Identificacion`, `Nombre`, `PrimerApellido`,\
|
|
1187
|
+
`SegundoApellido` FROM `SIGU`.`SIGU_Personas` ORDER BY `Nombre`, `PrimerApellido`,\
|
|
1188
|
+
`SegundoApellido`");
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1184
1191
|
async obtenerPersonasFuncionarias() {
|
|
1185
1192
|
return await ejecutarConsultaSIGU("SELECT `Identificador`, `Identificacion`, `Nombre`, `PrimerApellido`,\
|
|
1186
1193
|
`SegundoApellido` FROM `SIGU`.`SIGU_Personas` WHERE `Identificador` IN\
|
|
@@ -2621,7 +2628,6 @@ class Miscelaneo {
|
|
|
2621
2628
|
const config = configuracion.find(c => c.Titulo === t['Título']);
|
|
2622
2629
|
if (config) {
|
|
2623
2630
|
t['Posición'] = config.Posicion;
|
|
2624
|
-
if (config.ColorDeBorde) t.ColorDeBorde = config.ColorDeBorde;
|
|
2625
2631
|
}
|
|
2626
2632
|
if (!t.ColorDeBorde && colorDelModulo) t.ColorDeBorde = colorDelModulo;
|
|
2627
2633
|
const datos = datosPorTitulo[t['Título']];
|
|
@@ -1,15 +1,26 @@
|
|
|
1
1
|
const Miscelaneo = require('./Miscelaneas.js');
|
|
2
2
|
const ManejadorDeErrores = require('./ManejadorDeErrores.js');
|
|
3
3
|
const API = require('../API.js');
|
|
4
|
+
const ConsentimientoInformado = require('./ConsentimientoInformado.js');
|
|
4
5
|
|
|
5
|
-
async function
|
|
6
|
+
async function monitoreo() {
|
|
6
7
|
|
|
7
8
|
try {
|
|
8
9
|
const Resultado = await Miscelaneo.obtenerSedes();
|
|
9
10
|
if (Resultado.length === 0) {
|
|
10
11
|
throw new ManejadorDeErrores(ManejadorDeErrores.mensajeDeErrorAccesoAAPI(), ManejadorDeErrores.obtenerNumeroDeLinea(), false);
|
|
11
12
|
}
|
|
12
|
-
console.log('Monitoreo Paso 1 de
|
|
13
|
+
console.log('Monitoreo Paso 1 de 2: Ok. Miscelaneo.obtenerSedes()');
|
|
14
|
+
} catch (error) {
|
|
15
|
+
console.error(error);
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const Resultado = await ConsentimientoInformado.ExisteTablaArchivos();
|
|
20
|
+
if (!Resultado) {
|
|
21
|
+
throw new ManejadorDeErrores(ManejadorDeErrores.mensajeDeErrorAccesoAAPI(), ManejadorDeErrores.obtenerNumeroDeLinea(), false);
|
|
22
|
+
}
|
|
23
|
+
console.log('Monitoreo Paso 2 de 2: Ok. ConsentimientoInformado.ExisteTablaArchivos()');
|
|
13
24
|
} catch (error) {
|
|
14
25
|
console.error(error);
|
|
15
26
|
return false;
|
|
@@ -62,4 +73,4 @@ async function moitoreo() {
|
|
|
62
73
|
return true;
|
|
63
74
|
}
|
|
64
75
|
|
|
65
|
-
module.exports = {
|
|
76
|
+
module.exports = { monitoreo };
|