El objetivo de este Bootcamp es la construcción de una API Rest utilizando Spring boot como framework de desarrollo. Para ello, se provee este repositorio en gitlab con un proyecto que sirve como base para desarrollar los requerimientos funcionales. Este repositorio se encuentra restringido y, por ende, el desarrollador del bootcamp deberá crear un fork para trabajar.
Los progresos y consultas se realizarán en los espacios de consulta de las clases restantes o a través de Slack. Se estima para la finalización del bootcamp entre 2 y 3 semanas.
Se necesita un sistema de comercio electrónico. Un sistema de comercio electrónico, mejor conocido como E-commerce, es un sistema de compra y venta de productos o servicios que se realiza exclusivamente a través de Internet. Se refiere a las transacciones entre compradores y vendedores mediante una plataforma online que gestiona los cobros y los pagos de manera completamente electrónica. Estos tipos de sistemas presentan múltiples módulos que se enfocan en distintos subdominios del problema: finanzas, stock, etc.
En un principio, cada usuario del sistema puede tener su propio stock de productos en venta. Como primer requerimiento se desea desarrollar el carrito de compras. El mismo se responsabiliza de llevar control de los productos y cantidades que un usuario desea comprarle a otro. A su vez contiene la información del precio total a pagar por dicho carrito.
Tener en cuenta que los productos en stock son dinámicos en terminos de cantidad disponible y precio por unidad.
Debe ser claro, al momento de finalizar una compra de un carrito, cual es el precio actual por unidad, el precio final, y si es posible satisfacer las cantidades requeridas.
Teniendo en cuenta estos requerimientos desde el lado del backend se necesita API que haga una ABM de este carrito de compra. La API debe contener servicios para crear un carrito de compras (con al menos un producto), agregar productos al carrito de compra, eliminar productos, calcular el precio total del carrito de compra y finalizar la compra de un carrito.
En una reunión de planeamiento para el nuevo requerimiento, el equipo de desarrollo acordó utilizar las siguientes tecnologías:
- Spring Boot.
- Postgresql
- Docker
La idea con estas decisiones está en manejar tecnologías open-source que faciliten el desarrollo. A su vez, se establece como convención de arquitectura, la estructura de una arquitectura hexagonal que dirija todo el desarrollo.
Como usuario, quiero obtener un listado de productos con sus cantidades disponibles, para saber qué productos están actualmente en el stock de otro usuario.
-
La API debe devolver una lista de productos, con su precio unitario y cantidad.
-
Si no hay productos disponibles, se debe devolver una lista vacía.
Como usuario, quiero crear un carrito de compra con productos de otro usuario, para poder preparar una compra.
-
La API debe permitir crear un carrito de compra especificando el usuario al que se desea realizar misma.
-
El carrito contiene como minimo, una lista de códigos de productos con sus cantidades.
-
El sistema debe validar que el carrito contenga al menos un producto.
-
El sistema debe validar que cada código de producto pertenezca a un producto existente en ese stock; si no, debe devolver un error indicando el problema.
-
El sistema debe validar que la cantidad solicitada no exceda el stock disponible; si lo hace, debe devolver un error.
-
Las respuestas de error deben ser claras y específicas al problema.
-
En caso de éxito en la creación del carrito, se debe devolver el código del mismo.
Como usuario, quiero agregar un tipo de producto a un carrito de compra existente.
-
La API debe permitir agregar un tipo de producto a un carrito de compra específico.
-
El sistema debe validar que el carrito de compra exista y pertenezca al usuario que realiza la operación, también que el tipo de producto que se agrega, pertenezca al stock del usuario al que se esta realizando la compra; en caso contrario, debe devolver el error especifico.
-
El sistema debe validar que la cantidad de unidades del tipo de producto a agregar al carrito no exceda el stock disponible; si lo hace, debe devolver un error.
Como usuario, quiero modificar la cantidad de unidades de un tipo de producto al carrito de compra, para ajustar mi pedido.
-
La API debe permitir modificar la cantidad unidades de un tipo de producto de un carrito de compra específico.
-
El sistema debe validar que el carrito de compra exista, que pertenezca al usuario asociado y el tipo de producto ya esté precargado en el carrito; si no, debe devolver un error.
Como usuario, quiero eliminar un tipo de producto en un carrito de compra, para ajustar mi pedido.
-
La API debe permitir eliminar un tipo de producto en un carrito de compra específico.
-
El sistema debe validar que el carrito de compra exista y pertenezca al usuario asociado; también que el tipo de producto a eliminar, pertenezca actualmente al carrito, si no, debe devolver un error.
Como usuario, quiero solicitar el estado de un carrito para hacer la compra.
-
El sistema debe validar que el carrito de compra exista y pertenezca al usuario asociado; si no, debe devolver un error.
-
La API debe permitir validar si la cantidad solicitada de cada tipo de producto puede ser satisfacida por el stock actual. si no, debe devolver la información del faltante.
-
La API debe permitir devolver el precio por unidad de cada producto solicitado.
-
La API debe permitir calcular el costo total de los productos en un carrito de compra específico.
Como usuario, quiero finalizar mi compra, para completar el proceso de compra.
-
La API debe permitir finalizar una compra para un carrito de compra específico.
-
El sistema debe validar que el carrito de compra exista y pertenezca al usuario asociado; si no, debe devolver un error.
-
El sistema debe validar que el carrito de compra pueda ser satisfacido en términos de stock; si no, debe devolver un error.
-
El sistema debe validar que el estado del carrito que el usuario obtuvo coincida con el estado de la compra que va a realizar (precio unirario / precio total); si no, debe devolver un error.
-
Al finalizar la compra, el sistema debe actualizar el stock de los productos.
-
El carrito debe ser procesado, impidiendo operaciones sobre él.
Como desarrollador, quiero que los datos se almacenen de manera persistente, para que el sistema mantenga su estado tras reinicios.
- Se debe utilizar el contenedor de PostgreSQL disponible en el repositorio para la persistencia de datos.
-
Documentación: Cada endpoint debe estar debidamente documentado, incluyendo detalles como parámetros, respuestas esperadas, errores posibles y ejemplos de uso.
-
Pruebas unitarias: Cada funcionalidad debe estar cubierta con pruebas unitarias para verificar su funcionamiento y la validación de los criterios de aceptación.
Estas sugerencias no pretenden ser completas, solo una guía parcial ilustrativa.
Endpoints
GET /api/products
- Obtener listado de productos
> 404 "No hay productos disponibles."
POST /api/carts
- Crear un carrito de compra dado un id de usuario vendedor
> 400 "El carrito debe contener al menos un producto."
POST /api/carts/{cartId}/products/{productId}
- Agregar un tipo de producto al carrito de compra
> 400 "La cantidad de productos debe ser mayor a cero."
> 403 "El carrito no pertence al usuario"
> 404 "Producto no encontrado."
> 404 "Carrito no encontrado."
> 409 "Cantidad solicitada excede el stock disponible."
PUT /api/carts/{cartId}/products/{productId}
- Editar un tipo de producto al carrito de compra
> 400 "La cantidad de productos debe ser mayor a cero."
> 403 "El carrito no pertence al usuario"
> 404 "Producto no encontrado."
> 404 "Carrito no encontrado."
> 409 "Cantidad solicitada excede el stock disponible."
DELETE /api/carts/{cartId}/products/{productId}
- Eliminar productos del carrito de compra
> 403 "El carrito no pertence al usuario"
> 404 "Producto no encontrado."
> 404 "Carrito no encontrado."
GET /api/carts/{cartId}
- Calcular el estado del carrito de compra
> 403 "El carrito no pertence al usuario"
> 404 "Carrito no encontrado."
POST /api/carts/{cartId}/checkout
- Finalizar compra
> 403 "El carrito no pertence al usuario"
> 422 "Estado del carrito desactualizado con respecto al precio por unidad."
> 422 "Stock insuficiente para completar la compra."
> 404 "Carrito no encontrado."
Producto:
[
{
"id": 1,
"name": "Producto A",
"quantity": 100,
"price": 350
},
{
"id": 2,
"name": "Producto B",
"quantity": 50,
"price": 2350
}
]
Carrito:
{
"products": [
{
"productId": 1,
"quantity": 2
},
{
"productId": 2,
"quantity": 1
}
]
}
Para garantizar una experiencia consistente para los consumidores de la API, se puede estandarizar el formato de las respuestas de error. Esto facilitará el manejo de errores en el lado del cliente y mejorará la depuración.
Todas las respuestas de error podrían tener una estructura como esta:
{
"error": {
"codigo": "ERROR_CODE",
"mensaje": "Descripción detallada del error",
"detalles": {
// Información adicional específica del error (opcional)
}
}
}
INVALID_INPUT
: Datos de entrada inválidosRESOURCE_NOT_FOUND
: Recurso no encontradoINSUFFICIENT_STOCK
: Stock insuficienteUNAUTHORIZED
: No autorizadoCART_MISMATCH
: El carrito no pertenece al usuarioOUTDATED_CART_STATE
: Estado del carrito desactualizado
Los requerimientos son presentados en forma de User Stories. Estas deben ser analizadas y desglosadas en tareas concretas de desarrollo para así poder brindar visibilidad del trabajo en progreso y el trabajo pendiente. El proyecto particular dentro de Jira donde se realice el seguimiento y avance del bootcamp quedará a elección del de los integrantes del gurpo.
Se espera que se tenga una mentalidad orientada a la integración y entrega continua de funcionalidades (CI/CD). Por ende, los commits en el repositorio se espera que sean pequeños y legibles para poder comprender una nueva versión estable del sistema que se está desarrollando. Cada uno de estos commits debe corresponder con una tarea en Jira mediante un identificador como prefijo en el mensaje del commit.
Ejemplo de formato: EC-[nro_tarea_jira] [Descripción de la funcionalidad que incorpora]
De esta manera se puede tener trazabilidad entre los requerimientos y los desarrollos incluidos en el repositorio.