diff --git a/src/controllers/taxonomias-controller.js b/src/controllers/taxonomias-controller.js index 253eab9..57d6c57 100644 --- a/src/controllers/taxonomias-controller.js +++ b/src/controllers/taxonomias-controller.js @@ -1,4 +1,5 @@ import limparEspacos from '@/helpers/limpa-espaco'; +import { atualizarNomeCientificoPorGenero, atualizarNomeCientificoPorEspecie } from '../utils/atualiza-nome-cientifico'; import BadRequestExeption from '../errors/bad-request-exception'; import models from '../models'; @@ -604,7 +605,8 @@ export const editarGenero = (request, response, next) => { id: generoId, }, transaction, - })); + })) + .then(() => atualizarNomeCientificoPorGenero(generoId, transaction)); sequelize.transaction(callback) .then(generoCriado => { if (!generoCriado) { @@ -837,7 +839,8 @@ export const editarEspecie = (request, response, next) => { id: especieId, }, transaction, - })); + })) + .then(() => atualizarNomeCientificoPorEspecie(especieId, transaction)); sequelize.transaction(callback) .then(especieCriado => { if (!especieCriado) { diff --git a/src/database/migration/20260404170000_fix-nome-cientifico-inconsistente.ts b/src/database/migration/20260404170000_fix-nome-cientifico-inconsistente.ts deleted file mode 100644 index bac7528..0000000 --- a/src/database/migration/20260404170000_fix-nome-cientifico-inconsistente.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Knex } from 'knex' - -export async function run(knex: Knex): Promise { - await knex.transaction(async trx => { - // Atualiza tombos que possuem genero e especie - await trx.raw(` - UPDATE tombos - SET nome_cientifico = CONCAT(g.nome, ' ', e.nome) - FROM generos g, especies e - WHERE tombos.genero_id = g.id - AND tombos.especie_id = e.id - AND ( - tombos.nome_cientifico IS DISTINCT FROM CONCAT(g.nome, ' ', e.nome) - OR e.genero_id IS DISTINCT FROM tombos.genero_id - ) - `) - - // Atualiza tombos que possuem apenas genero (sem especie) - await trx.raw(` - UPDATE tombos - SET nome_cientifico = g.nome - FROM generos g - WHERE tombos.genero_id = g.id - AND tombos.especie_id IS NULL - AND tombos.nome_cientifico IS DISTINCT FROM g.nome - `) - }) -} diff --git a/src/utils/atualiza-nome-cientifico.js b/src/utils/atualiza-nome-cientifico.js new file mode 100644 index 0000000..8ba1dba --- /dev/null +++ b/src/utils/atualiza-nome-cientifico.js @@ -0,0 +1,47 @@ +import models from '../models'; + +const { sequelize } = models; + +/** + * Atualiza o nome_cientifico de todos os tombos que possuem o genero_id informado. + * Deve ser chamado quando o nome de um gĂȘnero for alterado. + */ +export async function atualizarNomeCientificoPorGenero(generoId, transaction) { + // Tombos com genero e especie + await sequelize.query(` + UPDATE tombos t + SET nome_cientifico = CONCAT(g.nome, ' ', e.nome) + FROM generos g, especies e + WHERE t.genero_id = g.id + AND t.especie_id = e.id + AND t.genero_id = :generoId + AND t.nome_cientifico IS DISTINCT FROM CONCAT(g.nome, ' ', e.nome) + `, { replacements: { generoId }, transaction }); + + // Tombos com apenas genero (sem especie) + await sequelize.query(` + UPDATE tombos t + SET nome_cientifico = g.nome + FROM generos g + WHERE t.genero_id = g.id + AND t.especie_id IS NULL + AND t.genero_id = :generoId + AND t.nome_cientifico IS DISTINCT FROM g.nome + `, { replacements: { generoId }, transaction }); +} + +/** + * Atualiza o nome_cientifico de todos os tombos que possuem o especie_id informado. + * Deve ser chamado quando o nome de uma espĂ©cie for alterado. + */ +export async function atualizarNomeCientificoPorEspecie(especieId, transaction) { + await sequelize.query(` + UPDATE tombos t + SET nome_cientifico = CONCAT(g.nome, ' ', e.nome) + FROM generos g, especies e + WHERE t.genero_id = g.id + AND t.especie_id = e.id + AND t.especie_id = :especieId + AND t.nome_cientifico IS DISTINCT FROM CONCAT(g.nome, ' ', e.nome) + `, { replacements: { especieId }, transaction }); +}