Bienvenido a la API REST de NULLERS BOOKS, una tienda de libros en línea que te permite realizar diversas operaciones, como consultar libros, gestionar usuarios, administrar tiendas y realizar pedidos. Nuestra API está diseñada para ser segura, eficiente y escalable, proporcionando una interfaz robusta para interactuar con la plataforma de comercio de libros.

Enlace al proyecto.

Autores

Spring-Rest-Bookstore



Arquitectura



 
 

Diagrama UML

NULLERS BOOKS API

Por NULLERS - 4 de diciembre de 2023

Descripción

Estructura del Proyecto

  • Controllers: Manejan las solicitudes HTTP y devuelven las respuestas correspondientes.
  • Exceptions: Define excepciones específicas utilizadas en la aplicación.
  • Models: Define los objetos utilizados en la aplicación.
  • Repositories: Realiza operaciones con la base de datos.
  • Services: Realiza operaciones necesarias para que el controlador pueda devolver la respuesta.
  • Utils: Define las clases útiles que se utilizan en la aplicación.
  • Main: El programa que ejecutará la aplicación.

Infraestructura

El usuario tiene un UserRole, el cual define el tipo de usuario (si es Admin o User). Dependiendo del tipo de rol, se le otorgará la posibilidad de realizar ciertas peticiones. Los usuarios pueden realizar consultas GET en libros, tiendas o editoriales, pero no pueden realizar peticiones de actualización o eliminación. Los usuarios administradores tienen control para poder realizar estas peticiones.

El usuario cuenta con un email y un username, el cuál no se puede repetir. Utilizamos el borrado lógico en isDeleted para la conservación de los usuarios.

Una tienda tiene una dirección y una lista de libros y clientes. Un cliente también tiene una dirección.

Un Libro tiene asignada una categoría y una editorial. Las editoriales tienen de 0 a muchos libros. La editorial, el libro y el cliente cuentan con una imagen.

El libro cuenta con un stock y un precio del libro, así como cada uno de los elementos que componen al libro: nombre, autor, descripción…

Borrado lógico:

  • En book empleando active.
  • En category empleando isActive.
  • En publisher empleando active.
  • En order empleando isDeleted.

Elección de Tecnologías para el Modelo de Datos

Modelo relacional:

Hemos utilizado un modelo relacional para los pedidos y líneas de pedido.

SQL:

Para el resto de entidades, hemos utilizado SQL.

La elección de utilizar un modelo relacional para los pedidos y líneas de pedido, y SQL para el resto de entidades, se basa en consideraciones específicas relacionadas con la estructura y las operaciones previstas en el sistema.

Modelo Relacional para Pedidos y Líneas de Pedido:

Relaciones Complejas: El modelo relacional es especialmente adecuado cuando existen relaciones complejas entre las entidades. En el caso de los pedidos y líneas de pedido, donde se pueden tener múltiples productos asociados a un solo pedido, el modelo relacional proporciona una representación clara y eficiente de estas relaciones.

Consistencia y Normalización: La normalización inherente al modelo relacional ayuda a mantener la consistencia y la integridad de los datos. Al gestionar pedidos, donde es crucial mantener la coherencia de la información, la normalización contribuye a evitar redundancias y posibles incongruencias.

SQL para el Resto de Entidades:

Versatilidad y Escalabilidad: El uso de SQL permite gestionar de manera eficiente una variedad de operaciones en las diferentes entidades del sistema, desde usuarios y tiendas hasta libros y categorías. SQL es conocido por su versatilidad y escalabilidad, lo que facilita la manipulación y consulta de datos en un amplio espectro de situaciones.

Consulta y Manipulación de Datos: SQL proporciona un lenguaje poderoso para la consulta y manipulación de datos. Esto es esencial para operaciones como la obtención de información del perfil de un usuario, la actualización de datos de una tienda o la gestión de libros y categorías.

