Este proyecto es una muestra de uso del paradigma de programación DDD funcional dentro de un Framework como Laravel, del cual es independiente.
Principalmente hay tres partes:
- Servicio
- Repositorio de datos del carrito
- Pasarela de pago
-
DDD: En la carpeta src/app/CartAPI se divide cada componente de la API en sus tres capas principales (Infrastructure => Application => Domain/).
-
Almacenamiento en archivos: Para ejecutar este ejemplo no es necesaria la configuración de bases de datos, ya que el repositorio de almacenamiento es en archivos. Estos archivos se almacenan en src/storage/carts.
-
Pasarela de pagos: La pasarela de pagos es Dummy, y se puede configurar con la pasarela correspondiente.
-
Imagen Docker: build.sh permite la construcción de una imagen de docker con el proyecto totalmente funcional. Es importante recordar que es necesario mapear el puerto 80.
- PHP 8+
Para la construcción de la imagen:
- Bash
- Docker engine instalado en la máquina para la construcción de la imagen
- Clona el repositorio.
- Cambia al directorio del proyecto y crea la imagen docker:
bash ./build.sh
- Ejecuta la imagen de docker:
docker run --rm -p 80:80 cartapi
Para acceder al contenedor en local y las funciones AJAX funcionen correctamente es recomendable realizar el acceso mediante la siguiente dirección: http://domaincontrol.com
En caso contrario la protección CORS podrían bloquear estas peticiones AJAX.
La ejecución de los tests de integración del sistema se realiza mediante artisan, y se encuentran en src/tests.
Se pueden ejecutar entrando en /src y ejecutando:
php artisan test
El archivo principal de test es ControllerTest.php, que comprueba todos los endpoints.
Para simular los objetos con sistemas externos se tienen dos clases simuladas (mocks):
- CartServiceMockup
- PaymentGatewayMockup
Esta API proporciona endpoints para gestionar un carrito de compra.
- Ruta: /api/v1/cart/{id}/list
- Descripción: Obtiene la lista de items del carrito identificado por el
{id}
.
- Ruta: /api/v1/cart/{id}/additem/{productId}
- Descripción: Agrega una unidad del producto identificado por
{productId}
al carrito identificado por el{id}
.
- Ruta: /api/v1/cart/{id}/deleteitem/{productId}
- Descripción: Borra una unidad del producto identificado por
{productId}
del carrito identificado por el{id}
.
- Ruta: /api/v1/cart/{id}/deleteitemall/{productId}
- Descripción: Borra todos los items del producto identificado por
{productId}
del carrito identificado por el{id}
.
- Ruta: /api/v1/cart/{id}/clear
- Descripción: Borra todos los items del carrito identificado por el
{id}
.
- Ruta: /api/v1/cart/{id}/pay
- Descripción: Realiza el pago en la pasarela de pagos para los items en el carrito identificado por el
{id}
.
Este proyecto está licenciado bajo GNU General Public License v3.0.