DBE S04: cadastro e listagem de instrumentos musicais
This commit is contained in:
commit
bcf1a6d218
17 files changed
+2152
No files matched your search
@@ -0,0 +1,76 @@
|
||||
// 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;
|
||||
Reference in new issue
Block a user