76 lines
1.9 KiB
Python
76 lines
1.9 KiB
Python
"""
|
|
Weibo-HotSign API Service
|
|
Main FastAPI application entry point — account management, task config, signin logs.
|
|
"""
|
|
|
|
from fastapi import FastAPI, Request
|
|
from fastapi.exceptions import RequestValidationError
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from starlette.exceptions import HTTPException as StarletteHTTPException
|
|
|
|
from shared.response import success_response, error_response
|
|
from api_service.app.routers import accounts, tasks, signin_logs
|
|
|
|
app = FastAPI(
|
|
title="Weibo-HotSign API Service",
|
|
version="1.0.0",
|
|
docs_url="/docs",
|
|
redoc_url="/redoc",
|
|
)
|
|
|
|
# CORS
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=["http://localhost:3000", "http://localhost:80"],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
|
|
# ---- Global exception handlers (unified response format) ----
|
|
|
|
@app.exception_handler(StarletteHTTPException)
|
|
async def http_exception_handler(request: Request, exc: StarletteHTTPException):
|
|
return error_response(
|
|
exc.detail,
|
|
f"HTTP_{exc.status_code}",
|
|
status_code=exc.status_code,
|
|
)
|
|
|
|
|
|
@app.exception_handler(RequestValidationError)
|
|
async def validation_exception_handler(request: Request, exc: RequestValidationError):
|
|
details = [
|
|
{"field": e["loc"][-1] if e["loc"] else "unknown", "message": e["msg"]}
|
|
for e in exc.errors()
|
|
]
|
|
return error_response(
|
|
"Validation failed",
|
|
"VALIDATION_ERROR",
|
|
details=details,
|
|
status_code=400,
|
|
)
|
|
|
|
|
|
# ---- Routers ----
|
|
|
|
app.include_router(accounts.router)
|
|
app.include_router(tasks.router)
|
|
app.include_router(signin_logs.router)
|
|
|
|
|
|
# ---- Health / root ----
|
|
|
|
@app.get("/")
|
|
async def root():
|
|
return success_response(
|
|
{"service": "Weibo-HotSign API Service", "version": "1.0.0"},
|
|
"Service is running",
|
|
)
|
|
|
|
|
|
@app.get("/health")
|
|
async def health_check():
|
|
return success_response({"status": "healthy"})
|