Este documento sirve como contexto técnico y funcional para inicializar el proyecto. Está diseñado para pegarse como README.md o como input inicial en Cursor, con el objetivo de que cualquier generador/colaborador entienda qué se va a construir, con qué stack, y cómo debe organizarse el código.
Construir un backend en Flask que consuma FantasyNerds NBA API para:
-
Obtener los juegos del día.
-
Obtener lineups por juego (al menos starters).
-
Exponer endpoints internos propios para:
- listar juegos del día,
- expandir un juego,
- ver starters por equipo.
⚠️ Este MVP NO implementa apuestas, odds ni lógica de edge. Solo prepara la base de datos estructurada (schedule + starters).
- Python 3.12+
- Flask (framework HTTP)
- Dockerfile
- docker-compose.yml
- .env para configuración
- Arquitectura DDD (Domain Driven Design)
- Gestión simple de dependencias:
requirements.txt
- Tener lista toda la estructura DDD.
- Tener el servidor Flask corriendo vía Docker Compose.
- Exponer un único endpoint de prueba:
GET /health
Respuesta:
{
"status": "ok",
"message": "hello from flask"
}- No implementar aún lógica real de NBA ni consumo de FantasyNerds.
- Solo dejar stubs, contratos e interfaces listos.
-
Domain
- Núcleo del negocio.
- Entidades, Value Objects, reglas, contratos (ports).
- ❌ No depende de Flask ni de HTTP.
-
Application
- Casos de uso (services).
- Orquesta Domain + ports.
- No conoce detalles de infraestructura.
-
Infrastructure
- Implementaciones concretas (clientes HTTP, cache, repositorios).
- Aquí vivirá la integración con FantasyNerds.
-
Interface / API
- Flask app, blueprints, controllers.
- Manejo de errores y schemas HTTP.
nba-edge-api/
app/
__init__.py
main.py # create_app() (Flask factory)
config/
__init__.py
settings.py # Carga .env y configura Flask
interface/
__init__.py
http/
__init__.py
blueprints/
__init__.py
health_bp.py # GET /health
nba_bp.py # Placeholder para NBA endpoints
controllers/
__init__.py
health_controller.py
errors/
__init__.py
handlers.py # Error handlers globales
application/
__init__.py
services/
__init__.py
nba_lineups_service.py # Use-case stub
domain/
__init__.py
models/
__init__.py
game.py # Entity stub
team.py # Entity stub
player.py # Entity stub
value_objects/
__init__.py
game_id.py # VO stub
team_abbr.py # VO stub
ports/
__init__.py
fantasynerds_port.py # Interface / contract
exceptions/
__init__.py
domain_exceptions.py
infrastructure/
__init__.py
clients/
__init__.py
fantasynerds_client.py # HTTP client stub
repositories/
__init__.py
lineup_repository.py # Stub
cache/
__init__.py
cache_provider.py # In-memory cache stub
tests/
__init__.py
test_health.py
.env.example
.gitignore
Dockerfile
docker-compose.yml
requirements.txt
README.md
Archivo .env.example:
FLASK_ENV=development
FLASK_DEBUG=1
APP_HOST=0.0.0.0
APP_PORT=8000
# Third-party
FANTASYNERDS_API_KEY=replace_me
# Future use
CACHE_TTL_SECONDS=120
- Base:
python:3.12-slim - Instalar dependencias desde
requirements.txt - Copiar código
- Exponer
APP_PORT - Comando de arranque con Flask (via
create_app())
- Servicio
api - Cargar variables desde
.env - Mapear puertos
${APP_PORT}:${APP_PORT} - Volumen montado para desarrollo local (opcional, recomendado)
GET /health
Respuesta:
{
"status": "ok",
"message": "hello from flask"
}No se deben crear más endpoints hasta que la estructura esté validada.
- Logging básico a stdout.
- Manejo global de errores (404 / 500) con JSON.
- Separación estricta de capas.
- Nada de lógica de negocio en controllers.
-
Integrar FantasyNerds real (lineups por fecha).
-
Exponer:
GET /nba/games?date=YYYY-MM-DDGET /nba/lineups?date=YYYY-MM-DDGET /nba/games/{gameId}/lineups
-
Integrar APIs de odds (fase 2).
-
Persistir snapshots (opening vs live).
- La app corre con Docker Compose.
/healthresponde correctamente.- La estructura DDD está completa.
- El proyecto está listo para empezar a implementar casos de uso reales.
-
Copy
.env.exampleto.env:cp .env.example .env
-
Build and run with Docker Compose:
docker-compose up --build
-
Test the health endpoint:
curl http://localhost:8000/health
Este documento es la fuente de verdad inicial del proyecto.