from fastapi import APIRouter, Depends, HTTPException, Request, status from database.models import User, UserRole from database.schemas import ProjectCreate, ProjectUpdate from routers.auth import get_current_user from utils.tkuser_client import get_token_from_request import utils.tkuser_client as tkuser_client router = APIRouter( prefix="/api/projects", tags=["projects"] ) def check_admin_permission(current_user: User = Depends(get_current_user)): """관리자 권한 확인""" if current_user.role != UserRole.admin: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="관리자 권한이 필요합니다." ) return current_user @router.options("/") async def projects_options(): """OPTIONS preflight 요청 처리""" return {"message": "OK"} @router.post("/") async def create_project( project: ProjectCreate, request: Request, current_user: User = Depends(check_admin_permission) ): """프로젝트 생성 (관리자만) - tkuser API로 프록시""" token = get_token_from_request(request) return await tkuser_client.create_project(token, project.dict()) @router.get("/") async def get_projects( request: Request, skip: int = 0, limit: int = 100, active_only: bool = True, ): """프로젝트 목록 조회 - tkuser API로 프록시""" token = get_token_from_request(request) projects = await tkuser_client.get_projects(token, active_only=active_only) return projects[skip:skip + limit] @router.get("/{project_id}") async def get_project( project_id: int, request: Request, ): """특정 프로젝트 조회 - tkuser API로 프록시""" token = get_token_from_request(request) project = await tkuser_client.get_project(token, project_id) if not project: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="프로젝트를 찾을 수 없습니다." ) return project @router.put("/{project_id}") async def update_project( project_id: int, project_update: ProjectUpdate, request: Request, current_user: User = Depends(check_admin_permission) ): """프로젝트 수정 (관리자만) - tkuser API로 프록시""" token = get_token_from_request(request) return await tkuser_client.update_project( token, project_id, project_update.dict(exclude_unset=True) ) @router.delete("/{project_id}") async def delete_project( project_id: int, request: Request, current_user: User = Depends(check_admin_permission) ): """프로젝트 삭제 (비활성화) (관리자만) - tkuser API로 프록시""" token = get_token_from_request(request) await tkuser_client.delete_project(token, project_id) return {"message": "프로젝트가 삭제되었습니다."}