77 lines
2.4 KiB
JavaScript
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;
|