from pathlib import Path from fastapi import FastAPI from sqladmin import Admin from sqladmin.authentication import login_required from starlette.requests import Request from starlette.responses import Response from sqlalchemy.ext.asyncio import AsyncEngine from app.backoffice.admin.admin_view import AdminAdmin from app.backoffice.admin.auth import AdminAuthBackend from app.backoffice.credit_view import CreditChargeRequestAdmin, CreditTransactionAdmin from app.backoffice.dashboard import get_dashboard_context from app.user.api.user_admin import SocialAccountAdmin, UserAdmin from config import prj_settings TEMPLATES_DIR = Path(__file__).parent / "backoffice" / "frontend" / "templates" class DashboardAdmin(Admin): @login_required async def index(self, request: Request) -> Response: ctx = await get_dashboard_context() admin_role = request.session.get("admin_role", "viewer") return await self.templates.TemplateResponse( request, "sqladmin/index.html", {"title": "대시보드", "subtitle": "", "admin_role": admin_role, **ctx}, ) def init_admin( app: FastAPI, db_engine: AsyncEngine, base_url: str = prj_settings.ADMIN_BASE_URL, ) -> Admin: auth_backend = AdminAuthBackend(secret_key=prj_settings.ADMIN_SESSION_SECRET) admin = DashboardAdmin( app, db_engine, base_url=base_url, authentication_backend=auth_backend, title="ADO2 관리자", templates_dir=str(TEMPLATES_DIR), ) # 사용자 관리 admin.add_view(UserAdmin) admin.add_view(SocialAccountAdmin) # 크레딧 관리 (superadmin: 전체, viewer: 읽기 전용) admin.add_view(CreditChargeRequestAdmin) admin.add_view(CreditTransactionAdmin) # 백오피스 설정 admin.add_view(AdminAdmin) return admin