Sección 1: Arquitectura del Sistema (Local SaaS de Academia)

La aplicación está diseñada como un sistema modular con varios componentes clave que interactúan para proporcionar una plataforma de aprendizaje en línea. El enfoque principal de esta plantilla es permitir un desarrollo y pruebas locales robustas antes del despliegue en la nube.

1.1 Descripción General de los Componentes

El sistema se compone de los siguientes elementos principales, muchos de los cuales se ejecutan localmente durante el desarrollo:

1.2 Interacciones Clave del Backend

El backend es el centro neurálgico de la aplicación. Sus interacciones internas siguen un patrón claro de capas para una buena separación de responsabilidades:

  1. Cliente (Frontend SPA / Cliente API): Realiza peticiones HTTP a los endpoints de la API FastAPI.
  2. API Endpoints (app/api/v1/endpoints/*.py):
    • Definidos usando routers FastAPI (APIRouter).
    • Reciben las peticiones HTTP.
    • Utilizan Esquemas Pydantic (app/schemas/*.py) para validar los datos de entrada (cuerpos de solicitud, parámetros de consulta/ruta) y para serializar los datos de salida.
    • Gestionan la autenticación y autorización utilizando dependencias.
    • Delegan la lógica de negocio a las clases de Servicio.
  3. Dependencias (app/api/v1/deps.py):
    • Funciones reutilizables que FastAPI inyecta en los endpoints.
    • Gestionan la obtención de la sesión de base de datos (DBSession), el usuario autenticado actual (CurrentUser, CurrentActiveUser, CurrentActiveSuperuser), y la instanciación de los servicios.
  4. Servicios (app/services/*.py):
    • Contienen la lógica de negocio principal de la aplicación.
    • Reciben datos (a menudo como esquemas Pydantic) desde los endpoints.
    • Interactúan con los Modelos SQLAlchemy (app/models/*.py) para realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) en la base de datos.
    • Manejan transacciones de base de datos (commits, rollbacks).
    • Pueden interactuar con otros servicios o APIs externas (ej. MUX/Bunny, Headless CMS).
  5. Modelos SQLAlchemy (app/models/*.py):
    • Definen la estructura de las tablas de la base de datos y las relaciones entre ellas usando el ORM SQLAlchemy (con el estilo declarativo anotado de SQLAlchemy 2.0).
    • Heredan de Base (definida en app/core/db.py).
    • Son utilizados por los servicios para consultar y manipular datos.
  6. Base de Datos (PostgreSQL):
    • El motor de SQLAlchemy (definido en app/core/db.py) gestiona la conexión.
    • Persiste los datos de la aplicación.
  7. Núcleo (app/core/*.py):
    • config.py: Carga y valida la configuración de la aplicación desde variables de entorno (.env) usando pydantic-settings.
    • db.py: Configura la conexión a la base de datos SQLAlchemy (motor, sesión, base declarativa).
    • security.py: Maneja la creación y verificación de tokens JWT, hashing de contraseñas y otras lógicas de seguridad (como la verificación de firmas de webhooks).

1.3 Diagrama de Flujo de Componentes del Backend

A continuación, se presenta un diagrama simplificado utilizando la sintaxis de Mermaid.js que puedes copiar y pegar en un editor compatible con Mermaid (como editores de Markdown online, o integraciones en VS Code) para visualizarlo:

graph TD subgraph "Cliente" F["Frontend SPA / Cliente API"] end subgraph "Backend FastAPI" A["API Endpoints
(app/api/v1/endpoints/*.py)"] -- "Petición HTTP" --> D{"Dependencias
(app/api/v1/deps.py)"} D -- "Obtiene Sesión DB" --> SDB["Sesión DB
(SQLAlchemy AsyncSession)"] D -- "Obtiene Usuario Actual" --> CU["Usuario Actual"] D -- "Instancia" --> SVC["Servicios
(app/services/*.py)"] A -- "Usa Esquemas Pydantic (Entrada)" --> PYE["Esquemas Pydantic
(app/schemas/*.py)"] SVC -- "Lógica de Negocio" --> SVC SVC -- "Interactúa con" --> M["Modelos SQLAlchemy
(app/models/*.py)"] M -- "ORM" --> DB[("PostgreSQL DB")] % Define el nodo DB con su texto SVC -- "Devuelve Datos (Modelos ORM)" --> A A -- "Usa Esquemas Pydantic (Salida)" --> PYR["Esquemas Pydantic
(app/schemas/*.py)"] A -- "Respuesta HTTP" --> F subgraph "Núcleo (app/core)" CONF["config.py
(Settings)"] DBCORE["db.py
(Engine, SessionLocal, Base)"] SEC["security.py
(JWT, Hash, Webhooks)"] end A --> CONF SVC --> CONF M --> DBCORE D --> DBCORE SVC --> SEC D --> SEC end subgraph "Servicios Externos / Infraestructura Local" DB % Simplemente referencia el nodo DB definido anteriormente para incluirlo en este subgrafo CMS["Headless CMS
(Local/API)"] VIDP["Proveedor de Video
(MUX/Bunny API)"] REDIS["Redis
(Cache/Broker)"] CEL["Celery Workers
(Tareas Asíncronas)"] end SVC --> CMS SVC --> VIDP SVC --> REDIS SVC --> CEL style F fill:#f9f,stroke:#333,stroke-width:2px style A fill:#bbf,stroke:#333,stroke-width:2px style D fill:#lightgrey,stroke:#333,stroke-width:1px style SVC fill:#ccf,stroke:#333,stroke-width:2px style M fill:#cdf,stroke:#333,stroke-width:2px style PYE fill:#def,stroke:#333,stroke-width:1px style PYR fill:#def,stroke:#333,stroke-width:1px style DB fill:#ccc,stroke:#333,stroke-width:2px % Estilo para el nodo DB style CMS fill:#cfc,stroke:#333,stroke-width:1.5px style VIDP fill:#cfc,stroke:#333,stroke-width:1.5px style REDIS fill:#fcc,stroke:#333,stroke-width:1.5px style CEL fill:#fcc,stroke:#333,stroke-width:1.5px style "Núcleo (app/core)" fill:#eee,stroke:#333,stroke-width:1px,color:#333 style "Servicios Externos / Infraestructura Local" fill:#eee,stroke:#333,stroke-width:1px,color:#333

Este diagrama ilustra cómo una petición fluye desde el cliente a través de los endpoints de la API, que utilizan dependencias y servicios para procesar la lógica de negocio, interactuar con los modelos de datos y, finalmente, con la base de datos. Los esquemas Pydantic juegan un papel crucial en la validación y serialización de datos en la capa de API. Los servicios del núcleo proporcionan la configuración y funcionalidades base.