npv2k1's picture
feat: enhance configuration loading and add image processing endpoints
ddca844
"""FastAPI application factory."""
from typing import List
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi.responses import HTMLResponse
from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Request
from .routes import v1_router
class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)
async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)
manager = ConnectionManager()
templates = Jinja2Templates(directory="templates")
def create_app() -> FastAPI:
"""Create and configure the FastAPI application."""
app = FastAPI()
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.mount("/static", StaticFiles(directory="static"), name="static")
# Include routers
app.include_router(v1_router)
@app.on_event("startup")
async def startup_event():
"""Run startup events."""
pass
@app.on_event("shutdown")
async def shutdown_event():
"""Run shutdown events."""
pass
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
print(f"Received: {data}")
await manager.broadcast(f"Message from client: {data}")
except WebSocketDisconnect:
manager.disconnect(websocket)
await manager.broadcast("A client disconnected")
@app.get("/room/{room_name}", response_class=HTMLResponse)
async def broadcaster(request: Request, room_name: str):
return templates.TemplateResponse("broadcaster.html", {"request": request, "room_name": room_name})
return app
# Create default app instance
app = create_app()