Skip to content

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.

  • 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:

  1. models.py: Definiciones de tablas de base de datos (SQLAlchemy).
  2. schemas.py: Modelos de validación de datos (Pydantic) para entrada y salida de API.
  3. service.py: Capa de lógica de negocio (donde ocurre la “magia”).
  4. router.py: Definición de endpoints y orquestación de servicios.
  5. __init__.py: Exportación selectiva de componentes clave.

Heredamos de Base para asegurar que las migraciones de Alembic detecten los cambios.

from sqlalchemy import Column, String, Integer, ForeignKey
from 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)

Aquí es donde se implementan las reglas de negocio. Evita poner lógica compleja directamente en el router.

from sqlalchemy.ext.asyncio import AsyncSession
from .models import NewFeature
from .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 obj

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.

app/main.py
from app.modules.mi_modulo.router import router as mi_modulo_router
# ... dentro de la configuración de api_v1_router
api_v1_router.include_router(mi_modulo_router)

Creating New Module Flow