Optime API está diseñada utilizando los principios de arquitectura hexagonal, lo que significa que está organizada en capas desacopladas para facilitar su mantenimiento, escalabilidad y pruebas. Esta arquitectura también incorpora vertical slicing para estructurar el código en funciones por características y screaming architecture para asegurar que el dominio sea el aspecto más evidente del diseño.
- Dominio (Domain)
El dominio es el núcleo de la aplicación, donde se definen las reglas y la lógica de negocio. Es completamente independiente de las tecnologías subyacentes como bases de datos o servidores. Aquí se encuentran las entidades, interfaces de repositorios y excepciones del dominio.
Archivos Clave:
- Entidades: Clases que representan los datos principales de la aplicación, como Notification, Payment, User.
Ejemplo: src/notifications/domain/Notification.py
- **Interfaces de Repositorio:** Definen cómo se accede y manipulan los datos en el almacenamiento sin preocuparse por su implementación.
Ejemplo: `src/notifications/domain/NotificationRepository.py`
- **Excepciones:** Manejan errores específicos del dominio para mantener la consistencia en las reglas de negocio.
Ejemplo: `src/notifications/domain/exceptions.py`
- Aplicación (Application)
Esta capa es responsable de coordinar los casos de uso de la lógica del dominio. Los casos de uso utilizan las entidades del dominio para ejecutar las operaciones necesarias y siguen siendo independientes de la infraestructura (bases de datos, APIs, etc.).
Archivos Clave:
- Casos de Uso: Clases que implementan la lógica para manejar acciones específicas como crear o modificar notificaciones.
Ejemplo: src/notifications/application/NotificationCreator.py
- **Aplicación de Servicios:** Orquestación de operaciones que interactúan con varias entidades del dominio.
Ejemplo: `src/notifications/application/NotificationSender.py`
- Infraestructura (Infrastructure)
Esta capa contiene la implementación concreta de los detalles técnicos como la persistencia de datos (bases de datos), peticiones HTTP y la integración con servicios externos (Mercado Pago, APIs de mensajería, etc.).
Archivos Clave:
- Adaptadores de Repositorio: Implementaciones de las interfaces de repositorio que conectan con la base de datos.
Ejemplo: src/notifications/infrastructure/MySqlNotificationRepository.py
- **Controladores HTTP:** Gestionan las peticiones y respuestas HTTP, exponiendo los endpoints de la API.
Ejemplo: `src/notifications/infrastructure/NotificationRoutes.py`
- **Conexión a Servicios Externos:** Implementaciones que permiten la interacción con APIs externas como Mercado Pago.
Ejemplo: `src/payments/infrastructure/PaymentRoutes.py`
- **Configuraciones de Base de Datos:** Configura la conexión y detalles de la base de datos.
Ejemplo: `src/config/database.py`
Requerimientos:
- MySQL Server
- Python 3.11
- nodejs
- Ngrok
- Channels
Pasos para la Instalación:
-
Clonar el repositorio:
git clone <url-del-repositorio> -
Crear un entorno virtual:
python -m venv venv -
Activar el entorno virtual:
- Windows:
venv\Scripts�ctivate - macOS/Linux:
source venv/bin/activate
- Windows:
-
Instalar las dependencias:
pip install -r requirements.txtonpm installdependiendo la tecnologia del microservicio. -
Ejecutar el script
config/create_db_user.sqlen tu administrador de base de datos. -
Crear el archivo
.envutilizando el ejemplo proporcionado en el proyecto .envExample. -
Configurar los tokens de acceso de servicios externos como Mercado Pago o Meta API en tu archivo
.env. -
Ejecutar las migraciones de la base de datos:
alembic upgrade head -
Iniciar ngrok para exponer tu aplicación:
ngrok http 8000. -
Agregar el URL de ngrok en el archivo
.env. -
Iniciar la aplicación:
uvicorn main:app --reload -
En caso de usar certificados ssl
uvicorn main:app --host 0.0.0.0 --port $PORT --reload --ssl-keyfile=$SSL_KEYFILE --ssl-certfile=$SSL_CERTFILE -
En caso de usar microservicios
uvicorn main:app --reload --port *puerto a usar* -
En caso de usar microservicios
uvicorn main:app --host 0.0.0.0 --port 8000 --reload -
Para poder correr los channels debemos de instalar los siguientes paquetes:
npm install amqplib cors dotenv express mysql2 -
Para ejecutar los channels debemos de escribir los siguientes comandos:
npm run devonodemon server.js -
Testear los endpoints utilizando Postman: Documentación de Postman Api-Optime
Ejecución de Pruebas: Para ejecutar los tests:
- Ejecutar
pytesten el directorio raíz del proyecto para correr las pruebas unitarias. - Integración con GitHub Actions para la ejecución automática de tests en cada push o pull request.