Commit 43ea0e36 authored by D’jalmar Gutierrez Titirico's avatar D’jalmar Gutierrez Titirico 🚲

Se cambio la estructura del query string

Ahora se permite realizar busquedas dentro de las entidades incluidas en el query
Ademas se añadieron metodos utiles para modularizar el armado de la consulta
	modified:   server/components/middleware/parametrosRuta.validator.js
parent 2ec438d7
import validator from 'node-validator';
import * as db from '../../sqldb'
export function formatearRuta(req,res,next) {
var parametros ={};
var parametros = {};
console.log(req.query);
if(req.query.elementos) {
parametros.limit = numeroElementos(req.query);
//parametros de la paginacion
if (req.query.elementos) {
parametros.limit = numeroElementos(req.query.elementos);
if (req.query.pagina)
parametros.offset = numeroPagina(req.query, parametros.limit);
parametros.offset = numeroPagina(req.query.pagina, parametros.limit);
}
//ordenacion
parametros.order = orden(req.query);
if(req.query.incluye) {
if( typeof req.query.incluye === 'string' ) {
req.query.incluye = [ req.query.incluye ];
}
parametros.include = obtenerDependencias(req.query);
//inclusion de relaciones
if (req.query.incluye) {
parametros.include = obtenerDependencias(req.query.incluye);
}
//busqueda en la misma entidad
if(req.query.palabras && req.query.en){
parametros.where = buscar(req.query.palabras, req.query.en, false);
}
req.parametros = parametros;
next();
}
function obtenerDependencias(query){
//TODO se debe añadir la paginacion a los hijos
/**
* Este metodo crea los parametros de busqueda de acuerdo al query string
* En este se pueden especificar las entidades que se incluiran y tambien
* si se debe realizar una busqueda interna
* @param inclusiones
* @returns {Array}
*/
function obtenerDependencias(inclusiones) {
inclusiones = objetoArray(inclusiones);
console.log("OBTENER :" +inclusiones.constructor);
var dependencias = [];
query.incluye.forEach(x=> {
var dependencia = obtenerDependencia(x);
if(dependencia != null)
dependencias.push(dependencia)
inclusiones.forEach(x=> {
var incluye = JSON.parse(x);
if (incluye.entidad) {
var dependencia = obtenerDependencia(incluye.entidad);
if (dependencia) {
if(incluye.palabras && incluye.en){
dependencia.where = buscar(palabras, en, true);
}
dependencias.push(dependencia);
}
}
});
return dependencias;
}
function numeroElementos(elementos) {
elementos = parseInt(elementos);
if(!isNaN(elementos))
return elementos;
return 15; // TODO mover a una variable global, deberia compartirse con la aplicacion angular ?
}
function numeroPagina(pagina,numeroElementos) {
pagina = parseInt(pagina);
if (!isNaN(pagina) && pagina > 0)
return (pagina -1)* numeroElementos;
return 0;
}
function orden(query) {
var queryOrdenamiento = '';
if (query.ordenarPor) {
queryOrdenamiento += query.ordenarPor + ' ';
}
if (query.orden) {
if (query.orden == 'DESC') {
queryOrdenamiento += query.orden;
}
}
return queryOrdenamiento;
}
/**
* Este metodo añade un query de busqueda
* @param palabras
* @param propiedades
* @param estricto
* @returns {{$or: Array}}
*/
function buscar(palabras, propiedades, estricto) {
palabras = objetoArray(palabras);
console.log(palabras);
propiedades = objetoArray(propiedades);
var queryBusqueda = [];
propiedades.forEach(propiedad=> {
palabras.forEach(palabra=> {
queryBusqueda.push(
!estricto ?
["CAST(" + propiedad + " AS TEXT) ILIKE '%" + palabra + "%'"]
: ["CAST(" + propiedad + " AS TEXT) ILIKE '" + palabra + "'"])
})
});
console.log("QUERY: "+queryBusqueda);
return {$or: queryBusqueda};
}
/**
* Convierte cualquier valor a un array
* (ya que cuando se manda un array de 1 elemento en el query string este se convierte a un objeto)
* @param valor
* @returns {*}
*/
function objetoArray(valor) {
if (valor.constructor === Array)
return valor;
return [valor];
}
function obtenerDependencia(nombreDependencia) {
switch (nombreDependencia) {
case 'Cargo':
return {model: db.Cargo, as: nombreDependencia}
case 'Postulaciones':
return {model: db.Cargo, as: nombreDependencia}
case 'Comentario':
return {model: db.Comentario, as: nombreDependencia}
case 'Comentarios':
return {model: db.Usuario, as: nombreDependencia}
return {model: db.Comentario, as: nombreDependencia}
case 'DatoPostulante':
return {model: db.DatoPostulante, as: nombreDependencia}
case 'Postulacion':
return {model: db.Postulacion, as: nombreDependencia}
case 'Postulaciones':
return {model: db.Cargo, as: nombreDependencia}
case 'Postulantes':
return {model: db.Postulante, as: nombreDependencia}
case 'Postulante':
return {model: db.Postulante, as: nombreDependencia}
case 'Postulantes':
return {model: db.Postulante, as: nombreDependencia}
case 'Tag':
return {model: db.Tag, as: nombreDependencia}
case 'Tags':
......@@ -59,33 +144,6 @@ function obtenerDependencia(nombreDependencia) {
case 'Datos':
return {model: db.TipoDato, as: nombreDependencia}
default:
return null;
}
}
function numeroElementos(query) {
var elementos = parseInt(query.elementos);
if(!isNaN(elementos))
return elementos;
return 15; // TODO mover a una variable global, deberia compartirse con la aplicacion angular ?
}
function numeroPagina(query,numeroElementos) {
var pagina = parseInt(query.pagina);
if (!isNaN(pagina))
return (pagina -1)* numeroElementos;
return 0;
}
function orden(query) {
var queryOrdenamiento = '';
if (query.ordenarPor) {
queryOrdenamiento += query.ordenarPor + ' ';
}
if (query.orden) {
if (query.orden == 'DESC') {
queryOrdenamiento += query.orden;
}
return undefined;
}
return queryOrdenamiento;
}
Markdown is supported
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