diff --git a/vendor/SNIBappRest/app.js b/vendor/SNIBappRest/app.js index a11456743..6a1c81f05 100644 --- a/vendor/SNIBappRest/app.js +++ b/vendor/SNIBappRest/app.js @@ -1,13 +1,12 @@ var Hapi = require("hapi"); const Joi = require("joi"); -_ = require("lodash"); const query = require("./controller/query.js"); var server = new Hapi.Server({ connections: { routes: { timeout: { - server: 1000 * 60 * 10, + server: 1000 * 30, socket: false, }, cors: true, @@ -79,11 +78,12 @@ server.register( }, }, handler: function (request, reply) { - var url = - SERVER + - "/busquedas/resultados.json?busqueda=basica&nombre=" + - request.params.q; - query.ajaxRequest(url, reply); + const url = new URL( + `${SERVER}/busquedas/resultados.json?busqueda=basica'` + ); + url.searchParams.set("nombre", req.params.q); + + query.ajaxRequest(url.toString(), reply); }, }, }); @@ -101,25 +101,14 @@ server.register( id: Joi.number() .integer() .description("El identificador de la especie"), - cat: Joi.string() - .default("7100") + cat: Joi.number() + .integer() + .default(7100) .valid([ - "1100", - "2100", - "3100", - "4100", - "5100", - "6100", - "7100", - "1000", - "2000", - "3000", - "4000", - "5000", - "6000", - "7000", + 1100, 2100, 3100, 4100, 5100, 6100, 7100, 1000, 2000, 3000, + 4000, 5000, 6000, 7000, ]) - .description("Solo taxones con la categoria taxonómica ..."), + .description("Solo taxones con la categoria taxonómica"), nivel: Joi.string() .default("=") .valid(["=", ">=", ">", "<=", "<"]) @@ -127,7 +116,9 @@ server.register( edo_cons: Joi.array().description( "La categoría de riesgo,
NOM: 17,15,14,16
IUCN: 29,28,27,26,25
CITES: 22,23,24" ), - dist: Joi.array().description("El tipo de distribución: 3,7,10,6"), + dist: Joi.array() + .items(Joi.number().integer()) + .description("El tipo de distribución: 3,7,10,6"), prior: Joi.array().description( "Valor de la especie, proiritaria para la conservación: 1033,1034,1035" ), @@ -135,51 +126,54 @@ server.register( .integer() .default(1) .description("El número de pagina"), - por_pagina: Joi.string() - .default("50") - .valid(["50", "100", "200", "500", "1000"]) + por_pagina: Joi.number() + .integer() + .default(50) + .valid([50, 100, 200, 500, 1000]) .description("Los resultados por pagina"), }, }, handler: function (request, reply) { - var url = - SERVER + - "/busquedas/resultados.json?busqueda=avanzada&por_pagina=50&commit=Buscar"; - var req = request.query; - - if (req.id !== undefined) { - url += "&id=" + req.id; - if (req.cat !== undefined && req.nivel !== undefined) - url += "&cat=" + req.cat + "&nivel=" + req.nivel; - } else if (req.cat !== undefined && req.nivel !== undefined) { - url += "&cat=" + req.cat + "&nivel=" + req.nivel; - } else { - if (req.nombre !== undefined) url += "&nombre=" + req.nombre; + const url = new URL( + `${SERVER}/busquedas/resultados.json?busqueda=avanzada&commit=Buscar` + ); + + const { + id, + cat, + nivel, + nombre, + edo_cons, + dist, + prior, + pagina, + por_pagina, + } = request.query; + + url.searchParams.set("por_pagina", por_pagina.por_pagina ?? 50); + + if (id || (cat && nivel)) { + if (id) url.searchParams.set("id", id); + + if (cat && nivel) { + url.searchParams.set("cat", cat); + url.searchParams.set("nivel", nivel); + } + } else if (nombre) { + url.searchParams.set("nombre", nombre); } - if (req.edo_cons !== undefined) { - _.forEach(req.edo_cons, function (value) { - url += "&edo_cons[]=" + value; - }); - } + edo_cons?.forEach((edoItem) => + url.searchParams.set("edo_cons[]", edoItem) + ); + dist?.forEach((distItem) => url.searchParams.set("dist[]", distItem)); + prior?.forEach((priorItem) => + url.searchParams.set("prior[]", priorItem) + ); - if (req.dist !== undefined) { - _.forEach(req.dist, function (value) { - url += "&dist[]=" + value; - }); - } - - if (req.prior !== undefined) { - _.forEach(req.prior, function (value) { - url += "&prior[]=" + value; - }); - } + if (pagina) url.searchParams.set("pagina", pagina); - if (req.pagina !== undefined) url += "&pagina=" + req.pagina; - if (req.por_pagina !== undefined) - url += "&por_pagina=" + req.por_pagina; - - query.ajaxRequest(url, reply); + query.ajaxRequest(url.toString(), reply); }, }, }); @@ -196,7 +190,7 @@ server.register( especie_id: Joi.number() .integer() .description( - "El identificador de la especie, si tambien se anota el grupo taxónomico, este id tiene presedencia" + "El identificador de la especie, si tambien se anota el grupo taxónomico, este id tiene precedencia" ), region_id: Joi.number() .integer() @@ -212,7 +206,9 @@ server.register( edo_cons: Joi.array().description( "La categoría de riesgo,
NOM: 17,15,14,16
IUCN: 29,28,27,26,25
CITES: 22,23,24" ), - dist: Joi.array().description("El tipo de distribución: 3,7,10,6"), + dist: Joi.array() + .items(Joi.number().integer()) + .description("El tipo de distribución: 3,7,10,6"), uso: Joi.array().description( "El uso: 11-4-0-0-0-0-0, 11-16-0-0-0-0-0, 11-5-0-0-0-0-0, 11-40-1-0-0-0-0, 11-40-2-0-0-0-0, 11-8-0-0-0-0-0, 11-9-0-0-0-0-0, 11-10-0-0-0-0-0, 11-11-0-0-0-0-0, 11-13-0-0-0-0-0, 11-15-0-0-0-0-0, 11-14-0-0-0-0-0" ), @@ -226,36 +222,31 @@ server.register( }, }, handler: function (request, reply) { - var url = SERVER + "/explora-por-region/especies.json?"; - var req = request.query; - - if (req.pagina !== undefined) url += "&pagina=" + req.pagina; - else url += "&pagina=1"; - - if (req.especie_id !== undefined) - url += "&especie_id=" + req.especie_id; - - if (req.region_id !== undefined) url += "®ion_id=" + req.region_id; - - if (req.tipo_region !== undefined) - url += "&tipo_region=" + req.tipo_region; - - if (req.grupo !== undefined && req.especie_id === undefined) - url += "&especie_id=" + req.grupo; - - if (req.edo_cons !== undefined) { - _.forEach(req.edo_cons, function (value) { - url += "&edo_cons[]=" + value; - }); - } - - if (req.dist !== undefined) { - _.forEach(req.dist, function (value) { - url += "&dist[]=" + value; - }); - } - - query.ajaxRequest(url, reply); + const url = new URL(`${SERVER}/explora-por-region/especies.json`); + + const { + pagina, + especie_id, + region_id, + tipo_region, + grupo, + edo_cons, + dist, + } = request.query; + + url.searchParams.set("pagina", pagina ?? 1); + + if (especie_id) url.searchParams.set("especie_id", especie_id); + if (grupo && especie_id) url.searchParams.set("grupo", grupo); + if (region_id) url.searchParams.set("region_id", region_id); + if (tipo_region) url.searchParams.set("tipo_region", tipo_region); + + edo_cons?.forEach((edoItem) => + url.searchParams.set("edo_cons[]", edoItem) + ); + dist?.forEach((distItem) => url.searchParams.set("dist[]", distItem)); + + query.ajaxRequest(url.toString(), reply); }, }, }); @@ -284,18 +275,15 @@ server.register( }, }, handler: function (request, reply) { - var url = SERVER + "/explora-por-region/ejemplares?"; - var req = request.query; - - if (req.catalogo_id !== undefined) - url += "catalogo_id=" + req.catalogo_id; + const url = new URL(`${SERVER}/explora-por-region/ejemplares`); - if (req.region_id !== undefined) url += "®ion_id=" + req.region_id; + const { catalogo_id, region_id, tipo_region } = request.query; - if (req.tipo_region !== undefined) - url += "&tipo_region=" + req.tipo_region; + if (catalogo_id) url.searchParams.set("catalogo_id", catalogo_id); + if (region_id) url.searchParams.set("region_id", region_id); + if (tipo_region) url.searchParams.set("tipo_region", tipo_region); - query.ajaxRequest(url, reply); + query.ajaxRequest(url.toString(), reply); }, }, }); @@ -314,9 +302,9 @@ server.register( }, }, handler: function (request, reply) { - var url = - SERVER + "/especies/" + request.params.id + ".json"; - query.ajaxRequest(url, reply); + const url = new URL(`${SERVER}/especies/${request.params.id}.json`); + + query.ajaxRequest(url.toString(), reply); }, }, }); @@ -334,11 +322,11 @@ server.register( }, }, handler: function (request, reply) { - var url = - SERVER + "/explora-por-clasificacion.json?especie_id=" + - request.params.id + - "/arbol_nodo_inicial"; - query.ajaxRequest(url, reply); + const url = new URL( + `${SERVER}/explora-por-clasificacion.json?especie_id=${request.params.id}` + ); + + query.ajaxRequest(url.toString(), reply); }, }, }); @@ -356,12 +344,11 @@ server.register( }, }, handler: function (request, reply) { - var url = - SERVER + "/especies/" + - request.params.id + - "/resumen-wikipedia"; - console.log(url) - query.ajaxRequest(url, reply); + const url = new URL( + `${SERVER}/especies/${request.params.id}/resumen-wikipedia` + ); + + query.ajaxRequest(url.toString(), reply); }, }, }); @@ -379,11 +366,12 @@ server.register( }, }, handler: function (request, reply) { - var url = - SERVER + "/sm/search?term=" + - request.params.q + + const defaultQueryParams = "&types%5B%5D=especie&types%5B%5D=subespecie&types%5B%5D=variedad&types%5B%5D=subvariedad&types%5B%5D=forma&types%5B%5D=subforma&types%5B%5D=Reino&types%5B%5D=subreino&types%5B%5D=superphylum&types%5B%5D=division&types%5B%5D=subdivision&types%5B%5D=phylum&types%5B%5D=subphylum&types%5B%5D=superclase&types%5B%5D=grado&types%5B%5D=clase&types%5B%5D=subclase&types%5B%5D=infraclase&types%5B%5D=superorden&types%5B%5D=orden&types%5B%5D=suborden&types%5B%5D=infraorden&types%5B%5D=superfamilia&types%5B%5D=familia&types%5B%5D=subfamilia&types%5B%5D=supertribu&types%5B%5D=tribu&types%5B%5D=subtribu&types%5B%5D=genero&types%5B%5D=subgenero&types%5B%5D=seccion&types%5B%5D=subseccion&types%5B%5D=serie&types%5B%5D=subserie&limit=5"; - query.ajaxRequest(url, reply); + const url = new URL(`${SERVER}/sm/search?${defaultQueryParams}`); + url.searchParams.set("term", request.params.q); + + query.ajaxRequest(url.toString(), reply); }, }, }); @@ -401,10 +389,11 @@ server.register( }, }, handler: function (request, reply) { - var url = - SERVER + "/explora-por-region/ejemplar?ejemplar_id=" + - request.params.id; - query.ajaxRequest(url, reply); + const url = new URL( + `${SERVER}/explora-por-region/ejemplar?ejemplar_id=${request.params.id}` + ); + + query.ajaxRequest(url.toString(), reply); }, }, }); @@ -452,8 +441,8 @@ server.register( }); }, }, - }); - + }); + server.start(function () { console.log("started on " + SERVER); }); diff --git a/vendor/SNIBappRest/controller/query.js b/vendor/SNIBappRest/controller/query.js index 322d896ae..bc4dca442 100644 --- a/vendor/SNIBappRest/controller/query.js +++ b/vendor/SNIBappRest/controller/query.js @@ -3,72 +3,66 @@ require("./config.js"); const http = require("https"); +const TABLES = { + estados: "estados", + municipios: "municipios", + anp: "anp", +}; + /** * Regresa la lista de estados - * @returns {boolean} */ function dameEstados() { - return new Promise((resolve, reject) => { - knex - .select(knex.raw("entid, nom_ent")) - .from("estados") - .orderBy("entid") - .then((dato) => { - resolve(dato); - }); - }); + return knex + .select(knex.raw("entid, nom_ent")) + .from(TABLES.estados) + .orderBy("entid"); } /** - * Regresa ka lista de municipios - * @returns {boolean} + * Regresa la lista de municipios */ function dameMunicipios() { - return new Promise((resolve, reject) => { - knex - .select(knex.raw("munid, nom_mun, nom_ent")) - .from("municipios") - .orderBy("munid") - .then((dato) => { - resolve(dato); - }); - }); + return knex + .select(knex.raw("munid, nom_mun, nom_ent")) + .from(TABLES.municipios) + .orderBy("munid"); } /** - * Regresa la lista de municipios - * @returns {boolean} + * Regresa la lista de areas naturales protegidas */ function dameANP() { - return new Promise((resolve, reject) => { - knex - .select(knex.raw("anpid, nombre, cat_manejo, estados, municipios")) - .from("anp") - .orderBy("anpid") - .then((dato) => { - resolve(dato); - }); - }); + return knex + .select(knex.raw("anpid, nombre, cat_manejo, estados, municipios")) + .from(TABLES.anp) + .orderBy("anpid"); } /** * Hace una petición ajax - * @param url + * @param {string} url + * @param callback: receives an object */ -let ajaxRequest = function (url, reply) { - var resultado = ""; +let ajaxRequest = function (url, callback) { + let resultado = ""; - http + return http .get(url, (res) => { - res.on("data", (d) => { - resultado += d; + res.on("data", (chunk) => { + resultado += chunk; }); }) - .on("error", (e) => { - console.error(e); + .on("error", (error) => { + console.error(`ajaxRequest: http.get, url: ${url}`, error); }) - .on("close", (d) => { - reply(JSON.parse(resultado)); + .on("close", () => { + try { + const obj = JSON.parse(resultado) + callback(obj); + }catch(error) { + console.error(`ajaxRequest: No fue posible parsear string (JSON.parse)`,error) + } }); };