Files
wecom-ai-assistant/backend/app/main.py
2026-02-05 16:36:32 +08:00

69 lines
2.3 KiB
Python

from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from fastapi.exceptions import RequestValidationError
from starlette.exceptions import HTTPException as StarletteHTTPException
from app.routers import auth, wecom
from app.routers.admin import sessions, tickets, kb, settings, users
from app.logging_config import get_trace_id
app = FastAPI(title="企微AI助手", version="0.1.0")
# CORS 必须在最前面
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.exception_handler(StarletteHTTPException)
async def http_exception_handler(request: Request, exc: StarletteHTTPException):
return JSONResponse(
status_code=exc.status_code,
content={"code": exc.status_code, "message": str(exc.detail), "data": None, "trace_id": get_trace_id()},
headers={"Access-Control-Allow-Origin": "*"},
)
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
return JSONResponse(
status_code=422,
content={"code": 422, "message": "参数校验失败", "data": exc.errors(), "trace_id": get_trace_id()},
headers={"Access-Control-Allow-Origin": "*"},
)
@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
import traceback
traceback.print_exc()
return JSONResponse(
status_code=500,
content={"code": 500, "message": str(exc), "data": None, "trace_id": get_trace_id()},
headers={"Access-Control-Allow-Origin": "*"},
)
app.include_router(auth.router, prefix="/api/auth", tags=["auth"])
app.include_router(wecom.router, prefix="/api/wecom", tags=["wecom"])
app.include_router(sessions.router, prefix="/api/admin", tags=["admin"])
app.include_router(tickets.router, prefix="/api/admin", tags=["admin"])
app.include_router(kb.router, prefix="/api/admin", tags=["admin"])
app.include_router(settings.router, prefix="/api/admin", tags=["admin"])
app.include_router(users.router, prefix="/api/admin", tags=["admin"])
@app.get("/api/health")
def health():
return {"status": "up", "service": "backend"}
@app.get("/api/ready")
def ready():
return {"ready": True, "service": "backend"}