diff --git a/live-coding/02.1-api-node/README.md b/live-coding/02.1-api-node/README.md index e626645fe..f1bcf2caf 100644 --- a/live-coding/02.1-api-node/README.md +++ b/live-coding/02.1-api-node/README.md @@ -24,7 +24,7 @@ Se puede usar almacenamiento en memoria o el sistema gestor de bases de datos de - id: number - name: string -- [] _Debe existir una relación del tipo Many-to-Many entre los libros y los autores_ +- [x] _Debe existir una relación del tipo Many-to-Many entre los libros y los autores_ **Endpoints:** @@ -34,7 +34,7 @@ Se puede usar almacenamiento en memoria o el sistema gestor de bases de datos de 4. **Obtener todos los autores**: Deberá devolver un listado de todos los autores con los libros que tengan. 5. **Obtener Promedio de Páginas por Capítulo**: Obtener el dato de una instancia de Libro ya creada. Se debe devolver el id del libro consultado y un promedio de páginas por capítulo. Ambos en formato cadena, y con 2 decimales para el promedio. -- [] _Para la prueba es necesario realizar lo que dicta el enunciado, aunque se pueden agregar características no mencionadas (manejo de errores, repositorio de datos, validaciones, etc.)._ -- [] _Se pueden asumir los aspectos que no aclare el enunciado, y realizar aclaraciones personales en caso de ser necesario._ +- [x] _Para la prueba es necesario realizar lo que dicta el enunciado, aunque se pueden agregar características no mencionadas (manejo de errores, repositorio de datos, validaciones, etc.)._ +- [x] _Se pueden asumir los aspectos que no aclare el enunciado, y realizar aclaraciones personales en caso de ser necesario._ ¡Mucha suerte! \ No newline at end of file diff --git a/live-coding/02.1-api-node/calls.http b/live-coding/02.1-api-node/calls.http index f19908eaf..6f3edd751 100644 --- a/live-coding/02.1-api-node/calls.http +++ b/live-coding/02.1-api-node/calls.http @@ -2,7 +2,7 @@ GET http://localhost:3000/books ### -GET http://localhost:3000/books/2/pages-average +GET http://localhost:3000/books/1/pages-average ### @@ -13,7 +13,8 @@ content-type: application/json "id": 1, "title": "Harry Potter y la gallina partida", "chapters": 13, - "pages": 356 + "pages": 356, + "authorsIds": [1] } ### @@ -26,6 +27,6 @@ POST http://localhost:3000/authors content-type: application/json { - "id": 2, - "name": "Jorge Luis" + "id": 1, + "name": "J.K. Rowling" } \ No newline at end of file diff --git a/live-coding/02.1-api-node/src/controllers/book.js b/live-coding/02.1-api-node/src/controllers/book.js index 83366f4e1..e073e21c5 100644 --- a/live-coding/02.1-api-node/src/controllers/book.js +++ b/live-coding/02.1-api-node/src/controllers/book.js @@ -6,11 +6,19 @@ export const getAll = (req, res) => { } export const create = (req, res) => { - const book = MemoryBook.create(req.body) - res.status(201).json(book) + try { + const book = MemoryBook.create(req.body) + res.status(201).json(book) + } catch (error) { + res.status(400).json({ error: error.message }) + } } export const getPagesAverage = (req, res) => { - const book = MemoryBook.getPagesAverage(Number(req.params.id)) - res.status(200).json(book) + try { + const avgInfo = MemoryBook.getPagesAverage(Number(req.params.id)) + res.status(200).json(avgInfo) + } catch (error) { + res.status(400).json({ error: error.message }) + } } diff --git a/live-coding/02.1-api-node/src/models/Author/MemoryAuthor.js b/live-coding/02.1-api-node/src/models/Author/MemoryAuthor.js index a07174dd8..19dbbcc55 100644 --- a/live-coding/02.1-api-node/src/models/Author/MemoryAuthor.js +++ b/live-coding/02.1-api-node/src/models/Author/MemoryAuthor.js @@ -1,4 +1,4 @@ -const authors = [] +export const authors = [] export class MemoryAuthor { static getAll () { diff --git a/live-coding/02.1-api-node/src/models/Book/MemoryBook.js b/live-coding/02.1-api-node/src/models/Book/MemoryBook.js index a47ab3ea0..1a0fa7609 100644 --- a/live-coding/02.1-api-node/src/models/Book/MemoryBook.js +++ b/live-coding/02.1-api-node/src/models/Book/MemoryBook.js @@ -1,15 +1,47 @@ -const books = [] +import { authors } from '../Author/MemoryAuthor.js' + +export const books = [] export class MemoryBook { static getAll () { - return books + return books.map(({ id, title, chapters, pages, authorsIds }) => { + const replacedNames = authorsIds.map(id => { + const author = authors.find(author => author.id === id) + return author.name + }) + + return { + id, + title, + chapters, + pages, + authors: replacedNames + } + }) } - static getPagesAverage (id) { - return books.find(book => book.id === id) + static getPagesAverage (bookId) { + const book = books.find(book => book.id === bookId) + const { id, chapters, pages } = book + + if (!book) throw new Error('Book not found') + + const pageAverage = parseFloat((pages / chapters).toFixed(2)) + + return { id, pageAverage } } static create (book) { + const booksAuthors = book.authorsIds + + const AuthorsExist = booksAuthors.every(id => { + return authors.find(author => author.id === id) + }) + + if (!AuthorsExist) { + throw new Error('Author not found') + } + books.push(book) return book }