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:
- Frontend (Single Page Application - SPA): La interfaz de usuario con la que interactúan los estudiantes y administradores. Desarrollada con frameworks modernos como React, Vue, Angular o Svelte (con TypeScript). Se ejecuta localmente a través de su propio servidor de desarrollo (ej.
npm run dev).
- Backend (Python + FastAPI + SQLAlchemy): El núcleo de la aplicación. Maneja la lógica de negocio, la autenticación, la interacción con la base de datos y la comunicación con servicios externos. Se ejecuta localmente con Uvicorn.
- Base de Datos (PostgreSQL): Almacena todos los datos persistentes de la aplicación, como usuarios, cursos, videos, progreso, etc. Se ejecuta localmente (directamente o en Docker).
- Headless CMS (Opcional pero Recomendado): Para gestionar contenido estático o semi-estático como descripciones de cursos, artículos de blog, FAQs, etc., de forma desacoplada. Se ejecuta localmente (ej. Strapi, Directus).
- Servicio de Caché (Redis): Utilizado para mejorar el rendimiento almacenando en caché datos consultados frecuentemente y como message broker para tareas asíncronas. Se ejecuta localmente (directamente o en Docker).
- Cola de Tareas Asíncronas (Celery con Redis): Para manejar operaciones que consumen tiempo y que no necesitan bloquear el flujo principal de la API, como el envío de correos electrónicos o el procesamiento de video post-subida (si no se delega completamente al proveedor).
- Proveedores de Video (MUX/Bunny.net): Servicios externos para el hosting, transcodificación y streaming de video. El backend interactúa con sus APIs a través de Internet.
- Alembic: Herramienta para gestionar las migraciones del esquema de la base de datos SQLAlchemy.
- Docker y Docker Compose (Recomendado): Para orquestar y gestionar los servicios de infraestructura locales (PostgreSQL, Redis, CMS) de forma aislada y reproducible.
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:
- Cliente (Frontend SPA / Cliente API): Realiza peticiones HTTP a los endpoints de la API FastAPI.
- 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.
- 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.
- 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).
- 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.
- 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.
- 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.