bLOQUE p1 BACKEND Y SEGURIDAD, AUTENTICACION CON SUPABASE. jwt. RBAC CRUD

This commit is contained in:
shinra32
2026-05-22 19:45:05 -06:00
parent 5dc8390855
commit fc28333e3f
52 changed files with 1605 additions and 109 deletions

View File

@@ -1,58 +1,72 @@
from contextlib import asynccontextmanager
from fastapi import FastAPI
import os
from starlette.middleware.cors import CORSMiddleware
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from app.core.config import settings
from app.api.eta import router as eta_router
from app.api.auth import router as auth_router
from app.api.addresses import router as addresses_router
from app.api.colonias import router as colonias_router
from app.services import simulation, notifications
scheduler = AsyncIOScheduler()
@asynccontextmanager
async def lifespan(app: FastAPI):
"""
Maneja el ciclo de vida de la aplicación.
"""
print("Iniciando aplicación: Backend Sistema de Recolección...")
# 1. Cargar datos de simulación
simulation.load_data()
simulation.start_simulation_state()
# 2. Inicializar Firebase (o Mock si no hay credenciales)
# Ruta relativa correcta cuando se ejecuta desde la carpeta /backend
cred_path = os.environ.get("FIREBASE_CREDENTIALS_PATH", "secrets/firebase-adminsdk.json")
notifications.init_firebase(cred_path)
# 3. Arrancar el scheduler de simulación
tick_seconds = int(os.environ.get("SIMULATION_TICK_SECONDS", 15))
scheduler.add_job(simulation.tick, 'interval', seconds=tick_seconds, id='simulation_tick')
notifications.init_firebase(settings.FIREBASE_CREDENTIALS_PATH)
scheduler.add_job(
simulation.tick,
"interval",
seconds=settings.SIMULATION_TICK_SECONDS,
id="simulation_tick",
)
scheduler.start()
print(f"Simulador de rutas iniciado. Avanzando cada {tick_seconds} segundos.")
print(f"Simulador iniciado. Tick cada {settings.SIMULATION_TICK_SECONDS}s.")
yield
print("Apagando aplicación y deteniendo simulador...")
scheduler.shutdown()
app = FastAPI(
title="API - Recolección Inteligente y Privada",
title="API Recolección Inteligente y Privada",
description="Backend para el sistema de recolección de residuos con privacidad por diseño.",
version="1.0.0",
lifespan=lifespan
lifespan=lifespan,
)
# Incluir routers de la API
app.include_router(eta_router)
# CORS — necesario para el simulador web y el cliente Flutter
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # En producción limitar a dominios reales
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(auth_router)
app.include_router(addresses_router)
app.include_router(eta_router)
app.include_router(colonias_router)
# Endpoints de prueba base
@app.get("/")
def read_root():
return {
"status": "ok",
"message": "Backend operativo. Regla Innegociable 1: NUNCA se devuelven coordenadas del camión al ciudadano."
"status": "ok",
"message": "Backend operativo. Regla innegociable #1: NUNCA se devuelven coordenadas al ciudadano.",
}
@app.get("/health")
def health_check():
return {"status": "healthy"}
return {"status": "healthy"}