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 sqlalchemy.orm import Session
|
||||||
from apscheduler.schedulers.background import BackgroundScheduler
|
from apscheduler.schedulers.background import BackgroundScheduler
|
||||||
from database import engine, get_db
|
from database import engine, get_db
|
||||||
from typing import Dict, Set
|
from typing import Dict, Set, Optional
|
||||||
import asyncio
|
import asyncio
|
||||||
import json
|
|
||||||
import models, schemas, auth, simulator
|
import models, schemas, auth, simulator
|
||||||
|
|
||||||
models.Base.metadata.create_all(bind=engine)
|
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=["*"],
|
app.add_middleware(CORSMiddleware, allow_origins=["*"],
|
||||||
allow_methods=["*"], allow_headers=["*"])
|
allow_methods=["*"], allow_headers=["*"])
|
||||||
|
|
||||||
|
alertas_activas: Dict[str, dict] = {}
|
||||||
|
|
||||||
class ConnectionManager:
|
class ConnectionManager:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.active_connections: Dict[str, Set[WebSocket]] = {}
|
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")
|
raise HTTPException(status_code=404, detail="Ruta no encontrada")
|
||||||
return {**eta, "route_id": dom.route_id, "colonia": dom.colonia}
|
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")
|
@app.post("/reportes")
|
||||||
def crear_reporte(
|
def crear_reporte(
|
||||||
domicilio_id: int,
|
domicilio_id: int,
|
||||||
@@ -155,13 +143,36 @@ def crear_alerta_operativa(
|
|||||||
estado = db.query(models.EstadoRuta).filter_by(route_id=route_id).first()
|
estado = db.query(models.EstadoRuta).filter_by(route_id=route_id).first()
|
||||||
if not estado:
|
if not estado:
|
||||||
raise HTTPException(status_code=404, detail="Ruta no encontrada")
|
raise HTTPException(status_code=404, detail="Ruta no encontrada")
|
||||||
return {
|
alertas_activas[route_id] = {
|
||||||
"route_id": route_id,
|
"route_id": route_id,
|
||||||
"tipo": tipo,
|
"tipo": tipo,
|
||||||
"mensaje": mensaje,
|
"mensaje": mensaje,
|
||||||
"evento": "ALERTA_OPERATIVA",
|
"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}")
|
@app.websocket("/ws/eta/{domicilio_id}")
|
||||||
async def websocket_eta(websocket: WebSocket, domicilio_id: int,
|
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)
|
await asyncio.sleep(30)
|
||||||
eta = simulator.get_eta(dom.route_id, db)
|
eta = simulator.get_eta(dom.route_id, db)
|
||||||
if eta:
|
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:
|
except WebSocketDisconnect:
|
||||||
manager.disconnect(websocket, dom.route_id)
|
manager.disconnect(websocket, dom.route_id)
|
||||||
|
|||||||
Reference in New Issue
Block a user