bLOQUE p1 BACKEND Y SEGURIDAD, AUTENTICACION CON SUPABASE. jwt. RBAC CRUD
This commit is contained in:
@@ -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"}
|
||||
|
||||
Reference in New Issue
Block a user