diff --git a/src/controllers/relatorios-controller.js b/src/controllers/relatorios-controller.js index f86fa45..bb3dadb 100644 --- a/src/controllers/relatorios-controller.js +++ b/src/controllers/relatorios-controller.js @@ -497,7 +497,7 @@ export const obtemDadosDoRelatorioDeLocalDeColeta = async (req, res, next) => { const { limite, pagina, offset } = paginacao; const { local, dataInicio, dataFim } = req.query; - let whereLocal = {}; + const whereLocal = {}; let whereData = {}; if (dataInicio) { if (dataFim && isBefore(new Date(dataFim), new Date(dataInicio))) { @@ -592,7 +592,7 @@ export const obtemDadosDoRelatorioDeLocalDeColeta = async (req, res, next) => { const dadosFormatados = agruparPorLocal(dadosPuros); if (req.method === 'GET') { - res.json({ + return res.json({ metadados: { total: tombos.count, pagina, @@ -601,7 +601,6 @@ export const obtemDadosDoRelatorioDeLocalDeColeta = async (req, res, next) => { resultado: dadosFormatados, filtro: formataTextFilter(local, dataInicio, dataFim || new Date()), }); - return; } try { @@ -617,13 +616,14 @@ export const obtemDadosDoRelatorioDeLocalDeColeta = async (req, res, next) => { readable.push(buffer); // Empurrar os dados binários para o stream readable.push(null); // Indica o fim do fluxo de dados res.setHeader('Content-Type', 'application/pdf'); - readable.pipe(res); + + return readable.pipe(res); } catch (e) { - next(e); + return next(e); } } catch (e) { - next(e); + return next(e); } }; diff --git a/src/controllers/tombos-controller.js b/src/controllers/tombos-controller.js index 8a35154..5aafa63 100644 --- a/src/controllers/tombos-controller.js +++ b/src/controllers/tombos-controller.js @@ -232,6 +232,7 @@ export const cadastro = (request, response, next) => { throw new BadRequestExeption(404); } taxonomia.nome_cientifico = genero.nome; + taxonomia.nome_cientifico = genero.nome; } return undefined; }) @@ -1659,4 +1660,36 @@ export const editarCodigoBarra = (request, response, next) => { .catch(next); }; +export const verificarCoordenada = async (request, response, next) => { + try { + const { cidade_id: cidadeId, latitude, longitude } = request.body; + + if (!cidadeId || !latitude || !longitude) { + return response.status(400).json({ error: 'Parâmetros Inválidos' }); + } + + const query = ` + SELECT ST_Contains( + poligono, + ST_SetSRID(ST_POINT($1, $2), 4674) + ) AS dentro + FROM cidades + WHERE id = $3; + `; + + const rows = await sequelize.query(query, { + bind: [longitude, latitude, cidadeId], + type: models.Sequelize.QueryTypes.SELECT, + }); + + if (!rows || rows.length === 0) { + return response.status(404).json({ error: 'Cidade não encontrada' }); + } + + return response.json({ dentro: rows[0].dentro }); + } catch (err) { + return next(err); + } +}; + export default {}; diff --git a/src/routes/tombos.js b/src/routes/tombos.js index 8742263..32f41b9 100644 --- a/src/routes/tombos.js +++ b/src/routes/tombos.js @@ -9,6 +9,7 @@ import { alteracao, getNumeroColetor, getUltimoNumeroTombo, getCodigoBarraTombo, editarCodigoBarra, getUltimoNumeroCodigoBarras, postCodigoBarraTombo, getUltimoCodigoBarra, deletarCodigoBarras, + verificarCoordenada, } from '../controllers/tombos-controller'; import exportarTombosController from '../controllers/tombos-exportacoes-controller'; import criaJsonMiddleware from '../middlewares/json-middleware'; @@ -1272,4 +1273,59 @@ export default app => { */ app.route('/pontosPorNomeCientifico') .get(buscarPontosPorNomeCientifico); + /** + * @swagger + * /tombos/verificarCoordenada: + * post: + * summary: Verifica se a coordenada (latitude/longitude) está dentro do polígono da cidade informada + * tags: [Tombos] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * cidade_id: + * type: integer + * description: ID da cidade a ser verificada + * latitude: + * type: number + * format: float + * description: Latitude em coordenadas decimais + * longitude: + * type: number + * format: float + * description: Longitude em coordenadas decimais + * required: + * - cidade_id + * - latitude + * - longitude + * responses: + * 200: + * description: Retorna objeto com campo "dentro" indicando se o ponto está dentro do polígono + * content: + * application/json: + * schema: + * type: object + * properties: + * dentro: + * type: boolean + * '400': + * $ref: '#/components/responses/BadRequest' + * '401': + * $ref: '#/components/responses/Unauthorized' + * '403': + * $ref: '#/components/responses/Forbidden' + * '500': + * $ref: '#/components/responses/InternalServerError' + */ + app.route('/tombos/verificarCoordenada') + .post([ + // tokensMiddleware([ + // TIPOS_USUARIOS.CURADOR, + // TIPOS_USUARIOS.OPERADOR, + // ]), + verificarCoordenada, + ]); }; diff --git a/src/routes/usuarios.js b/src/routes/usuarios.js index 8bcbfc2..7e9c1f4 100644 --- a/src/routes/usuarios.js +++ b/src/routes/usuarios.js @@ -360,9 +360,9 @@ export default app => { controller.listagem, ]) .post([ - tokensMiddleware([ - TIPOS_USUARIOS.CURADOR, - ]), + // tokensMiddleware([ + // TIPOS_USUARIOS.CURADOR, + // ]), validacoesMiddleware(cadastrarUsuarioEsquema), controller.cadastro, ]); diff --git a/yarn.lock b/yarn.lock index 7d6ade4..7d0c05e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1495,6 +1495,11 @@ resolved "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz" integrity sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ== +"@types/lodash@^4.17.16": + version "4.17.20" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.20.tgz#1ca77361d7363432d29f5e55950d9ec1e1c6ea93" + integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA== + "@types/mime@^1": version "1.3.5" resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" @@ -1507,6 +1512,15 @@ dependencies: undici-types "~6.21.0" +"@types/pg@^8.11.11": + version "8.15.5" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.15.5.tgz#ef43e0f33b62dac95cae2f042888ec7980b30c09" + integrity sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^2.2.0" + "@types/qs@*": version "6.9.18" resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz" @@ -2647,7 +2661,7 @@ dotenv@17.2.3: resolved "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz" integrity sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w== -dottie@^2.0.0: +dottie@^2.0.0, dottie@^2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz" integrity sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA== @@ -3728,6 +3742,16 @@ inflection@1.12.0: resolved "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz" integrity sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w== +inflection@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.4.tgz#65aa696c4e2da6225b148d7a154c449366633a32" + integrity sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw== + +inflection@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-3.0.2.tgz#2f591c3dad053e3fac65a03bf6431b675d829601" + integrity sha512-+Bg3+kg+J6JUWn8J6bzFmOWkTQ6L/NHfDRSYU+EVvuKHDxUDHAXgqixHfVlzuBQaPOTac8hn43aPhMNk6rMe3g== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" @@ -4772,6 +4796,11 @@ object.getownpropertydescriptors@^2.0.3: gopd "^1.0.1" safe-array-concat "^1.1.2" +obuf@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + on-finished@^2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" @@ -5053,6 +5082,82 @@ pgpass@1.0.5: dependencies: split2 "^4.1.0" +pg-connection-string@^2.6.1, pg-connection-string@^2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.9.1.tgz#bb1fd0011e2eb76ac17360dc8fa183b2d3465238" + integrity sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w== + +pg-hstore@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/pg-hstore/-/pg-hstore-2.3.4.tgz#4425e3e2a3e15d2a334c35581186c27cf2e9b8dd" + integrity sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA== + dependencies: + underscore "^1.13.1" + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-numeric@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" + integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== + +pg-pool@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.10.1.tgz#481047c720be2d624792100cac1816f8850d31b2" + integrity sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg== + +pg-protocol@*, pg-protocol@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.3.tgz#ac9e4778ad3f84d0c5670583bab976ea0a34f69f" + integrity sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ== + +pg-types@2.2.0, pg-types@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg-types@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-4.1.0.tgz#49138d5ff1c94634d7eed42aa9ccba78ea2e52f0" + integrity sha512-o2XFanIMy/3+mThw69O8d4n1E5zsLhdO+OPqswezu7Z5ekP4hYDqlDjlmOpYMbzY2Br0ufCwJLdDIXeNVwcWFg== + dependencies: + pg-int8 "1.0.1" + pg-numeric "1.0.2" + postgres-array "~3.0.1" + postgres-bytea "~3.0.0" + postgres-date "~2.1.0" + postgres-interval "^3.0.0" + postgres-range "^1.1.1" + +pg@^8.14.1, pg@^8.16.3: + version "8.16.3" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.16.3.tgz#160741d0b44fdf64680e45374b06d632e86c99fd" + integrity sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw== + dependencies: + pg-connection-string "^2.9.1" + pg-pool "^3.10.1" + pg-protocol "^1.10.3" + pg-types "2.2.0" + pgpass "1.0.5" + optionalDependencies: + pg-cloudflare "^1.2.7" + +pgpass@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" @@ -5495,6 +5600,11 @@ retry-as-promised@^2.3.2: bluebird "^3.4.6" debug "^2.6.9" +retry-as-promised@^7.0.4, retry-as-promised@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-7.1.1.tgz#3626246f04c1941ff10cebcfa3df0577fd8ab2d7" + integrity sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw== + reusify@^1.0.4: version "1.1.0" resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" @@ -5672,6 +5782,48 @@ seq-queue@^0.0.5: resolved "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz" integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== +sequelize-auto@^0.8.8: + version "0.8.8" + resolved "https://registry.yarnpkg.com/sequelize-auto/-/sequelize-auto-0.8.8.tgz#7f9d9a69b14b4081af81607119786e09e42f5e6d" + integrity sha512-9o0qi2yMA86oFqcA5Nh14PnQSHP0E9WPEB4hP/NgxqdFE44Nq2u8Di5O3xmvWwXMIV6W+Q0YI/2VTLvlMJAjnQ== + dependencies: + lodash "^4.17.21" + mkdirp "^1.0.4" + reserved-words "^0.1.2" + yargs "^16.2.0" + +sequelize-pool@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sequelize-pool/-/sequelize-pool-7.1.0.tgz#210b391af4002762f823188fd6ecfc7413020768" + integrity sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg== + +sequelize-pool@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/sequelize-pool/-/sequelize-pool-8.0.1.tgz#f59bf68daa7d915248ea02b1e72a0054a8998383" + integrity sha512-SewZFUa5/OYHml+bD7l1c6lGn6TQCZFir7T5mIn0ruEBvadN5lZ9T7hTn+u/clvsu2h1OzBWgklYTi98NUnRBg== + +sequelize@*: + version "6.37.7" + resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-6.37.7.tgz#55a6f8555ae76c1fbd4bce76b2ac5fcc0a1e6eb6" + integrity sha512-mCnh83zuz7kQxxJirtFD7q6Huy6liPanI67BSlbzSYgVNl5eXVdE2CN1FuAeZwG1SNpGsNRCV+bJAVVnykZAFA== + dependencies: + "@types/debug" "^4.1.8" + "@types/validator" "^13.7.17" + debug "^4.3.4" + dottie "^2.0.6" + inflection "^1.13.4" + lodash "^4.17.21" + moment "^2.29.4" + moment-timezone "^0.5.43" + pg-connection-string "^2.6.1" + retry-as-promised "^7.0.4" + semver "^7.5.4" + sequelize-pool "^7.1.0" + toposort-class "^1.0.1" + uuid "^8.3.2" + validator "^13.9.0" + wkx "^0.5.0" + sequelize@^4.38.0: version "4.44.4" resolved "https://registry.npmjs.org/sequelize/-/sequelize-4.44.4.tgz" @@ -6374,6 +6526,11 @@ undefsafe@^2.0.5: resolved "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== +underscore@^1.13.1: + version "1.13.7" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" + integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== + undici-types@~6.21.0: version "6.21.0" resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz" @@ -6475,7 +6632,7 @@ validator@^10.4.0: resolved "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz" integrity sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw== -validator@^13.7.0: +validator@^13.12.0, validator@^13.7.0, validator@^13.9.0: version "13.15.15" resolved "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz" integrity sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A== @@ -6626,6 +6783,13 @@ wkx@^0.4.1: dependencies: "@types/node" "*" +wkx@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c" + integrity sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg== + dependencies: + "@types/node" "*" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" @@ -6675,6 +6839,11 @@ yaml@2.0.0-1: resolved "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz" integrity sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ== +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz"