fix: main.py con alertas_activas en memoria funcionando

This commit is contained in:
2026-05-23 01:39:43 -06:00
parent 80687b9f2c
commit 524b774237
3 changed files with 34 additions and 19 deletions

View File

@@ -3,9 +3,8 @@ from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy.orm import Session
from apscheduler.schedulers.background import BackgroundScheduler
from database import engine, get_db
from typing import Dict, Set
from typing import Dict, Set, Optional
import asyncio
import json
import models, schemas, auth, simulator
models.Base.metadata.create_all(bind=engine)
@@ -15,6 +14,8 @@ app = FastAPI(title="HackOnLinces 2026 - Recolección de Residuos")
app.add_middleware(CORSMiddleware, allow_origins=["*"],
allow_methods=["*"], allow_headers=["*"])
alertas_activas: Dict[str, dict] = {}
class ConnectionManager:
def __init__(self):
self.active_connections: Dict[str, Set[WebSocket]] = {}
@@ -113,19 +114,6 @@ def get_eta(domicilio_id: int,
raise HTTPException(status_code=404, detail="Ruta no encontrada")
return {**eta, "route_id": dom.route_id, "colonia": dom.colonia}
@app.get("/alertas/operativa/activa")
def get_alerta_activa(
route_id: str,
current_user=Depends(auth.get_current_user),
db: Session = Depends(get_db)
):
dom = db.query(models.Domicilio).filter_by(
usuario_id=current_user.id, route_id=route_id
).first()
if not dom:
raise HTTPException(status_code=403, detail="Sin acceso")
return {"activa": False, "mensaje": None}
@app.post("/reportes")
def crear_reporte(
domicilio_id: int,
@@ -155,13 +143,36 @@ def crear_alerta_operativa(
estado = db.query(models.EstadoRuta).filter_by(route_id=route_id).first()
if not estado:
raise HTTPException(status_code=404, detail="Ruta no encontrada")
return {
alertas_activas[route_id] = {
"route_id": route_id,
"tipo": tipo,
"mensaje": mensaje,
"evento": "ALERTA_OPERATIVA",
"estado": "ENVIADA"
"activa": True
}
return alertas_activas[route_id]
@app.delete("/alertas/operativa/{route_id}")
def eliminar_alerta_operativa(route_id: str):
if route_id in alertas_activas:
del alertas_activas[route_id]
return {"mensaje": "Alerta eliminada"}
@app.get("/alertas/operativa/activa")
def get_alerta_activa(
route_id: str,
current_user=Depends(auth.get_current_user),
db: Session = Depends(get_db)
):
dom = db.query(models.Domicilio).filter_by(
usuario_id=current_user.id, route_id=route_id
).first()
if not dom:
raise HTTPException(status_code=403, detail="Sin acceso")
alerta = alertas_activas.get(route_id)
if alerta:
return alerta
return {"activa": False, "mensaje": None}
@app.websocket("/ws/eta/{domicilio_id}")
async def websocket_eta(websocket: WebSocket, domicilio_id: int,
@@ -190,6 +201,10 @@ async def websocket_eta(websocket: WebSocket, domicilio_id: int,
await asyncio.sleep(30)
eta = simulator.get_eta(dom.route_id, db)
if eta:
await websocket.send_json({**eta, "route_id": dom.route_id, "colonia": dom.colonia})
payload = {**eta, "route_id": dom.route_id, "colonia": dom.colonia}
alerta = alertas_activas.get(dom.route_id)
if alerta:
payload["alerta_operativa"] = alerta
await websocket.send_json(payload)
except WebSocketDisconnect:
manager.disconnect(websocket, dom.route_id)

0
grep Normal file
View File