"""어드민 API.""" import time from fastapi import Depends, FastAPI, Request from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.gzip import GZipMiddleware from common.database.db_session_manager import DB_SESSION_MNG from common.logger import LOG from common.utils.gtime import GTime from config.server_configs import web_server_config from router.v1.validator.dependencies import RequireDeveloper import router.v1.auth.account import router.v1.fact.fact import router.v1.job.job import router.v1.local.local import router.v1.place.place import router.v1.site.review_admin import router.v1.site.site from contextlib import asynccontextmanager API_SERVER_START_TIME = GTime.UTCStr() @asynccontextmanager async def lifespan(app: FastAPI): # 크론은 :9800 담당. yield await DB_SESSION_MNG.dispose_all() app = FastAPI(title="Web4Ai Admin API", lifespan=lifespan) def _origins(*values: str) -> list[str]: seen: list[str] = [] for value in values: for origin in value.split(","): origin = origin.strip().rstrip("/") if origin and origin not in seen: seen.append(origin) return seen ALLOWED_ORIGINS = _origins(web_server_config.client_url) app.add_middleware( CORSMiddleware, allow_origins=ALLOWED_ORIGINS, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.add_middleware(GZipMiddleware, minimum_size=1000) @app.middleware("http") async def log_time(request: Request, call_next): start_time = time.time() response = await call_next(request) LOG.d(f"[admin] {response.status_code} {request.method} {request.url.path} - {time.time() - start_time:.4f}s") return response @app.get(path="/healthz") async def healthz(): return API_SERVER_START_TIME # auth 만 게이트 밖 — 로그인까지 막으면 아무도 못 들어온다. app.include_router(router.v1.auth.account.router) # 나머지 전부 role >= DEVELOPER. _gate = [Depends(RequireDeveloper)] app.include_router(router.v1.place.place.router, dependencies=_gate) app.include_router(router.v1.fact.fact.router, dependencies=_gate) app.include_router(router.v1.job.job.router, dependencies=_gate) app.include_router(router.v1.site.site.router, dependencies=_gate) app.include_router(router.v1.local.local.router, dependencies=_gate) app.include_router(router.v1.site.review_admin.router, dependencies=_gate)