Files

77 lines
2.4 KiB
JavaScript

// Anderson Valadares Pinto (20251PL.TSIAD0018) [SLS]
import express from 'express';
import Instrumento, { TIPOS } from '../models/Instrumento.js';
const router = express.Router();
// "/" só manda para a listagem.
router.get('/', (req, res) => res.redirect('/instrumentos'));
// Listagem: todos os instrumentos, do mais recente para o mais antigo.
router.get('/instrumentos', async (req, res, next) => {
try {
const instrumentos = await Instrumento.find().sort({ createdAt: -1 }).lean();
res.render('instrumento/lst', { titulo: 'Instrumentos', instrumentos });
} catch (erro) {
next(erro);
}
});
// Formulário de cadastro.
router.get('/instrumentos/add', (req, res) => {
res.render('instrumento/add', {
titulo: 'Cadastrar Instrumento',
tipos: TIPOS,
valores: {},
erro: null,
});
});
// Recebe o formulário, grava no MongoDB e mostra a confirmação.
router.post('/instrumentos', async (req, res, next) => {
const valores = {
nome: String(req.body.nome ?? '').trim(),
fabricante: String(req.body.fabricante ?? '').trim(),
preco: String(req.body.preco ?? '').replace(',', '.').trim(),
tipo: String(req.body.tipo ?? '').trim(),
};
try {
const instrumento = await Instrumento.create({
nome: valores.nome,
fabricante: valores.fabricante,
preco: Number(valores.preco),
tipo: valores.tipo,
});
res.status(201).render('instrumento/addok', {
titulo: 'Instrumento Cadastrado',
instrumento: instrumento.toObject(),
});
} catch (erro) {
// ValidationError cobre campos vazios e tipo inválido; CastError aparece
// quando o preço chega como texto que não vira número.
if (erro.name === 'ValidationError' || erro.name === 'CastError') {
// O Mongoose embrulha o erro de conversão do preço num ValidationError,
// então olhamos o primeiro erro interno para dar uma mensagem clara.
const primeiro =
erro.name === 'CastError' ? erro : Object.values(erro.errors || {})[0];
const mensagem =
primeiro?.name === 'CastError'
? 'Informe o preço como um número.'
: primeiro?.message || 'Confira os dados informados.';
return res.status(400).render('instrumento/add', {
titulo: 'Cadastrar Instrumento',
tipos: TIPOS,
valores,
erro: mensagem,
});
}
next(erro);
}
});
export default router;