Queremos implementar una app que permite añadir libros y escritores. Nos comentan que es imporante poder cambiar los datos de los libros y los escritores de forma independiente, por lo que hemos implementado las dos entidades en dos colecciones diferentes, que van a ser relacionadas entre si a partir de su ObjectID.
Arregla los fallos de la app. En cada apartado se especifica que fichero y función hay que modificar. Todas las vistas estan correctas, al igual que los modelos.
No podemos añadir autores, pues el controlador no está implementado. Gestiona adecuadamente el POST en la ruta-controlador del fichero routers/library.js para añadir un nuevo escritor desde el formulario accesible en Add Author
router.post('/add-author', async function(req, res) {
// Iteración 1
})
Una vez arreglado, añade un par de tus escritoras favoritas a la base de datos mediante el formulario.
Queremos poder ahora añadir libros. El formulario de Add Book se renderiza correctamente, pero no podemos elegir el escritor del libro. Gestiona adecuadamente el GET en la ruta-controlador del fichero routers/library.js
Nota: mientras no completes la iteración 2, no podrás ver el formulario de añadir libro (tendrás un error EJS).
router.get('/add-book', async (req, res) => {
// Recuperar todos los autores de la coleccion Authors
const authors = {} // TODO: Iteración 2
res.render('add-book', {
authors
})
})
Comprueba que ahora puedes añadir también libros al a base de datos. Añade un par de ellos. Usa escritores diferentes. Contesta a la pregunta: Para cada libro que insertamos en la colección books; ¿que 4 campos guardamos para cada docmento? Ayúdate abriendo uno de los documentos de la colección books
Fíjate en la respuesta que da el endpoint al insertar un libro
Cuando queremos mostrar todos los libros mediante la opción de menú Show Books , la información del autor no aparece correctamente. Modifica el fichero routers/library.js, en la ruta-controlador:
router.get('/books', async (req, res) => {
const books = await Book.find(); // Iteración 4
console.log("Libros a enviar a la vista: ", books);
res.render('books', {
books
})
})
Haz que se muestren correctamente también los datos del autor del libro, que esta referenciado mediante su ObjectID a la colección authors
Pista: Populate fields
Queremos implementar la opción de reservar un libro.
- Añade un nuevo esquema, de nombre bookingSchema.js, en models/books.js
- Un bookingSchema se compone de los siguientes campos
- Fecha de inicio de reserva
- Fecha fin de la reserva
- Modifica el schema bookSchema para que ahora admita un conjunto de reservas. Al nuevo campo le podemos llamar bookings
- Crea un formulario y el controlador adecuado para recuperarlo. Por ejemplo en el endpoint /book/:id/book. Adicionalmente, puedes añadir un botón de "Reservar" a cada uno de los libros en la vista que muestra todos los libros.
- Crea un endpoint para gestionar el POST /book/:id/book
- Añade la reserva al array de reservas del libro
- Comprueba que se ha actualizado correctamente el docmento el MongoDB (deberia tener un 'array' de reservas en el campo bookings)
- MEGA-BONUS: Impide que un libro se pueda reservar