diff --git a/backend/__pycache__/main.cpython-312.pyc b/backend/__pycache__/main.cpython-312.pyc index 4258c8c..b6b5fa6 100644 Binary files a/backend/__pycache__/main.cpython-312.pyc and b/backend/__pycache__/main.cpython-312.pyc differ diff --git a/backend/main.py b/backend/main.py index a873b4f..8df1b51 100644 --- a/backend/main.py +++ b/backend/main.py @@ -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) \ No newline at end of file + manager.disconnect(websocket, dom.route_id) diff --git a/grep b/grep new file mode 100644 index 0000000..e69de29