Paso 4: CRUD Book - Review - Explicación del diseño
- Representaciones de los recursos en la capa de servicios
- Representación en la base de datos
- Nuevos servicios para reviews
La relación entre book
y sus reviews
es una relación de tipo composite y además en unidireccional. En el diagrama de clases un libro conoce sus reviews pero un review no conoce de qué libro es. En este paso hemos introducido en la representación detallada de book la colección de sus reviews. Significa que cuando se solicita un libro con un servicio GET, con el libro viene su colección de reviews. Los servicios definidos en el paso-3 ahora reciben y devuelven esta nueva representación de book.
La representación de review por su lado, es simple consistiendo únicamente de sus atributos básicos. En nuestro diseño, una relación de tipo composite se representa como un subrecurso: review es un subrecurso del recurso book. Un subrecurso no tiene representación detallada ya que no se puede acceder a él sin pasar por el recurso dueño, en este caso book.
El subrecurso no tiene servicios CRUD independientes. Para crearlo, accederlo, modificarlo o borrarlo se debe pasar por el recurso que lo contiene. Entonces, el recurso book tiene nuevos servicios para manipular la relación con sus reviews:
- Obtener los reviews de un libro,
- Agregar un review a un libro
- Eliminar un review de un libro
- Actualizar un review de un libro.
La relación unidireccional entre book
y review
debe reflejarse tanto en las clases DTO
para hacer el mapping con los objetos json
, como en las clases Entity
para hacer el mapping con la base de datos.
Representaciones de los recursos en la capa de servicios
Para representar la relación entre un libro y sus reviews, hemos agregado un atributo
reviews
de tipo colección de ReviewDTO
a la clase BookDetailDTO
. El siguiente diagrama ilustra la relación. Note que la clase ReviewDTO
no tiene ninguna relación hacia BookDTO
.
Representación en la base de datos
Nuevos servicios para reviews
Para los nuevos servicios del recurso book
relacionados con la colección de reviews que cada libro tiene, se diseñó un subrecurso ReviewResource
. El propósito es, tener en una sola clase todos los servicios cuyo path comienza por:
books/{idbook}/reviews
Desde el recurso book, antes de invocar el subrecurso nuevo, se puede validar una sola vez si el libro con identificador idbook
existe.