STACK_BACKOFFICE - Documentación para Desarrolladores
Descripción General
Stack de backoffice principal que provee la administración completa de la plataforma MAS10. Gestiona jugadores, equipos, torneos, ligas, fixtures, ejercicios, datos de referencia, autenticación Cognito, CRM, nutrición y productos.
Arquitectura
STACK_BACKOFFICE/
├── backOffice.yaml # Template SAM (~63 funciones Lambda)
├── build_backOffice.sh # Script de build/deploy
├── layer/
│ ├── database_backoffice/ # Lógica de dominio del backoffice
│ │ └── database.py # Operaciones de BD específicas
│ ├── querys_backoffice/ # Templates SQL
│ │ └── query.py
│ ├── response_formatter_backoffice/
│ │ └── response_formatter.py # Formateo de respuestas
│ ├── s3_backoffice/
│ │ └── s3.py # Operaciones S3 (avatares, media)
│ └── utils_backoffice/
│ └── utils.py # Utilidades específicas
└── services/
├── backoffice-categories/ # Categorías deportivas
├── backoffice-cities/ # Ciudades
├── backoffice-cognito/ # Gestión Cognito
├── backoffice-countries/ # Países
├── backoffice-crm/ # CRM
├── backoffice-download/ # Descargas
├── backoffice-exercise/ # Ejercicios de entrenamiento
├── backoffice-fixture/ # Fixtures (generación auto con ChatGPT-4o)
├── backoffice-historic-skills/ # Skills históricas (600s timeout)
├── backoffice-league/ # Ligas
├── backoffice-nutrition/ # Nutrición
├── backoffice-player/ # Jugadores (3 variantes)
├── backoffice-products/ # Productos/tienda
├── backoffice-provinces/ # Provincias
├── backoffice-register/ # Registro de usuarios
├── backoffice-team/ # Equipos
└── backoffice-tournament/ # Torneos
Runtime y Configuración
| Propiedad | Valor |
|---|---|
| Python | 3.13 |
| Arquitectura | ARM64 |
| Timeout default | 30s |
| Memoria default | 256MB |
| Auth | AWS Cognito JWT |
| API Type | Regional REST |
Servicios Destacados
Generación de Fixture con IA
El endpoint POST /backoffice-fixture puede generar fixtures automáticamente usando ChatGPT-4o. Timeout extendido de 600s y 2048MB para esta operación.
Historic Skills
Operación pesada de cálculo de habilidades históricas. Timeout: 600s, Memoria: 2048MB.
Gestión de Jugadores (3 variantes)
backoffice-player/— Jugadores paginados con búsqueda y ordenamientobackoffice-player-v2/— Variante con diferente formato de respuestabackoffice-player-v3/— Versión más reciente con optimizaciones
Capas y Dependencias
Layers usado:
layer_common_313/— Capa compartida Python 3.13common_database/database.py— PostgreSQL operationscommon_httpcaller/locale.py— Response helperscommon_utils/utils.py— JWT parsing, utilitiescommon_aws/aws.py— Secrets Manager, S3, Lambda invocationscommon_query/query.py— SQL templates compartidos
Layer propio:
database_backoffice/database.py— Queries específicas del backofficequerys_backoffice/query.py— Templates SQL del dominioresponse_formatter_backoffice/— Formateo de respuestas para BOs3_backoffice/s3.py— Operaciones S3 (upload de avatares en 3 tamaños)
Tablas de Base de Datos
PostgreSQL (principales):
userprofile— Perfiles de usuarioteam— Equiposteam_userprofile— Relación jugador-equipotournament— Torneosleague— Ligasfixture— Fixturesfixture_info— Información adicional de fixtureexercise— Ejercicios de entrenamientocategory— Categorías deportivascountry,province,city— Datos geográficosnutrition— Datos nutricionalesproduct— Productos/tiendacrm— Datos CRM
Patrones de Código
Handler típico:
def lambda_handler(event, _context):
if event.get('warming'):
return {'statusCode': 200, 'body': 'warm'}
email = utils.get_email_by_token(event)
if email is None:
return locales.get_response_standar(Exception("User not found"), {}, 401)
# Lógica de negocio...
result = common_source.executeQueryNotInjection(sql, params)
return locales.get_response_standar(None, {"data": result}, 200)
Paginación:
page = int(event['queryStringParameters'].get('page', 0))
limit = int(event['queryStringParameters'].get('limit', 50))
offset = page * limit
Upload de avatares (3 tamaños):
# Original
s3.upload_avatar(blob, key)
# 50px thumbnail
s3.upload_avatar_resized(blob, key + "_50", 50)
# 100px thumbnail
s3.upload_avatar_resized(blob, key + "_100", 100)
Seguridad
- Todos los endpoints requieren JWT de Cognito (excepto OPTIONS para CORS)
- SQL injection prevention via
executeQueryNotInjection()con placeholders%(param)s - CORS headers habilitados en todos los endpoints
- Secretos cargados via AWS Secrets Manager
Build y Deploy
cd STACK_BACKOFFICE
sudo bash ./build_backOffice.sh 1 -d # Dev local
sudo bash ./build_backOffice.sh 2 -d # Dev deploy
sudo bash ./build_backOffice.sh 2 -q # QA deploy
sudo bash ./build_backOffice.sh 2 -p # Prod deploy