fix: main.py con alertas_activas en memoria funcionando
This commit is contained in:
Binary file not shown.
@@ -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)
|
||||
manager.disconnect(websocket, dom.route_id)
|
||||
|
||||
Reference in New Issue
Block a user