Commit 5d727e1c authored by Marcelo Alejo Calle's avatar Marcelo Alejo Calle
Browse files

Actualizando README.md

parent 2393058c
......@@ -14,6 +14,7 @@ $ npm install git+https://gitlab.agetic.gob.bo/malejo/app-dominio-correo.git --s
**Nota.-** Si la instalación del paquete no avanza, ejecutar el siguiente comando para verificar si tiene permisos
```bash
$ sudo rm -R /tmp/test
$ git config --global credential.helper 'cache --timeout 1200'
$ git clone https://gitlab.agetic.gob.bo/malejo/app-dominio-correo.git /tmp/test
```
......@@ -26,7 +27,10 @@ const config = {
database: 'postgres',
username: 'postgres',
password: 'postgres',
host: 'localhost'
host: 'localhost',
extra: {
dns: ['8.8.8.8', '80.80.80.80', '8.8.4.4']
}
};
// Para usar await debe estar dentro una función async
......@@ -34,7 +38,13 @@ const app = await AppDominio(config).catch(err => console.error(err));
// Lista completa de dominios, puede recibir parámetros de búsqueda entre otras opciones
const list = await app.findAll();
const resp = await app.dominio.verificarCorreo('example.com').then((a) => {
// Verificar un dominio
try {
const resp = await app.dominio.verificarDominioCorreo('agetic.gob.bo');
console.info(resp);
} catch(err) {
console.error(err);
}
```
## Instalando el módulo para desarrollo
......
......@@ -7,7 +7,8 @@ En `src/model` se define la tabla `app_dominio_correo` con varios campos entre l
- `dominio`: El dominio del correo.
- `contador`: Cantidad de veces que se verifica este correo.
- `descripcion`: Descripcion del registro
- `tipo`: tipo de busqueda, 'CONTIENE', 'INICIA', 'IGUAL', 'FINALIZA'.
- `estado`: estado del dominio, 'INSTITUCIONAL', 'RESTRINGIDO', 'LISTA_NEGRA', 'INACTIVO'.
...
En el proyecto que se incluya, se debe llenar estos valores en la tabla `app_dominio_correo` con los dominios para la lista negra.
......
'use strict';
/*
Ejemplo de menu en consola para configurar la lista de los dominios.
npm i terminal-kit pg
node console-menu.js
*/
const term = require('terminal-kit').terminal;
// const fs = require('fs');
const pg = require('pg');
const config = require('../src/config/config');
const client = new pg.Client({
user: config.database.username,
database: config.database.name,
password: config.database.password,
host: config.database.params.host,
port: config.database.params.port
});
const singleColumnMenu = (items, options) => {
if (options) {
if (options.selectedText) {
options.selectedIndex = items.indexOf(options.selectedText);
}
if (options.selectedIndex < 0 || items.length <= options.selectedIndex) {
options.selectedIndex = 0;
}
}
return new Promise((resolve, reject) => {
try {
term.singleColumnMenu(items, options, function (error, response) {
if (error) reject(error);
else resolve(response);
});
} catch (e) {
reject(e);
}
});
};
const gridMenu = (items) => {
return new Promise((resolve, reject) => {
term.gridMenu(items, function (error, response) {
if (error) reject(error);
else resolve(response);
});
});
};
const inputField = (options) => {
return new Promise((resolve, reject) => {
term.inputField(options, function (error, input) {
if (error) reject(error);
else resolve(input);
});
});
};
const consulta = (sql) => {
const result = {};
return new Promise((resolve, reject) => {
client.query(sql, (err, res) => {
if (err) {
console.error('ERROR:', sql, err);
reject(err);
return;
}
result.count = res.rowCount || 0;
result.rows = res.rows || [];
resolve(result);
});
});
};
term.green('Versión %d.', 1);
const menu1 = [
'1. Ver lista de dominios',
'2. Editar (tipo|estado)',
'3. Insertar dominio',
'4. Salir'
];
term.on('key', function (key) {
if (key === 'CTRL_C') { process.exit(); }
});
async function main () {
try {
await client.connect();
const d = {}; // datos
const q = {}; // consultas sql
const op = {}; // menu menus
do {
term.bold.underline.green('\n\nApp para verificar dominios de correos\n');
op.opcion1 = await singleColumnMenu(menu1);
// term('\n').eraseLineAfter.green(
// "#%s selected: %s (%s,%s)\n",
// opcion1.selectedIndex,
// opcion1.selectedText,
// opcion1.x,
// opcion1.y
// );
switch (op.opcion1.selectedIndex) {
case 0:
term.green('\nBuscar dominio: ');
d.dominio = await inputField();
q.sql1 = `SELECT id,dominio,contador,tipo,estado FROM app_dominio_correo WHERE dominio LIKE '%${d.dominio}%' ORDER BY contador DESC;`;
q.result1 = await consulta(q.sql1);
d.data = q.result1.rows.map((row) => {
return Object.values(row);
});
term('\n');
d.data.unshift(['id', 'dominio', 'contador', 'tipo', 'estado']);
term.table(d.data, {
hasBorder: false,
contentHasMarkup: false,
// borderChars: 'lightRounded',
borderAttr: { color: 'blue' },
textAttr: { bgColor: 'default' },
// firstCellTextAttr: { bgColor: 'blue' },
// firstRowTextAttr: { bgColor: 'yellow' },
// firstColumnTextAttr: { bgColor: 'red' },
width: term.width,
fit: true // Activate all expand/shrink + wordWrap
});
break;
case 1:
term.green('\nBuscar dominio: ');
d.dominio = await inputField();
if (!d.dominio.length) {
term.bold.yellow('\nDebe escribir por lo menos una letra');
break;
}
q.sql1 = `SELECT id,dominio,contador,tipo,estado FROM app_dominio_correo WHERE dominio LIKE '%${d.dominio}%' ORDER BY dominio;`;
q.result1 = await consulta(q.sql1);
if (!q.result1 || !q.result1.count) {
term.bold.yellow('\nNo se encontro el dominio!!');
break;
}
op.menu2 = q.result1.rows.map((row) => {
return row.dominio;
});
op.opcion2 = await gridMenu(op.menu2);
d.row = q.result1.rows[op.opcion2.selectedIndex];
term.green('Dominio seleccionado: ').blue(d.row.dominio);
term.green('\nTipo actual: ').blue(d.row.tipo);
op.opcion3 = await singleColumnMenu(['IGUAL', 'CONTIENE', 'INICIA', 'FINALIZA'], { selectedText: d.row.tipo });
d.tipo = op.opcion3.selectedText;
term.green('Estado actual: ').blue(d.row.estado);
op.opcion4 = await singleColumnMenu(['LISTA_NEGRA', 'RESTRINGIDO', 'INSTITUCIONAL', 'INACTIVO'], { selectedText: d.row.estado });
d.estado = op.opcion4.selectedText;
term.green('Guardar cambios: ');
op.opcion5 = await singleColumnMenu(['SI', 'NO'], { selectedIndex: 1 });
if (op.opcion5.selectedText === 'SI') {
q.sql3 = `UPDATE app_dominio_correo SET tipo='${d.tipo}', estado='${d.estado}' WHERE id=${d.row.id};`;
q.result3 = await consulta(q.sql3);
if (q.result3 && q.result3.count) term.green('Modificado correctamente!!');
else term.bold.yellow('No se guardo los cambios!!');
}
break;
case 2:
term.green('\nNombre dominio: ');
d.dominio = await inputField();
if (!d.dominio.length) {
term.bold.yellow('\nDebe escribir por lo menos una letra');
break;
}
q.sql1 = `SELECT id,dominio FROM app_dominio_correo WHERE dominio = '${d.dominio}';`;
q.result1 = await consulta(q.sql1);
if (q.result1 && q.result1.count) {
term.bold.yellow(`\nEl dominio '${d.dominio}' ya existe!!`);
break;
}
term.green('\nTipo: ');
op.opcion3 = await singleColumnMenu(['IGUAL', 'CONTIENE', 'INICIA', 'FINALIZA'], { selectedIndex: 1 });
d.tipo = op.opcion3.selectedText;
term.green('Estado: ');
op.opcion4 = await singleColumnMenu(['LISTA_NEGRA', 'RESTRINGIDO', 'INSTITUCIONAL', 'INACTIVO'], { selectedIndex: 0 });
d.estado = op.opcion4.selectedText;
term.green('Guardar: ');
op.opcion5 = await singleColumnMenu(['SI', 'NO'], { selectedIndex: 1 });
if (op.opcion5.selectedText === 'SI') {
q.sql2 = `INSERT INTO app_dominio_correo (dominio,tipo,estado,"createdUser","createdAt","updatedAt") VALUES ('${d.dominio}','${d.tipo}','${d.estado}',1,now(),now());`;
q.result2 = await consulta(q.sql2);
if (q.result2 && q.result2.count) term.green('Guardado correctamente!!');
else term.bold.yellow('No se guardo los cambios!!');
}
break;
}
} while (op.opcion1.selectedIndex !== 3);
term('\n');
} catch (error) {
console.error(error);
} finally {
await client.end();
process.exit();
}
}
main();
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment