diff --git a/src/controllers/taxonomias-controller.js b/src/controllers/taxonomias-controller.js index 236a9e1..3fe2f02 100644 --- a/src/controllers/taxonomias-controller.js +++ b/src/controllers/taxonomias-controller.js @@ -37,6 +37,7 @@ export const cadastrarFamilia = (request, response, next) => { export const buscarFamilias = (request, response, next) => { const { limite, pagina, offset } = request.paginacao; + const { orderClause } = request.ordenacao; const { familia } = request.query; let where; where = { @@ -49,13 +50,15 @@ export const buscarFamilias = (request, response, next) => { }; } Promise.resolve() - .then(() => Familia.findAndCountAll({ - attributes: ['id', 'nome'], - order: [['created_at', 'DESC']], - limit: limite, - offset, - where, - })) + .then(() => + Familia.findAndCountAll({ + attributes: ['id', 'nome'], + order: orderClause, + limit: limite, + offset, + where, + }) + ) .then(familias => { response.status(codigos.LISTAGEM).json({ metadados: { @@ -172,11 +175,13 @@ export const cadastrarSubfamilia = (request, response, next) => { export const buscarSubfamilia = (request, response, next) => { const { limite, pagina, offset } = request.paginacao; + const { orderClause } = request.ordenacao; const { subfamilia, familia_id: familiaId, familia_nome: familiaNome } = request.query; - let where; - where = { + + let where = { ativo: 1, }; + if (subfamilia) { where = { ...where, @@ -199,7 +204,7 @@ export const buscarSubfamilia = (request, response, next) => { .then(() => Subfamilia.findAndCountAll({ attributes: ['id', 'nome'], - order: [['created_at', 'DESC']], + order: orderClause, limit: limite, offset, where, @@ -343,6 +348,7 @@ export const cadastrarGenero = (request, response, next) => { export const buscarGeneros = (request, response, next) => { const { limite, pagina, offset } = request.paginacao; + const { orderClause } = request.ordenacao; const { genero, familia_id: familiaId, familia_nome: familiaNome } = request.query; let where; where = { @@ -369,7 +375,7 @@ export const buscarGeneros = (request, response, next) => { .then(() => Genero.findAndCountAll({ attributes: ['id', 'nome'], - order: [['created_at', 'DESC']], + order: orderClause, limit: limite, offset, where, @@ -533,11 +539,13 @@ export const cadastrarEspecie = (request, response, next) => { export const buscarEspecies = (request, response, next) => { const { limite, pagina, offset } = request.paginacao; + const { orderClause } = request.ordenacao; const { especie, genero_id: generoId, familia_nome: familiaNome, genero_nome: generoNome } = request.query; - let where; - where = { + + let where = { ativo: 1, }; + if (especie) { where = { ...where, @@ -565,7 +573,7 @@ export const buscarEspecies = (request, response, next) => { .then(() => Especie.findAndCountAll({ attributes: ['id', 'nome'], - order: [['created_at', 'DESC']], + order: orderClause, limit: limite, offset, where, @@ -760,11 +768,13 @@ export const cadastrarSubespecie = (request, response, next) => { export const buscarSubespecies = (request, response, next) => { const { limite, pagina, offset } = request.paginacao; + const { orderClause } = request.ordenacao; const { subespecie, especie_id: especieId, familia_nome: familiaNome, genero_nome: generoNome, especie_nome: especieNome } = request.query; - let where; - where = { + + let where = { ativo: 1, }; + if (subespecie) { where = { ...where, @@ -796,7 +806,7 @@ export const buscarSubespecies = (request, response, next) => { .then(() => Subespecie.findAndCountAll({ attributes: ['id', 'nome'], - order: [['created_at', 'DESC']], + order: orderClause, limit: limite, offset, where, @@ -1008,6 +1018,7 @@ export const cadastrarVariedade = (request, response, next) => { export const buscarVariedades = (request, response, next) => { const { limite, pagina, offset } = request.paginacao; + const { orderClause } = request.ordenacao; const { variedade, especie_id: especieId, @@ -1051,7 +1062,7 @@ export const buscarVariedades = (request, response, next) => { .then(() => Variedade.findAndCountAll({ attributes: ['id', 'nome'], - order: [['created_at', 'DESC']], + order: orderClause, limit: limite, offset, where, diff --git a/src/middlewares/listagens-middleware.js b/src/middlewares/listagens-middleware.js index a551a61..b297191 100644 --- a/src/middlewares/listagens-middleware.js +++ b/src/middlewares/listagens-middleware.js @@ -11,7 +11,7 @@ export default (request, response, next) => { pagina = 1; } - const offset = (pagina * limite) - limite; + const offset = pagina * limite - limite; request.paginacao = { limite, @@ -19,5 +19,5 @@ export default (request, response, next) => { offset, }; - next(); + return next(); }; diff --git a/src/middlewares/ordenacao-middleware.js b/src/middlewares/ordenacao-middleware.js new file mode 100644 index 0000000..7468696 --- /dev/null +++ b/src/middlewares/ordenacao-middleware.js @@ -0,0 +1,68 @@ +import models from '../models'; + +const { + Familia, + Genero, + Subfamilia, + Especie, + Variedade, + Subespecie, + Autor, +} = models; + +const criaListagemMiddleware = (allowedColumns, defaultSort = 'nome', defaultDirection = 'asc') => (request, response, next) => { + const { query } = request; + const order = query.order || `${defaultSort}:${defaultDirection}`; + + const [column, direction] = order.split(':'); + + if (column !== defaultSort && !allowedColumns.includes(column)) { + return response.status(400).json({ error: 'Coluna inválida' }); + } + + if (!(direction === defaultDirection) && !['asc', 'desc'].includes(direction)) { + return response.status(400).json({ error: 'Direção inválida' }); + } + + let orderClause = [[defaultSort, defaultDirection.toUpperCase()]]; + + if (column === 'autor') { + orderClause = [['nome', direction.toUpperCase()]]; + + if (!request.path.includes('/autores')) orderClause = [[{ model: Autor, as: 'autor' }, 'nome', direction.toUpperCase()]]; + } else if (column === 'familia') { + orderClause = [['nome', direction.toUpperCase()]]; + + if (!request.path.includes('/familias')) orderClause = [[{ model: Familia }, 'nome', direction.toUpperCase()]]; + } else if (column === 'subfamilia') { + orderClause = [['nome', direction.toUpperCase()]]; + + if (!request.path.includes('/subfamilias')) orderClause = [[{ model: Subfamilia }, 'nome', direction.toUpperCase()]]; + } else if (column === 'genero') { + orderClause = [['nome', direction.toUpperCase()]]; + + if (!request.path.includes('/generos')) orderClause = [[{ model: Genero }, 'nome', direction.toUpperCase()]]; + } else if (column === 'especie') { + orderClause = [['nome', direction.toUpperCase()]]; + + if (!request.path.includes('/especies')) orderClause = [[{ model: Especie, as: 'especie' }, 'nome', direction.toUpperCase()]]; + } else if (column === 'subespecie') { + orderClause = [['nome', direction.toUpperCase()]]; + + if (!request.path.includes('/subespecies')) orderClause = [[{ model: Subespecie }, 'nome', direction.toUpperCase()]]; + } else if (column === 'variedade') { + orderClause = [['nome', direction.toUpperCase()]]; + + if (!request.path.includes('/variedades')) orderClause = [[{ model: Variedade }, 'nome', direction.toUpperCase()]]; + } else { + orderClause = [[column, direction.toUpperCase()]]; + } + + request.ordenacao = { + orderClause, + }; + + return next(); +}; + +export default criaListagemMiddleware; diff --git a/src/routes/taxonomias.js b/src/routes/taxonomias.js index 6851b69..30eb9d9 100644 --- a/src/routes/taxonomias.js +++ b/src/routes/taxonomias.js @@ -1,4 +1,5 @@ import listagensMiddleware from '../middlewares/listagens-middleware'; +import criaOrdenacaoMiddleware from '../middlewares/ordenacao-middleware'; import tokensMiddleware, { TIPOS_USUARIOS } from '../middlewares/tokens-middleware'; import validacoesMiddleware from '../middlewares/validacoes-middleware'; import autorAtualizaEsquema from '../validators/autor-atualiza'; @@ -29,6 +30,13 @@ import variedadeListagemEsquema from '../validators/variedade-listagem'; const controller = require('../controllers/taxonomias-controller'); +const familiasOrdenacaoMiddleware = criaOrdenacaoMiddleware(['familia'], 'nome', 'asc'); +const subfamiliasOrdenacaoMiddleware = criaOrdenacaoMiddleware(['subfamilia', 'familia', 'autor'], 'nome', 'asc'); +const generosOrdenacaoMiddleware = criaOrdenacaoMiddleware(['genero', 'familia'], 'nome', 'asc'); +const especiesOrdenacaoMiddleware = criaOrdenacaoMiddleware(['especie', 'familia', 'genero', 'familia'], 'nome', 'asc'); +const subEspeciesOrdenacaoMiddleware = criaOrdenacaoMiddleware(['subespecie', 'familia', 'genero', 'especie', 'autor'], 'nome', 'asc'); +const variedadesOrdenacaoMiddleware = criaOrdenacaoMiddleware(['variedade', 'familia', 'genero', 'especie', 'autor'], 'nome', 'asc'); + export default app => { app.route('/taxonomias') @@ -37,16 +45,16 @@ export default app => { controller.listagem, ]); - app.route('/familias') + app + .route('/familias') .post([ - tokensMiddleware([ - TIPOS_USUARIOS.CURADOR, TIPOS_USUARIOS.OPERADOR, TIPOS_USUARIOS.IDENTIFICADOR, - ]), + tokensMiddleware([TIPOS_USUARIOS.CURADOR, TIPOS_USUARIOS.OPERADOR, TIPOS_USUARIOS.IDENTIFICADOR]), validacoesMiddleware(nomeEsquema), controller.cadastrarFamilia, ]) .get([ listagensMiddleware, + familiasOrdenacaoMiddleware, validacoesMiddleware(listagemFamiliaEsquema), controller.buscarFamilias, ]); @@ -77,6 +85,7 @@ export default app => { ]) .get([ listagensMiddleware, + generosOrdenacaoMiddleware, validacoesMiddleware(generoListagemEsquema), controller.buscarGeneros, ]); @@ -107,6 +116,7 @@ export default app => { ]) .get([ listagensMiddleware, + subfamiliasOrdenacaoMiddleware, validacoesMiddleware(subfamiliaListagemEsquema), controller.buscarSubfamilia, ]); @@ -137,6 +147,7 @@ export default app => { ]) .get([ listagensMiddleware, + especiesOrdenacaoMiddleware, validacoesMiddleware(especieListagemEsquema), controller.buscarEspecies, ]); @@ -167,6 +178,7 @@ export default app => { ]) .get([ listagensMiddleware, + subEspeciesOrdenacaoMiddleware, validacoesMiddleware(subespecieListagemEsquema), controller.buscarSubespecies, ]); @@ -196,6 +208,7 @@ export default app => { ]) .get([ listagensMiddleware, + variedadesOrdenacaoMiddleware, validacoesMiddleware(variedadeListagemEsquema), controller.buscarVariedades, ]);