Creación de un Nuevo Módulo
Yastubo Backend está diseñado bajo una arquitectura modular estricta. Cada funcionalidad de negocio (ej. Seguros, IA, Pagos) reside en su propio espacio dentro de app/modules. Esta guía explica cómo crear un nuevo módulo desde cero siguiendo los estándares del proyecto.
Core Benefits / Key Features
Section titled “Core Benefits / Key Features”- Aislamiento de Dominio: Los cambios en un módulo no afectan lateralmente a otros.
- Escalabilidad Horizontal: Facilita la división del sistema en microservicios si fuera necesario en el futuro.
- Testing Granular: Cada módulo tiene su propio set de pruebas unitarias e integración.
- Consistencia: Todos los módulos siguen el mismo patrón de diseño (Service-Repository-Schema).
Deep Dive Técnico: Estructura de un Módulo
Section titled “Deep Dive Técnico: Estructura de un Módulo”Un módulo estándar debe contener los siguientes archivos:
models.py: Definiciones de tablas de base de datos (SQLAlchemy).schemas.py: Modelos de validación de datos (Pydantic) para entrada y salida de API.service.py: Capa de lógica de negocio (donde ocurre la “magia”).router.py: Definición de endpoints y orquestación de servicios.__init__.py: Exportación selectiva de componentes clave.
1. Definición del Modelo (models.py)
Section titled “1. Definición del Modelo (models.py)”Heredamos de Base para asegurar que las migraciones de Alembic detecten los cambios.
from sqlalchemy import Column, String, Integer, ForeignKeyfrom app.shared.base_model import Base, TimestampMixin
class NewFeature(Base, TimestampMixin): __tablename__ = "new_features"
id = Column(Integer, primary_key=True, index=True) name = Column(String, nullable=False) company_id = Column(Integer, ForeignKey("companies.id"), nullable=False)2. Capa de Servicio (service.py)
Section titled “2. Capa de Servicio (service.py)”Aquí es donde se implementan las reglas de negocio. Evita poner lógica compleja directamente en el router.
from sqlalchemy.ext.asyncio import AsyncSessionfrom .models import NewFeaturefrom .schemas import FeatureCreate
async def create_feature(db: AsyncSession, data: FeatureCreate, company_id: int): # Lógica de negocio aquí obj = NewFeature(**data.model_dump(), company_id=company_id) db.add(obj) await db.commit() await db.refresh(obj) return objEjemplo Práctico: Registro del Módulo
Section titled “Ejemplo Práctico: Registro del Módulo”Una vez creado el módulo en app/modules/mi_modulo, debemos registrarlo en el router principal de la aplicación en app/main.py.
from app.modules.mi_modulo.router import router as mi_modulo_router
# ... dentro de la configuración de api_v1_routerapi_v1_router.include_router(mi_modulo_router)Diagrama de Proceso de Extensión
Section titled “Diagrama de Proceso de Extensión”