diff --git a/src/controllers/tombos-controller.js b/src/controllers/tombos-controller.js index 3ba38c18..e537a47c 100644 --- a/src/controllers/tombos-controller.js +++ b/src/controllers/tombos-controller.js @@ -1,5 +1,7 @@ /* eslint-disable quotes */ // @ts-nocheck +import { ForeignKeyConstraintError } from 'sequelize'; + import { padronizarNomeDarwincore } from '~/helpers/padroniza-nome-darwincore'; import BadRequestExeption from '../errors/bad-request-exception'; @@ -1483,6 +1485,74 @@ export const getUltimoNumeroTombo = (request, response, next) => { .catch(next); }; +export async function deletarCodigoBarras(request, response, next) { + try { + const count = await TomboFoto.destroy({ + where: { num_barra: request.params.codigo }, + }); + + if (count === 0) { + return response.status(404).json({ error: 'Código de barras não encontrado' }); + } + return response.status(204).end(); + } catch (err) { + return next(err); + } +} + +export const getUltimoCodigoBarra = async (req, res, next) => { + try { + const row = await TomboFoto.findOne({ + attributes: ['id', 'codigo_barra', 'num_barra', 'caminho_foto'], + order: [ + ['tombo_hcf', 'DESC'], + ['num_barra', 'DESC'], + ['id', 'DESC'], + ], + }); + return res.status(codigos.BUSCAR_UM_ITEM).json(row || null); + } catch (err) { + return next(err); + } +}; + +const toHCFFormat = codigo => { + const codigoStr = String(codigo || '').padStart(9, '0'); + return `HCF${codigoStr}`; +}; + +export const postCodigoBarraTombo = (request, response, next) => { + const criarTransacaoCodigoBarra = transaction => + Promise.resolve().then(() => { + const { hcf, codigo_barra: codigoBarra } = request.body || {}; + + const formattedCodigoBarra = toHCFFormat(codigoBarra); + if (!formattedCodigoBarra) { + throw new BadRequestExeption(417); + } + + const payload = { + tombo_hcf: hcf, + em_vivo: true, + codigo_barra: formattedCodigoBarra, + num_barra: codigoBarra, + caminho_foto: null, + }; + + return TomboFoto.create(payload, { transaction }); + }); + + return sequelize + .transaction(criarTransacaoCodigoBarra) + .then(foto => response.status(201).json(foto)) + .catch(err => { + if (err instanceof ForeignKeyConstraintError) { + return response.status(400).json({ error: 'Violação de chave estrangeira.' }); + } + return next(err); + }); +}; + export const getUltimoNumeroCodigoBarras = (request, response, next) => { const { emVivo } = request.params; Promise.resolve() @@ -1548,23 +1618,4 @@ export const editarCodigoBarra = (request, response, next) => { .catch(next); }; -export const deletaCodigoBarra = codBarra => TomboFoto.destroy({ - where: { - codigo_barra: codBarra, - }, -}); - -export const deletarCodigoBarra = (request, response, next) => { - const { idTombo } = request.params; - Promise.resolve() - .then(() => deletaCodigoBarra(idTombo)) - .then(retorno => { - if (!retorno) { - throw new BadRequestExeption(111); - } - response.status(codigos.EDITAR_SEM_RETORNO).send(); - }) - .catch(next); -}; - export default {}; diff --git a/src/routes/tombos.js b/src/routes/tombos.js index dd1e1f4c..a3bde1e9 100644 --- a/src/routes/tombos.js +++ b/src/routes/tombos.js @@ -7,13 +7,15 @@ import { getDadosCadTombo, getNumeroTombo, cadastro, listagem, desativar, obterTombo, cadastrarTipo, buscarTipos, cadastrarColetores, buscarColetores, buscarProximoNumeroColetor, alteracao, getNumeroColetor, getUltimoNumeroTombo, getCodigoBarraTombo, - editarCodigoBarra, deletarCodigoBarra, getUltimoNumeroCodigoBarras, + editarCodigoBarra, getUltimoNumeroCodigoBarras, postCodigoBarraTombo, + getUltimoCodigoBarra, deletarCodigoBarras, } from '../controllers/tombos-controller'; import exportarTombosController from '../controllers/tombos-exportacoes-controller'; import criaJsonMiddleware from '../middlewares/json-middleware'; import listagensMiddleware from '../middlewares/listagens-middleware'; import tokensMiddleware, { TIPOS_USUARIOS } from '../middlewares/tokens-middleware'; import validacoesMiddleware from '../middlewares/validacoes-middleware'; +import cadastrarCodigoBarrasEsquema from '../validators/codigo-barras-cadastro'; import coletorCadastro from '../validators/coletor-cadastro'; import cadastrarTipoEsquema from '../validators/tipo-cadastro'; import cadastrarTomboEsquema from '../validators/tombo-cadastro'; @@ -110,7 +112,7 @@ export default app => { /** * @swagger - * /tombos/codBarras/{idTombo}: + * /tombos/codigo_barras/{idTombo}: * get: * summary: Obtém o código de barras de um tombo * tags: [Tombos] @@ -143,39 +145,10 @@ export default app => { * $ref: '#/components/responses/NotFound' * '500': * $ref: '#/components/responses/InternalServerError' - * delete: - * summary: Remove o código de barras de um tombo - * tags: [Tombos] - * parameters: - * - in: path - * name: idTombo - * required: true - * schema: - * type: integer - * description: ID do tombo - * responses: - * 204: - * description: Código de barras removido com sucesso - * '401': - * $ref: '#/components/responses/Unauthorized' - * '403': - * $ref: '#/components/responses/Forbidden' - * '404': - * $ref: '#/components/responses/NotFound' - * '500': - * $ref: '#/components/responses/InternalServerError' */ - app.route('/tombos/codBarras/:idTombo') + app.route('/tombos/codigo_barras/:idTombo') .get([ getCodigoBarraTombo, - ]) - .delete([ - tokensMiddleware([ - TIPOS_USUARIOS.CURADOR, - TIPOS_USUARIOS.OPERADOR, - TIPOS_USUARIOS.IDENTIFICADOR, - ]), - deletarCodigoBarra, ]); /** @@ -334,6 +307,71 @@ export default app => { getUltimoNumeroTombo, ]); + /** + * @swagger + * /tombos/ultimo_codigo_barra: + * get: + * summary: Obtém o último codigo de barras + * tags: [Tombos] + * responses: + * 200: + * description: Último número retornado com sucesso + * '500': + * $ref: '#/components/responses/InternalServerError' + */ + app.route('/tombos/ultimo_codigo_barra') + .get([ + getUltimoCodigoBarra, + ]); + + /** + * @swagger + * /tombos/codigo_barras: + * post: + * summary: Cadastra um código de barra a um tombo + * tags: [Tombos] + * responses: + * 200: + * description: Último número retornado com sucesso + * '500': + * $ref: '#/components/responses/InternalServerError' + */ + app.route('/tombos/codigo_barras') + .post([ + validacoesMiddleware(cadastrarCodigoBarrasEsquema), + postCodigoBarraTombo, + ]); + + /** + * @swagger + * /tombos/codigo_barras/{codigo}: + * delete: + * summary: Exclui um código de barras + * tags: [Tombos] + * parameters: + * - in: path + * name: codigo + * required: true + * schema: + * type: integer + * description: codigo de barras + * responses: + * 204: + * description: Código de barras removido com sucesso + * '401': + * $ref: '#/components/responses/Unauthorized' + * '403': + * $ref: '#/components/responses/Forbidden' + * '404': + * $ref: '#/components/responses/NotFound' + * '500': + * $ref: '#/components/responses/InternalServerError' + */ + app.route('/tombos/codigo_barras/:codigo') + .delete([ + deletarCodigoBarras, + ]); + /** * @swagger * /tombos: diff --git a/src/validators/codigo-barras-cadastro.js b/src/validators/codigo-barras-cadastro.js new file mode 100644 index 00000000..a9dde94f --- /dev/null +++ b/src/validators/codigo-barras-cadastro.js @@ -0,0 +1,14 @@ +export default { + hcf: { + in: 'body', + isEmpty: false, + isInt: true, + errorMessage: 'HCF é obrigatório e deve ser um número inteiro', + }, + codigo_barra: { + in: 'body', + isEmpty: false, + isInt: true, + errorMessage: 'Código de barras é obrigatório e deve ser um número inteiro', + }, +};