from fastapi import FastAPI, Request from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from fastapi.responses import HTMLResponse from database import engine, Base import uvicorn from routers import ( auth, system_admin, franchise, stores, users, store_settings, class_management, waiting, waiting_board, members, daily_closing, daily_closing, sse, sse, statistics, sse, statistics, attendance, logs # New Logger Router ) from core.logger import logger import time from starlette.middleware.base import BaseHTTPMiddleware app = FastAPI(title="Waiting System") # 데이터베이스 테이블 생성 Base.metadata.create_all(bind=engine) # 정적 파일 및 템플릿 설정 app.mount("/static", StaticFiles(directory="static"), name="static") app.mount("/static", StaticFiles(directory="static"), name="static") templates = Jinja2Templates(directory="templates") # Logging Middleware class RequestLoggingMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next): start_time = time.time() # Log Request logger.info(f"Incoming Request: {request.method} {request.url.path}") try: response = await call_next(request) # Log Response process_time = time.time() - start_time logger.info(f"Request Completed: {request.method} {request.url.path} - Status: {response.status_code} - Time: {process_time:.4f}s") return response except Exception as e: logger.error(f"Request Failed: {request.method} {request.url.path} - Error: {str(e)}", exc_info=True) raise e app.add_middleware(RequestLoggingMiddleware) # 라우터 등록 # 인증 및 관리 라우터 app.include_router(auth.router, prefix="/api/auth", tags=["Authentication"]) app.include_router(system_admin.router, prefix="/api/system", tags=["System Administration"]) app.include_router(franchise.router, prefix="/api/franchise", tags=["Franchise Management"]) app.include_router(statistics.router, prefix="/api/franchise/stats", tags=["Franchise Statistics"]) app.include_router(stores.router, prefix="/api/stores", tags=["Store Management"]) app.include_router(users.router, prefix="/api/users", tags=["User Management"]) # 매장 운영 라우터 app.include_router(store_settings.router, prefix="/api/store", tags=["Store Settings"]) app.include_router(class_management.router, prefix="/api/classes", tags=["Class Management"]) app.include_router(waiting.router, prefix="/api/waiting", tags=["Waiting"]) app.include_router(waiting_board.router, prefix="/api/board", tags=["Waiting Board"]) app.include_router(members.router, prefix="/api/members", tags=["Members"]) app.include_router(daily_closing.router, prefix="/api/daily", tags=["Daily Closing"]) app.include_router(daily_closing.router, prefix="/api/daily", tags=["Daily Closing"]) app.include_router(attendance.router, prefix="/api/attendance", tags=["Attendance"]) app.include_router(attendance.router, prefix="/api/attendance", tags=["Attendance"]) app.include_router(sse.router, prefix="/api/sse", tags=["SSE"]) app.include_router(logs.router) # Log Viewer Router @app.get("/", response_class=HTMLResponse) async def home(request: Request): """메인 페이지""" return templates.TemplateResponse("index.html", {"request": request}) @app.get("/board", response_class=HTMLResponse) async def waiting_board_page(request: Request): """대기현황판 페이지""" return templates.TemplateResponse("waiting_board.html", {"request": request}) @app.get("/reception", response_class=HTMLResponse) async def reception_page(request: Request): """데스크 대기접수 페이지""" return templates.TemplateResponse("reception.html", {"request": request}) @app.get("/mobile", response_class=HTMLResponse) async def mobile_page(request: Request): """모바일 대기접수 페이지""" return templates.TemplateResponse("mobile.html", {"request": request}) @app.get("/manage", response_class=HTMLResponse) async def manage_page(request: Request): """대기자 관리 페이지""" return templates.TemplateResponse("manage.html", {"request": request}) @app.get("/members", response_class=HTMLResponse) async def members_page(request: Request): """회원 관리 페이지""" return templates.TemplateResponse("members.html", {"request": request}) @app.get("/settings", response_class=HTMLResponse) async def settings_page(request: Request): """매장 설정 페이지""" return templates.TemplateResponse("settings.html", {"request": request}) @app.get("/attendance", response_class=HTMLResponse) async def attendance_page(request: Request): """출석 조회 페이지""" return templates.TemplateResponse("attendance.html", {"request": request}) @app.get("/reception-login", response_class=HTMLResponse) async def reception_login_page(request: Request): """태블릿 대기접수 로그인 페이지""" return templates.TemplateResponse("reception_login.html", {"request": request}) @app.get("/login", response_class=HTMLResponse) async def login_page(request: Request): """로그인 페이지""" return templates.TemplateResponse("login.html", {"request": request}) @app.get("/admin", response_class=HTMLResponse) async def admin_page(request: Request): """프랜차이즈 관리 페이지""" return templates.TemplateResponse("admin.html", {"request": request}) @app.get("/superadmin", response_class=HTMLResponse) async def superadmin_page(request: Request): """시스템 관리자 페이지""" return templates.TemplateResponse("superadmin.html", {"request": request}) if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)