69 lines
2.3 KiB
Python
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"}
|