feat: Complete code integration of modules (#18)

The complete code integration is done.

Co-authored-by: Sagnik <sagnik7896@gmail.com>
Reviewed-on: sagnik/Project_Velocity#18
This commit is contained in:
2026-04-12 19:20:14 +05:30
parent 248d92042f
commit 4645ff737b
27 changed files with 3393 additions and 50 deletions

View File

@@ -12,7 +12,7 @@ import json
import asyncio
import logging
from contextlib import asynccontextmanager
from datetime import datetime
from datetime import UTC, datetime
from typing import Set
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
@@ -21,10 +21,13 @@ from fastapi.staticfiles import StaticFiles
from dotenv import load_dotenv
from backend.api.routes_catalyst import router as catalyst_router
from backend.api.routes_crm import crm_router, analytics_router
from backend.api.routes_oracle import router as oracle_helper_router
from backend.auth.dependencies import (
create_access_token, verify_password, get_current_user
)
from backend.db.pool import create_pool, close_pool
from backend.oracle.router_v1 import router as oracle_v1_router
from backend.routers.cctv import router as cctv_router
from backend.routers.scenes import router as scenes_router
from backend.routers.videos import router as videos_router
@@ -86,6 +89,10 @@ if os.path.isdir(ASSET_DIR):
# ── Routers ───────────────────────────────────────────────────────────────────
app.include_router(catalyst_router, prefix="/api/catalyst", tags=["Catalyst"])
app.include_router(crm_router, prefix="/api", tags=["CRM"])
app.include_router(analytics_router, prefix="/api/analytics", tags=["Analytics"])
app.include_router(oracle_helper_router, prefix="/api/oracle", tags=["Oracle"])
app.include_router(oracle_v1_router, prefix="/api/oracle/v1", tags=["Oracle V1"])
app.include_router(sentinel_router, prefix="/api/sentinel", tags=["Sentinel"])
app.include_router(cctv_router, prefix="/api/cctv", tags=["CCTV"])
app.include_router(scenes_router, prefix="/api/scenes", tags=["Scenes"])
@@ -165,6 +172,30 @@ class _CatalystManager:
_catalyst_mgr = _CatalystManager()
class _CRMManager:
def __init__(self) -> None:
self.active: Set[WebSocket] = set()
async def connect(self, ws: WebSocket) -> None:
await ws.accept()
self.active.add(ws)
def disconnect(self, ws: WebSocket) -> None:
self.active.discard(ws)
async def broadcast(self, payload: dict) -> None:
dead: Set[WebSocket] = set()
for ws in self.active:
try:
await ws.send_text(json.dumps(payload))
except Exception:
dead.add(ws)
self.active -= dead
_crm_mgr = _CRMManager()
@app.websocket("/ws/catalyst")
async def catalyst_ws(ws: WebSocket) -> None:
await _catalyst_mgr.connect(ws)
@@ -176,13 +207,31 @@ async def catalyst_ws(ws: WebSocket) -> None:
_catalyst_mgr.disconnect(ws)
@app.websocket("/ws/crm")
async def crm_ws(ws: WebSocket) -> None:
await _crm_mgr.connect(ws)
await _crm_mgr.broadcast(
{
"type": "crm_presence",
"connected_clients": len(_crm_mgr.active),
"timestamp": datetime.now(UTC).isoformat(),
}
)
try:
while True:
message = await ws.receive_text()
await ws.send_text(json.dumps({"type": "crm_ack", "data": message}))
except WebSocketDisconnect:
_crm_mgr.disconnect(ws)
async def broadcast_live_event(event_type, message, campaign_name=None, value=None):
payload = {
"type": event_type,
"message": message,
"campaignName": campaign_name,
"value": value,
"timestamp": datetime.utcnow().isoformat(),
"timestamp": datetime.now(UTC).isoformat(),
}
await _catalyst_mgr.broadcast(payload)
@@ -190,6 +239,17 @@ async def broadcast_live_event(event_type, message, campaign_name=None, value=No
app.state.broadcast_live_event = broadcast_live_event
async def broadcast_crm_event(payload: dict) -> None:
enriched = {
**payload,
"timestamp": datetime.now(UTC).isoformat(),
}
await _crm_mgr.broadcast(enriched)
app.state.broadcast_crm_event = broadcast_crm_event
# ── Health ─────────────────────────────────────────────────────────────────────
@app.get("/health", tags=["Health"])
@@ -201,6 +261,6 @@ async def health() -> dict:
"service": "velocity-backend",
"version": "2.0.0",
"db_pool": "connected" if db_ok else "unavailable",
"timestamp": datetime.utcnow().isoformat(),
"timestamp": datetime.now(UTC).isoformat(),
}