From 524b774237d661643955b953fdccef57d8a7d6cf Mon Sep 17 00:00:00 2001 From: hack_21031301_c761d3 <21031301@itcelaya.edu.mx> Date: Sat, 23 May 2026 01:39:43 -0600 Subject: [PATCH] fix: main.py con alertas_activas en memoria funcionando --- backend/__pycache__/main.cpython-312.pyc | Bin 13495 -> 14198 bytes backend/main.py | 53 +++++++++++++++-------- grep | 0 3 files changed, 34 insertions(+), 19 deletions(-) create mode 100644 grep diff --git a/backend/__pycache__/main.cpython-312.pyc b/backend/__pycache__/main.cpython-312.pyc index 4258c8c357d8c0d633af9fafa4a147aa44c56d0c..b6b5fa68ebc72844912ec56225ae185ecb8c91a9 100644 GIT binary patch delta 4235 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 WZQcySrMAdN*rJ5|p$U4TM*at!o$F}; delta 3876 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 A-2eap 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