Dependencias

  • Spring Boot Starter Data JPA: Facilita el acceso a datos mediante Java Persistence API (JPA), permitiendo una integración eficiente con bases de datos relacionales en aplicaciones Spring.
  • Spring Boot Starter Web: Proporciona configuraciones predeterminadas para el desarrollo de aplicaciones web con Spring MVC. Incluye todo lo necesario para manejar solicitudes HTTP y construir aplicaciones web.
  • Spring Boot Starter Cache: Integra la capa de caché en la aplicación, lo que permite mejorar el rendimiento almacenando en caché resultados de operaciones costosas, reduciendo así la carga en recursos.
  • Spring Boot Starter Validation: Proporciona funcionalidades para la validación de datos en la aplicación, asegurando la integridad y consistencia de los datos ingresados.
  • Spring Boot Starter Test: Incluye dependencias necesarias para realizar pruebas en aplicaciones Spring Boot, facilitando la escritura y ejecución de pruebas unitarias y de integración.
  • Jackson Dataformat XML: Habilita el manejo de datos en formato XML mediante la biblioteca Jackson, permitiendo la serialización y deserialización de objetos Java en formato XML.
  • Spring Boot Starter Websocket: Proporciona soporte para WebSocket en aplicaciones Spring Boot, permitiendo la comunicación bidireccional entre el cliente y el servidor en tiempo real.
  • Jackson Datatype JSR310: Extiende la biblioteca Jackson para proporcionar soporte adicional para tipos de datos de la API de fecha y hora de Java (JSR-310), como LocalDate y LocalDateTime.
  • Spring Boot Starter Security: Facilita la integración de la seguridad en la aplicación, permitiendo la configuración de autenticación y autorización.
  • Spring Security Test: Proporciona herramientas y utilidades para realizar pruebas de seguridad en aplicaciones Spring.
  • Java JWT (JSON Web Tokens): Ofrece soporte para la creación y validación de tokens JWT, utilizados comúnmente en la autenticación y autorización de aplicaciones.
  • SpringDoc OpenAPI Starter Webmvc UI: Integra la generación de documentación OpenAPI (anteriormente Swagger) para la API de la aplicación, facilitando la comprensión y prueba de la API.
  • Spring Boot Starter Data MongoDB: Facilita el acceso a datos en bases de datos MongoDB en aplicaciones Spring Boot.
  • de.flapdoodle.embed.mongo: Proporciona herramientas para embeber una instancia de MongoDB durante las pruebas, eliminando la necesidad de una instancia externa para pruebas de integración.
  • H2 Database (Runtime): Incorpora la base de datos H2 en tiempo de ejecución, una base de datos en memoria útil para desarrollo y pruebas.
  • Lombok (Compile-Only y Annotation Processor): Simplifica la creación de clases Java mediante anotaciones, reduciendo la necesidad de escribir código boilerplate y mejorando la legibilidad del código.

Lista de Endpoints

Shops:

  • GET /api/shops/{id}: Obtiene una tienda por su ID.
  • PUT /api/shops/{id}: Actualiza una tienda existente.
  • DELETE /api/shops/{id}: Elimina una tienda por su ID.
  • GET /api/shops: Obtiene todas las tiendas.
  • POST /api/shops: Crea una nueva tienda.
  • DELETE /api/shops/{id}/clients/{clientId}: Elimina un cliente de una tienda.
  • PATCH /api/shops/{id}/clients/{clientId}: Añade un cliente a una tienda.
  • DELETE /api/shops/{id}/books/{bookId}: Elimina un libro de una tienda.
  • PATCH /api/shops/{id}/books/{bookId}: Añade un libro a una tienda.

Publishers:

  • GET /api/publishers/{id}: Obtiene una editorial dado un ID.
  • PUT /api/publishers/{id}: Actualiza una editorial.
  • DELETE /api/publishers/{id}: Elimina una editorial.
  • GET /api/publishers: Obtiene todas las editoriales.
  • POST /api/publishers: Crea una editorial.
  • PATCH /api/publishers/image/{id}: Actualiza la imagen de una editorial.

Orders:

  • GET /api/orders/{id}: Obtiene un pedido dado un ID.
  • PUT /api/orders/{id}: Actualiza un pedido.
  • DELETE /api/orders/{id}: Elimina un pedido.
  • PUT /api/orders/delete/{id}: Elimina un pedido de manera simulada.
  • GET /api/orders: Obtiene todos los pedidos.
  • POST /api/orders: Crea un pedido.
  • GET /api/orders/user/{id}: Obtiene un pedido dado el ID de un usuario.
  • GET /api/orders/shop/{id}: Obtiene un pedido dado el ID de una tienda.
  • GET /api/orders/client/{id}: Obtiene un pedido dado el ID de un cliente.

Clients:

  • GET /api/clients/{id}: Obtiene un cliente dado un ID.
  • PUT /api/clients/{id}: Actualiza un cliente.
  • DELETE /api/clients/{id}: Elimina un cliente.
  • GET /api/clients: Obtiene todos los clientes.
  • POST /api/clients: Crea un cliente.
  • PATCH /api/clients/{id}/image: Actualiza la imagen de un cliente.
  • GET /api/clients/email/{email}: Obtiene un cliente dado un email.

Categories:

  • GET /api/categories/{id}: Busca una categoría por ID.
  • PUT /api/categories/{id}: Actualiza una categoría.
  • DELETE /api/categories/{id}: Borra una categoría.
  • GET /api/categories: Obtiene todas las categorías.
  • POST /api/categories: Crea una categoría.

Books:

  • GET /api/books/{id}: Busca un libro dado su ID.
  • PUT /api/books/{id}: Actualiza un libro.
  • DELETE /api/books/{id}: Borra un libro.
  • PATCH /api/books/{id}: Actualiza un libro parcialmente.
  • GET /api/books: Obtiene todos los libros.
  • POST /api/books: Crea un libro.
  • PATCH /api/books/image/{id}: Actualiza la imagen de un libro.

Authentication:

  • POST /api/auth/signup: Crea una cuenta.
  • POST /api/auth/signin: Inicia sesión.