From 6158c69cd7416c004ed9bddf66649651d550e882 Mon Sep 17 00:00:00 2001 From: Lucas Vaz Date: Sun, 14 Dec 2025 22:47:32 -0300 Subject: [PATCH 1/6] =?UTF-8?q?fix:=20Alterando=20tipagem=20das=20datas=20?= =?UTF-8?q?da=20tabela=20de=20configura=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/reflora-controller.js | 103 ++++++++++++++---- src/controllers/specieslink-controller.js | 102 +++++++++++++---- ...15003403_altera-tipos-data-configuracao.ts | 10 ++ src/herbarium/herbariumdatabase.js | 78 ++++++++----- src/herbarium/main.js | 7 +- src/models/Configuracao.js | 22 +--- 6 files changed, 232 insertions(+), 90 deletions(-) create mode 100644 src/database/migration/20251215003403_altera-tipos-data-configuracao.ts diff --git a/src/controllers/reflora-controller.js b/src/controllers/reflora-controller.js index c0490658..55074443 100644 --- a/src/controllers/reflora-controller.js +++ b/src/controllers/reflora-controller.js @@ -28,31 +28,67 @@ import { export const preparaRequisicao = (request, response) => { const { periodicidade } = request.query; const proximaAtualizacao = request.query.data_proxima_atualizacao; + selectEstaExecutandoServico(1).then(listaExecucaoReflora => { if (listaExecucaoReflora.length > 0) { - const periodicidadeBD = listaExecucaoReflora[0].dataValues.periodicidade; + const execucao = listaExecucaoReflora[0].dataValues; + const periodicidadeBD = execucao.periodicidade; + if (periodicidadeBD === 'MANUAL') { - response.status(200).json(JSON.parse(' { "result": "failed" } ')); - } else if ((periodicidadeBD === 'SEMANAL') || (periodicidadeBD === '1MES') || (periodicidadeBD === '2MESES')) { - if (moment().format('DD/MM/YYYY') !== listaExecucaoReflora[0].dataValues.data_proxima_atualizacao) { - const { id } = listaExecucaoReflora[0].dataValues; - atualizaTabelaConfiguracao(1, id, getHoraAtual(), null, periodicidade, proximaAtualizacao).then(() => { - response.status(200).json(JSON.parse(' { "result": "success" } ')); + response.status(200).json({ result: 'failed' }); + return; + } + + if ( + periodicidadeBD === 'SEMANAL' || + periodicidadeBD === '1MES' || + periodicidadeBD === '2MESES' + ) { + const dataProximaAtualizacao = execucao.data_proxima_atualizacao; + + // comparação correta usando DATETIME + const podeExecutar = + !dataProximaAtualizacao || + moment().isAfter(moment(dataProximaAtualizacao), 'day'); + + if (podeExecutar) { + atualizaTabelaConfiguracao( + 1, + execucao.id, + getHoraAtual(), + null, + periodicidade, + proximaAtualizacao + ).then(() => { + response.status(200).json({ result: 'success' }); }); } else { - response.status(200).json(JSON.parse(' { "result": "failed" } ')); + response.status(200).json({ result: 'failed' }); } } } else { selectTemExecucaoServico(1).then(execucaoReflora => { if (execucaoReflora.length === 0) { - insereExecucao(getHoraAtual(), null, periodicidade, proximaAtualizacao, 1).then(() => { - response.status(200).json(JSON.parse(' { "result": "success" } ')); + insereExecucao( + getHoraAtual(), + null, + periodicidade, + proximaAtualizacao, + 1 + ).then(() => { + response.status(200).json({ result: 'success' }); }); } else { - const { id } = execucaoReflora[0].dataValues; - atualizaTabelaConfiguracao(1, id, getHoraAtual(), null, periodicidade, proximaAtualizacao).then(() => { - response.status(200).json(JSON.parse(' { "result": "success" } ')); + const execucao = execucaoReflora[0].dataValues; + atualizaTabelaConfiguracao( + 1, + execucao.id, + getHoraAtual(), + null, + periodicidade, + proximaAtualizacao + ).then(() => { + response.status(200).json({ result: 'success' }); }); } }); @@ -78,21 +114,42 @@ export const estaExecutando = (_, response) => { response.header('Access-Control-Allow-Origin', '*'); response.header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type'); response.header('Access-Control-Allow-Methods', 'GET'); + if (listaExecucaoReflora.length > 0) { - const { periodicidade } = listaExecucaoReflora[0].dataValues; + const execucao = listaExecucaoReflora[0].dataValues; + const { periodicidade } = execucao; + if (periodicidade === 'MANUAL') { - response.status(200).json(JSON.parse(' { "executando": true, "periodicidade": " " } ')); - } else if ((periodicidade === 'SEMANAL') || (periodicidade === '1MES') || (periodicidade === '2MESES')) { - if (moment().format('DD/MM/YYYY') !== listaExecucaoReflora[0].dataValues.data_proxima_atualizacao) { - response.status(200).json(JSON.parse(` { "executando": false, "periodicidade": "${periodicidade}" } `)); - } else { - response.status(200).json(JSON.parse(` { "executando": true, "periodicidade": "${periodicidade}" } `)); - } + response.status(200).json({ + executando: true, + periodicidade: ' ', + }); + return; + } + + if ( + periodicidade === 'SEMANAL' || + periodicidade === '1MES' || + periodicidade === '2MESES' + ) { + const dataProximaAtualizacao = execucao.data_proxima_atualizacao; + + const executando = + dataProximaAtualizacao && + !moment().isAfter(moment(dataProximaAtualizacao), 'day'); + + response.status(200).json({ + executando, + periodicidade, + }); } } else { - response.status(200).json(JSON.parse(' { "executando": false, "periodicidade": " " } ')); + response.status(200).json({ + executando: false, + periodicidade: ' ', + }); } }); }; -export default { }; +export default {}; diff --git a/src/controllers/specieslink-controller.js b/src/controllers/specieslink-controller.js index 5990fdd6..0c3b9f98 100644 --- a/src/controllers/specieslink-controller.js +++ b/src/controllers/specieslink-controller.js @@ -28,31 +28,66 @@ import { export const preparaRequisicao = (request, response) => { const { periodicidade } = request.query; const proximaAtualizacao = request.query.data_proxima_atualizacao; + selectEstaExecutandoServico(2).then(listaExecucaoSpecieslink => { if (listaExecucaoSpecieslink.length > 0) { - const periodicidadeBD = listaExecucaoSpecieslink[0].dataValues.periodicidade; + const execucao = listaExecucaoSpecieslink[0].dataValues; + const periodicidadeBD = execucao.periodicidade; + if (periodicidadeBD === 'MANUAL') { - response.status(200).json(JSON.parse(' { "result": "failed" } ')); - } else if ((periodicidadeBD === 'SEMANAL') || (periodicidadeBD === '1MES') || (periodicidadeBD === '2MESES')) { - if (moment().format('DD/MM/YYYY') !== listaExecucaoSpecieslink[0].dataValues.data_proxima_atualizacao) { - const { id } = listaExecucaoSpecieslink[0].dataValues; - atualizaTabelaConfiguracao(2, id, getHoraAtual(), null, periodicidade, proximaAtualizacao).then(() => { - response.status(200).json(JSON.parse(' { "result": "success" } ')); + response.status(200).json({ result: 'failed' }); + return; + } + + if ( + periodicidadeBD === 'SEMANAL' || + periodicidadeBD === '1MES' || + periodicidadeBD === '2MESES' + ) { + const dataProximaAtualizacao = execucao.data_proxima_atualizacao; + + const podeExecutar = + !dataProximaAtualizacao || + moment().isAfter(moment(dataProximaAtualizacao), 'day'); + + if (podeExecutar) { + atualizaTabelaConfiguracao( + 2, + execucao.id, + getHoraAtual(), + null, + periodicidade, + proximaAtualizacao + ).then(() => { + response.status(200).json({ result: 'success' }); }); } else { - response.status(200).json(JSON.parse(' { "result": "failed" } ')); + response.status(200).json({ result: 'failed' }); } } } else { selectTemExecucaoServico(2).then(execucaoSpecieslink => { if (execucaoSpecieslink.length === 0) { - insereExecucao(getHoraAtual(), null, periodicidade, proximaAtualizacao, 2).then(() => { - response.status(200).json(JSON.parse(' { "result": "success" } ')); + insereExecucao( + getHoraAtual(), + null, + periodicidade, + proximaAtualizacao, + 2 + ).then(() => { + response.status(200).json({ result: 'success' }); }); } else { - const { id } = execucaoSpecieslink[0].dataValues; - atualizaTabelaConfiguracao(2, id, getHoraAtual(), null, periodicidade, proximaAtualizacao).then(() => { - response.status(200).json(JSON.parse(' { "result": "success" } ')); + const execucao = execucaoSpecieslink[0].dataValues; + atualizaTabelaConfiguracao( + 2, + execucao.id, + getHoraAtual(), + null, + periodicidade, + proximaAtualizacao + ).then(() => { + response.status(200).json({ result: 'success' }); }); } }); @@ -78,21 +113,42 @@ export const estaExecutando = (_, response) => { response.header('Access-Control-Allow-Origin', '*'); response.header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type'); response.header('Access-Control-Allow-Methods', 'GET'); + if (listaExecucaoSpecieslink.length > 0) { - const { periodicidade } = listaExecucaoSpecieslink[0].dataValues; + const execucao = listaExecucaoSpecieslink[0].dataValues; + const { periodicidade } = execucao; + if (periodicidade === 'MANUAL') { - response.status(200).json(JSON.parse(' { "executando": true, "periodicidade": " " } ')); - } else if ((periodicidade === 'SEMANAL') || (periodicidade === '1MES') || (periodicidade === '2MESES')) { - if (moment().format('DD/MM/YYYY') !== listaExecucaoSpecieslink[0].dataValues.data_proxima_atualizacao) { - response.status(200).json(JSON.parse(` { "executando": false, "periodicidade": "${periodicidade}" } `)); - } else { - response.status(200).json(JSON.parse(` { "executando": true, "periodicidade": "${periodicidade}" } `)); - } + response.status(200).json({ + executando: true, + periodicidade: ' ', + }); + return; + } + + if ( + periodicidade === 'SEMANAL' || + periodicidade === '1MES' || + periodicidade === '2MESES' + ) { + const dataProximaAtualizacao = execucao.data_proxima_atualizacao; + + const executando = + dataProximaAtualizacao && + !moment().isAfter(moment(dataProximaAtualizacao), 'day'); + + response.status(200).json({ + executando, + periodicidade, + }); } } else { - response.status(200).json(JSON.parse(' { "executando": false, "periodicidade": " " } ')); + response.status(200).json({ + executando: false, + periodicidade: ' ', + }); } }); }; -export default { }; +export default {}; diff --git a/src/database/migration/20251215003403_altera-tipos-data-configuracao.ts b/src/database/migration/20251215003403_altera-tipos-data-configuracao.ts new file mode 100644 index 00000000..7eeb93f5 --- /dev/null +++ b/src/database/migration/20251215003403_altera-tipos-data-configuracao.ts @@ -0,0 +1,10 @@ +import { Knex } from 'knex'; + +export async function run(knex: Knex): Promise { + await knex.raw(` + ALTER TABLE configuracao + MODIFY hora_inicio TIME NOT NULL, + MODIFY hora_fim TIME NULL, + MODIFY data_proxima_atualizacao DATETIME NULL; + `); +} diff --git a/src/herbarium/herbariumdatabase.js b/src/herbarium/herbariumdatabase.js index 803335a8..3aa5dc74 100644 --- a/src/herbarium/herbariumdatabase.js +++ b/src/herbarium/herbariumdatabase.js @@ -131,11 +131,25 @@ export function selectEstaExecutandoServico(idServico) { export function insereExecucao(horaAtual, horaFim, periodicidadeUsuario, proximaAtualizacao, servicoUsuario) { const tabelaConfiguracao = modeloConfiguracao(conexao, Sequelize); const promessa = Q.defer(); + const horaInicioFormatada = typeof horaAtual === 'string' + ? horaAtual + : horaAtual.toISOString().substring(11, 19); + + const horaFimFormatada = horaFim + ? (typeof horaFim === 'string' + ? horaFim + : horaFim.toISOString().substring(11, 19)) + : null; + + const proximaAtualizacaoISO = proximaAtualizacao + ? new Date(proximaAtualizacao) + : null; + tabelaConfiguracao.create({ - hora_inicio: horaAtual, - hora_fim: horaFim, + hora_inicio: horaInicioFormatada, + hora_fim: horaFimFormatada, periodicidade: periodicidadeUsuario, - data_proxima_atualizacao: proximaAtualizacao, + data_proxima_atualizacao: proximaAtualizacaoISO, nome_arquivo: null, servico: servicoUsuario, }).then(() => { @@ -161,38 +175,50 @@ export function insereExecucao(horaAtual, horaFim, periodicidadeUsuario, proxima * @return promessa.promise, como é assíncrono ele só retorna quando resolver, ou seja, * quando terminar de realizar a atualização. */ -export function atualizaTabelaConfiguracao(idServico, idExecucao, horaInicio, horaFim, periodicidadeUsuario, proximaAtualizacao) { - if (idServico === 1) { - const tabelaConfiguracaoReflora = modeloConfiguracao(conexao, Sequelize); - const promessa = Q.defer(); - tabelaConfiguracaoReflora.update( - { - hora_inicio: horaInicio, - hora_fim: horaFim, - periodicidade: periodicidadeUsuario, - data_proxima_atualizacao: proximaAtualizacao, - }, - { where: { id: idExecucao } }, - ).then(() => { - promessa.resolve(); - }); - return promessa.promise; - } - const tabelaConfiguracaoSpeciesLink = modeloConfiguracao(conexao, Sequelize); +export function atualizaTabelaConfiguracao( + idServico, + idExecucao, + horaInicio, + horaFim, + periodicidadeUsuario, + proximaAtualizacao +) { + const tabelaConfiguracao = modeloConfiguracao(conexao, Sequelize); const promessa = Q.defer(); - tabelaConfiguracaoSpeciesLink.update( + + // Normaliza hora_inicio + const horaInicioFormatada = + horaInicio instanceof Date + ? horaInicio.toISOString().substring(11, 19) + : horaInicio; + + // Normaliza hora_fim + const horaFimFormatada = + horaFim + ? (horaFim instanceof Date + ? horaFim.toISOString().substring(11, 19) + : horaFim) + : null; + + // Normaliza data_proxima_atualizacao (ISO) + const proximaAtualizacaoISO = + proximaAtualizacao + ? new Date(proximaAtualizacao) + : null; + + tabelaConfiguracao.update( { - hora_inicio: horaInicio, - hora_fim: horaFim, + hora_inicio: horaInicioFormatada, + hora_fim: horaFimFormatada, periodicidade: periodicidadeUsuario, - data_proxima_atualizacao: proximaAtualizacao, + data_proxima_atualizacao: proximaAtualizacaoISO, }, { where: { id: idExecucao } }, ).then(() => { promessa.resolve(); }); - return promessa.promise; + return promessa.promise; } /** diff --git a/src/herbarium/main.js b/src/herbarium/main.js index 9da5e197..7b8a213d 100644 --- a/src/herbarium/main.js +++ b/src/herbarium/main.js @@ -138,7 +138,12 @@ function ehPossivelFazerComparacao(nomeArquivo, idServico) { */ export function preparaExecucao(existeExecucao, idServico) { const promessa = Q.defer(); - const nomeArquivo = processaNomeLog(existeExecucao.dataValues.hora_inicio); + const horaInicio = existeExecucao.dataValues.hora_inicio; + const horaInicioFormatada = + horaInicio instanceof Date + ? horaInicio.toISOString().substring(11, 19) // HH:mm:ss + : horaInicio; + const nomeArquivo = processaNomeLog(horaInicioFormatada); ehPossivelFazerComparacao(nomeArquivo, idServico).then(() => { const { id } = existeExecucao.dataValues; let conteudoLOG; diff --git a/src/models/Configuracao.js b/src/models/Configuracao.js index 61723144..9fa7be34 100644 --- a/src/models/Configuracao.js +++ b/src/models/Configuracao.js @@ -1,27 +1,16 @@ -function associate(/* modelos */) { +function associate(/* models */) { + // não há associações para este model } -/** -CREATE TABLE `configuracao` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `hora_inicio` varchar(19) NOT NULL, - `hora_fim` varchar(19) DEFAULT NULL, - `periodicidade` enum('MANUAL','SEMANAL','1MES','2MESES') DEFAULT NULL, - `data_proxima_atualizacao` varchar(10) DEFAULT NULL, - `nome_arquivo` varchar(50) DEFAULT NULL, - `servico` enum('REFLORA','SPECIESLINK') DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET='latin1'; - */ export default (Sequelize, DataTypes) => { const attributes = { hora_inicio: { - type: DataTypes.STRING(19), + type: DataTypes.TIME, allowNull: false, }, hora_fim: { - type: DataTypes.STRING(19), + type: DataTypes.TIME, allowNull: true, }, periodicidade: { @@ -30,7 +19,7 @@ export default (Sequelize, DataTypes) => { allowNull: true, }, data_proxima_atualizacao: { - type: DataTypes.STRING(10), + type: DataTypes.DATE, allowNull: true, }, nome_arquivo: { @@ -45,7 +34,6 @@ export default (Sequelize, DataTypes) => { const options = { freezeTableName: false, - // Disabilita o created_at e updated_at timestamps: false, tableName: 'configuracao', }; From 4127ed96f6ae8d4936cd5875801baff3c72c560c Mon Sep 17 00:00:00 2001 From: Lucas Vaz Date: Sun, 14 Dec 2025 22:56:43 -0300 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20Lint=20formata=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/reflora-controller.js | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/controllers/reflora-controller.js b/src/controllers/reflora-controller.js index 55074443..29617f4f 100644 --- a/src/controllers/reflora-controller.js +++ b/src/controllers/reflora-controller.js @@ -40,16 +40,15 @@ export const preparaRequisicao = (request, response) => { } if ( - periodicidadeBD === 'SEMANAL' || - periodicidadeBD === '1MES' || - periodicidadeBD === '2MESES' + periodicidadeBD === 'SEMANAL' + || periodicidadeBD === '1MES' + || periodicidadeBD === '2MESES' ) { const dataProximaAtualizacao = execucao.data_proxima_atualizacao; - // comparação correta usando DATETIME const podeExecutar = - !dataProximaAtualizacao || - moment().isAfter(moment(dataProximaAtualizacao), 'day'); + !dataProximaAtualizacao + || moment().isAfter(moment(dataProximaAtualizacao), 'day'); if (podeExecutar) { atualizaTabelaConfiguracao( @@ -58,7 +57,7 @@ export const preparaRequisicao = (request, response) => { getHoraAtual(), null, periodicidade, - proximaAtualizacao + proximaAtualizacao, ).then(() => { response.status(200).json({ result: 'success' }); }); @@ -74,7 +73,7 @@ export const preparaRequisicao = (request, response) => { null, periodicidade, proximaAtualizacao, - 1 + 1, ).then(() => { response.status(200).json({ result: 'success' }); }); @@ -86,7 +85,7 @@ export const preparaRequisicao = (request, response) => { getHoraAtual(), null, periodicidade, - proximaAtualizacao + proximaAtualizacao, ).then(() => { response.status(200).json({ result: 'success' }); }); @@ -128,15 +127,15 @@ export const estaExecutando = (_, response) => { } if ( - periodicidade === 'SEMANAL' || - periodicidade === '1MES' || - periodicidade === '2MESES' + periodicidade === 'SEMANAL' + || periodicidade === '1MES' + || periodicidade === '2MESES' ) { const dataProximaAtualizacao = execucao.data_proxima_atualizacao; const executando = - dataProximaAtualizacao && - !moment().isAfter(moment(dataProximaAtualizacao), 'day'); + dataProximaAtualizacao + && !moment().isAfter(moment(dataProximaAtualizacao), 'day'); response.status(200).json({ executando, From 930737410679683ada6e53eff4c82148713406fc Mon Sep 17 00:00:00 2001 From: Lucas Vaz Date: Mon, 15 Dec 2025 21:21:59 -0300 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20Lint=20formata=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/reflora-controller.js | 8 ++++---- src/controllers/specieslink-controller.js | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/controllers/reflora-controller.js b/src/controllers/reflora-controller.js index 29617f4f..21045368 100644 --- a/src/controllers/reflora-controller.js +++ b/src/controllers/reflora-controller.js @@ -46,8 +46,8 @@ export const preparaRequisicao = (request, response) => { ) { const dataProximaAtualizacao = execucao.data_proxima_atualizacao; - const podeExecutar = - !dataProximaAtualizacao + const podeExecutar + = !dataProximaAtualizacao || moment().isAfter(moment(dataProximaAtualizacao), 'day'); if (podeExecutar) { @@ -133,8 +133,8 @@ export const estaExecutando = (_, response) => { ) { const dataProximaAtualizacao = execucao.data_proxima_atualizacao; - const executando = - dataProximaAtualizacao + const executando + = dataProximaAtualizacao && !moment().isAfter(moment(dataProximaAtualizacao), 'day'); response.status(200).json({ diff --git a/src/controllers/specieslink-controller.js b/src/controllers/specieslink-controller.js index 0c3b9f98..39c1b78f 100644 --- a/src/controllers/specieslink-controller.js +++ b/src/controllers/specieslink-controller.js @@ -46,8 +46,8 @@ export const preparaRequisicao = (request, response) => { ) { const dataProximaAtualizacao = execucao.data_proxima_atualizacao; - const podeExecutar = - !dataProximaAtualizacao || + const podeExecutar + = !dataProximaAtualizacao || moment().isAfter(moment(dataProximaAtualizacao), 'day'); if (podeExecutar) { @@ -133,8 +133,8 @@ export const estaExecutando = (_, response) => { ) { const dataProximaAtualizacao = execucao.data_proxima_atualizacao; - const executando = - dataProximaAtualizacao && + const executando + = dataProximaAtualizacao && !moment().isAfter(moment(dataProximaAtualizacao), 'day'); response.status(200).json({ From 901eff6cc6e5dd51f4b6a80540f88f273a2f732e Mon Sep 17 00:00:00 2001 From: Lucas Vaz Date: Mon, 15 Dec 2025 21:39:42 -0300 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20Lint=20formata=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/reflora-controller.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/controllers/reflora-controller.js b/src/controllers/reflora-controller.js index 21045368..dd92021a 100644 --- a/src/controllers/reflora-controller.js +++ b/src/controllers/reflora-controller.js @@ -6,6 +6,7 @@ import { atualizaTabelaConfiguracao, selectEstaExecutandoServico, } from '../herbarium/herbariumdatabase'; + import { getHoraAtual, } from '../herbarium/log'; @@ -47,8 +48,8 @@ export const preparaRequisicao = (request, response) => { const dataProximaAtualizacao = execucao.data_proxima_atualizacao; const podeExecutar - = !dataProximaAtualizacao - || moment().isAfter(moment(dataProximaAtualizacao), 'day'); + = !dataProximaAtualizacao + || moment().isAfter(moment(dataProximaAtualizacao), 'day'); if (podeExecutar) { atualizaTabelaConfiguracao( @@ -79,6 +80,7 @@ export const preparaRequisicao = (request, response) => { }); } else { const execucao = execucaoReflora[0].dataValues; + atualizaTabelaConfiguracao( 1, execucao.id, @@ -134,8 +136,8 @@ export const estaExecutando = (_, response) => { const dataProximaAtualizacao = execucao.data_proxima_atualizacao; const executando - = dataProximaAtualizacao - && !moment().isAfter(moment(dataProximaAtualizacao), 'day'); + = !!dataProximaAtualizacao + && !moment().isAfter(moment(dataProximaAtualizacao), 'day'); response.status(200).json({ executando, From 3b81b919cacf76baf110a8c1a4a8039899debe08 Mon Sep 17 00:00:00 2001 From: Lucas Vaz Date: Tue, 16 Dec 2025 13:17:19 -0300 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20Lint=20formata=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/reflora-controller.js | 39 ++++---------- src/controllers/specieslink-controller.js | 65 +++++++++++------------ 2 files changed, 39 insertions(+), 65 deletions(-) diff --git a/src/controllers/reflora-controller.js b/src/controllers/reflora-controller.js index dd92021a..bcf56498 100644 --- a/src/controllers/reflora-controller.js +++ b/src/controllers/reflora-controller.js @@ -6,7 +6,6 @@ import { atualizaTabelaConfiguracao, selectEstaExecutandoServico, } from '../herbarium/herbariumdatabase'; - import { getHoraAtual, } from '../herbarium/log'; @@ -15,16 +14,7 @@ import { * A função preparaRequisicao, faz um select no banco verificando se tem registros * onde o horário de fim é nulo e o serviço é Reflora. Se o resultado dessa consulta * é maior que zero significa que foi retornado algum registro. Se existe algum registro no BD, - * onde a data de fim é nula e o serviço é Reflora eu verifico a periodicidade que é. Se a - * periodicidade for manual, ele não pode nem agendar nem pedir novamente. Agora se a periodicidade - * for semanal, mensal ou a cada dois meses, verificamos se a data atual é diferente dá data de - * próxima atualização se for eu atualizo com o novo valor, independentemente se é manual ou periódica. - * Caso seja a mesma data não poderá ser feito a troca. - * @param {*} request, é a requisição vinda do front end, às vezes pode - * conter alguns parâmetros nesse cabeçalhos para conseguir informações - * específicas. - * @param {*} response, é a resposta que será enviada ao back end. - * @param {*} next, é utilizado para chamar a próxima função da pilha. + * onde a data de fim é nula e o serviço é Reflora eu verifico a periodicidade que é. */ export const preparaRequisicao = (request, response) => { const { periodicidade } = request.query; @@ -33,7 +23,7 @@ export const preparaRequisicao = (request, response) => { selectEstaExecutandoServico(1).then(listaExecucaoReflora => { if (listaExecucaoReflora.length > 0) { const execucao = listaExecucaoReflora[0].dataValues; - const periodicidadeBD = execucao.periodicidade; + const { periodicidade: periodicidadeBD } = execucao; if (periodicidadeBD === 'MANUAL') { response.status(200).json({ result: 'failed' }); @@ -45,11 +35,10 @@ export const preparaRequisicao = (request, response) => { || periodicidadeBD === '1MES' || periodicidadeBD === '2MESES' ) { - const dataProximaAtualizacao = execucao.data_proxima_atualizacao; + const { data_proxima_atualizacao: dataProximaAtualizacao } = execucao; - const podeExecutar - = !dataProximaAtualizacao - || moment().isAfter(moment(dataProximaAtualizacao), 'day'); + const podeExecutar = !dataProximaAtualizacao + || moment().isAfter(moment(dataProximaAtualizacao), 'day'); if (podeExecutar) { atualizaTabelaConfiguracao( @@ -99,16 +88,7 @@ export const preparaRequisicao = (request, response) => { /** * A função estaExecutando, faz um select no banco verificando se tem registros - * de execução do Reflora. Se tem execução do reflora é verificado a periodicidade - * se a periodicidade é manual, eu envio um JSON com informações de que está executando - * e que a periodicidade é manual (MANUAL === execução imediata). O mesmo processo vale para - * uma periodicidade que é agendada. Caso não seja retornando nada é retornando ao front - * end que não está sendo executado. - * @param {*} request, é a requisição vinda do front end, às vezes pode - * conter alguns parâmetros nesse cabeçalhos para conseguir informações - * específicas. - * @param {*} response, é a resposta que será enviada ao back end. - * @param {*} next, é utilizado para chamar a próxima função da pilha. + * de execução do Reflora. */ export const estaExecutando = (_, response) => { selectEstaExecutandoServico(1).then(listaExecucaoReflora => { @@ -133,11 +113,10 @@ export const estaExecutando = (_, response) => { || periodicidade === '1MES' || periodicidade === '2MESES' ) { - const dataProximaAtualizacao = execucao.data_proxima_atualizacao; + const { data_proxima_atualizacao: dataProximaAtualizacao } = execucao; - const executando - = !!dataProximaAtualizacao - && !moment().isAfter(moment(dataProximaAtualizacao), 'day'); + const executando = !!dataProximaAtualizacao + && !moment().isAfter(moment(dataProximaAtualizacao), 'day'); response.status(200).json({ executando, diff --git a/src/controllers/specieslink-controller.js b/src/controllers/specieslink-controller.js index 39c1b78f..3eb0544c 100644 --- a/src/controllers/specieslink-controller.js +++ b/src/controllers/specieslink-controller.js @@ -6,24 +6,23 @@ import { atualizaTabelaConfiguracao, selectEstaExecutandoServico, } from '../herbarium/herbariumdatabase'; + import { getHoraAtual, } from '../herbarium/log'; /** * A função preparaRequisicao, faz um select no banco verificando se tem registros - * onde o horário de fim é nulo e o serviço é Specieslink. Se o resultado dessa consulta + * onde o horário de fim é nulo e o serviço é SpeciesLink. Se o resultado dessa consulta * é maior que zero significa que foi retornado algum registro. Se existe algum registro no BD, - * onde a data de fim é nula e o serviço é Specieslink eu verifico a periodicidade que é. Se a + * onde a data de fim é nula e o serviço é SpeciesLink eu verifico a periodicidade que é. Se a * periodicidade for manual, ele não pode nem agendar nem pedir novamente. Agora se a periodicidade - * for semanal, mensal ou a cada dois meses, verificamos se a data atual é diferente dá data de - * próxima atualização se for eu atualizo com o novo valor, independentemente se é manual ou periódica. - * Caso seja a mesma data não poderá ser feito a troca. - * @param {*} request, é a requisição vinda do front end, às vezes pode - * conter alguns parâmetros nesse cabeçalhos para conseguir informações - * específicas. - * @param {*} response, é a resposta que será enviada ao back end. - * @param {*} next, é utilizado para chamar a próxima função da pilha. + * for semanal, mensal ou a cada dois meses, verificamos se a data atual é diferente da data de + * próxima atualização; se for, eu atualizo com o novo valor. + * Caso seja a mesma data, não poderá ser feito a troca. + * + * @param {*} request requisição vinda do front end + * @param {*} response resposta enviada ao front end */ export const preparaRequisicao = (request, response) => { const { periodicidade } = request.query; @@ -40,15 +39,14 @@ export const preparaRequisicao = (request, response) => { } if ( - periodicidadeBD === 'SEMANAL' || - periodicidadeBD === '1MES' || - periodicidadeBD === '2MESES' + periodicidadeBD === 'SEMANAL' + || periodicidadeBD === '1MES' + || periodicidadeBD === '2MESES' ) { const dataProximaAtualizacao = execucao.data_proxima_atualizacao; - const podeExecutar - = !dataProximaAtualizacao || - moment().isAfter(moment(dataProximaAtualizacao), 'day'); + const podeExecutar = !dataProximaAtualizacao + || moment().isAfter(moment(dataProximaAtualizacao), 'day'); if (podeExecutar) { atualizaTabelaConfiguracao( @@ -57,7 +55,7 @@ export const preparaRequisicao = (request, response) => { getHoraAtual(), null, periodicidade, - proximaAtualizacao + proximaAtualizacao, ).then(() => { response.status(200).json({ result: 'success' }); }); @@ -73,19 +71,20 @@ export const preparaRequisicao = (request, response) => { null, periodicidade, proximaAtualizacao, - 2 + 2, ).then(() => { response.status(200).json({ result: 'success' }); }); } else { const execucao = execucaoSpecieslink[0].dataValues; + atualizaTabelaConfiguracao( 2, execucao.id, getHoraAtual(), null, periodicidade, - proximaAtualizacao + proximaAtualizacao, ).then(() => { response.status(200).json({ result: 'success' }); }); @@ -97,16 +96,13 @@ export const preparaRequisicao = (request, response) => { /** * A função estaExecutando, faz um select no banco verificando se tem registros - * de execução do Specieslink. Se tem execução do Specieslink é verificado a periodicidade - * se a periodicidade é manual, eu envio um JSON com informações de que está executando - * e que a periodicidade é manual (MANUAL === execução imediata). O mesmo processo vale para - * uma periodicidade que é agendada. Caso não seja retornando nada é retornando ao front - * end que não está sendo executado. - * @param {*} request, é a requisição vinda do front end, às vezes pode - * conter alguns parâmetros nesse cabeçalhos para conseguir informações - * específicas. - * @param {*} response, é a resposta que será enviada ao back end. - * @param {*} next, é utilizado para chamar a próxima função da pilha. + * de execução do SpeciesLink. Se tem execução é verificado a periodicidade. + * Se a periodicidade é manual, eu envio um JSON informando que está executando. + * O mesmo processo vale para uma periodicidade agendada. + * Caso não exista execução, é retornado que não está executando. + * + * @param {*} request requisição vinda do front end + * @param {*} response resposta enviada ao front end */ export const estaExecutando = (_, response) => { selectEstaExecutandoServico(2).then(listaExecucaoSpecieslink => { @@ -127,15 +123,14 @@ export const estaExecutando = (_, response) => { } if ( - periodicidade === 'SEMANAL' || - periodicidade === '1MES' || - periodicidade === '2MESES' + periodicidade === 'SEMANAL' + || periodicidade === '1MES' + || periodicidade === '2MESES' ) { const dataProximaAtualizacao = execucao.data_proxima_atualizacao; - const executando - = dataProximaAtualizacao && - !moment().isAfter(moment(dataProximaAtualizacao), 'day'); + const executando = !!dataProximaAtualizacao + && !moment().isAfter(moment(dataProximaAtualizacao), 'day'); response.status(200).json({ executando, From 8372d63bcbcf4ebd4445a8c1f7667f5faaca45c5 Mon Sep 17 00:00:00 2001 From: Lucas Vaz Date: Wed, 17 Dec 2025 13:14:17 -0300 Subject: [PATCH 6/6] =?UTF-8?q?fix:=20Lint=20formata=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/specieslink-controller.js | 1 - ...15003403_altera-tipos-data-configuracao.ts | 4 +-- src/herbarium/herbariumdatabase.js | 33 ++++++------------- src/herbarium/main.js | 7 ++-- 4 files changed, 15 insertions(+), 30 deletions(-) diff --git a/src/controllers/specieslink-controller.js b/src/controllers/specieslink-controller.js index 3eb0544c..09ce86ac 100644 --- a/src/controllers/specieslink-controller.js +++ b/src/controllers/specieslink-controller.js @@ -6,7 +6,6 @@ import { atualizaTabelaConfiguracao, selectEstaExecutandoServico, } from '../herbarium/herbariumdatabase'; - import { getHoraAtual, } from '../herbarium/log'; diff --git a/src/database/migration/20251215003403_altera-tipos-data-configuracao.ts b/src/database/migration/20251215003403_altera-tipos-data-configuracao.ts index 7eeb93f5..79332d52 100644 --- a/src/database/migration/20251215003403_altera-tipos-data-configuracao.ts +++ b/src/database/migration/20251215003403_altera-tipos-data-configuracao.ts @@ -1,4 +1,4 @@ -import { Knex } from 'knex'; +import { Knex } from 'knex' export async function run(knex: Knex): Promise { await knex.raw(` @@ -6,5 +6,5 @@ export async function run(knex: Knex): Promise { MODIFY hora_inicio TIME NOT NULL, MODIFY hora_fim TIME NULL, MODIFY data_proxima_atualizacao DATETIME NULL; - `); + `) } diff --git a/src/herbarium/herbariumdatabase.js b/src/herbarium/herbariumdatabase.js index 3aa5dc74..2c630ac8 100644 --- a/src/herbarium/herbariumdatabase.js +++ b/src/herbarium/herbariumdatabase.js @@ -135,15 +135,9 @@ export function insereExecucao(horaAtual, horaFim, periodicidadeUsuario, proxima ? horaAtual : horaAtual.toISOString().substring(11, 19); - const horaFimFormatada = horaFim - ? (typeof horaFim === 'string' - ? horaFim - : horaFim.toISOString().substring(11, 19)) - : null; + const horaFimFormatada = horaFim ? (typeof horaFim === 'string' ? horaFim : horaFim.toISOString().substring(11, 19)) : null; - const proximaAtualizacaoISO = proximaAtualizacao - ? new Date(proximaAtualizacao) - : null; + const proximaAtualizacaoISO = proximaAtualizacao ? new Date(proximaAtualizacao) : null; tabelaConfiguracao.create({ hora_inicio: horaInicioFormatada, @@ -181,30 +175,23 @@ export function atualizaTabelaConfiguracao( horaInicio, horaFim, periodicidadeUsuario, - proximaAtualizacao + proximaAtualizacao, ) { const tabelaConfiguracao = modeloConfiguracao(conexao, Sequelize); const promessa = Q.defer(); // Normaliza hora_inicio - const horaInicioFormatada = - horaInicio instanceof Date - ? horaInicio.toISOString().substring(11, 19) - : horaInicio; + const horaInicioFormatada = horaInicio instanceof Date + ? horaInicio.toISOString().substring(11, 19) + : horaInicio; // Normaliza hora_fim - const horaFimFormatada = - horaFim - ? (horaFim instanceof Date - ? horaFim.toISOString().substring(11, 19) - : horaFim) - : null; + const horaFimFormatada = horaFim ? (horaFim instanceof Date ? horaFim.toISOString().substring(11, 19) : horaFim) : null; // Normaliza data_proxima_atualizacao (ISO) - const proximaAtualizacaoISO = - proximaAtualizacao - ? new Date(proximaAtualizacao) - : null; + const proximaAtualizacaoISO = proximaAtualizacao + ? new Date(proximaAtualizacao) + : null; tabelaConfiguracao.update( { diff --git a/src/herbarium/main.js b/src/herbarium/main.js index 7b8a213d..89bba3dc 100644 --- a/src/herbarium/main.js +++ b/src/herbarium/main.js @@ -139,10 +139,9 @@ function ehPossivelFazerComparacao(nomeArquivo, idServico) { export function preparaExecucao(existeExecucao, idServico) { const promessa = Q.defer(); const horaInicio = existeExecucao.dataValues.hora_inicio; - const horaInicioFormatada = - horaInicio instanceof Date - ? horaInicio.toISOString().substring(11, 19) // HH:mm:ss - : horaInicio; + const horaInicioFormatada = horaInicio instanceof Date + ? horaInicio.toISOString().substring(11, 19) // HH:mm:ss + : horaInicio; const nomeArquivo = processaNomeLog(horaInicioFormatada); ehPossivelFazerComparacao(nomeArquivo, idServico).then(() => { const { id } = existeExecucao.dataValues;