from uuid import UUID from fastapi import APIRouter, Depends, Query from common.enums import UserRole from common.models.gmodel import PageParams, UserInfo from router.v1.validator.dependencies import RemoveNoneResponse, RequireOwner from services.company_user_service import CompanyUserService from .protocol import ( Req_CreateCompanyUser, Req_UpdateCompanyUser, Res_CompanyUser, Res_CompanyUserList, Res_DeleteCompanyUser, ) # 최고관리자 이상 전용. company_id 는 토큰값으로 스코프되고, # 개발자(내부 운영) 계정은 고객사 최고관리자에게 목록에서 감춰진다(존재 자체를 노출하지 않는다). router = APIRouter(prefix="/v1/company/user", tags=["CompanyUser"], responses={404: {"description": "Not found"}}) @router.get(path="/list", response_model=Res_CompanyUserList, summary="회사 유저 목록(최고관리자)") async def list_users( service: CompanyUserService = Depends(), actor: UserInfo = Depends(RequireOwner), search: str | None = Query(None, description="로그인ID/이름/이메일 검색"), pg: PageParams = Depends(), ): return RemoveNoneResponse(await service.list_users(actor.company_id, search, pg, hide_dev=actor.role != UserRole.DEVELOPER.value)) @router.post(path="/create", response_model=Res_CompanyUser, summary="회사 유저 생성(일반 권한 고정)") async def create_user( req: Req_CreateCompanyUser, service: CompanyUserService = Depends(), actor: UserInfo = Depends(RequireOwner) ): return RemoveNoneResponse(await service.create_user(actor.company_id, req)) @router.get(path="/{user_id}", response_model=Res_CompanyUser, summary="회사 유저 조회") async def get_user(user_id: UUID, service: CompanyUserService = Depends(), actor: UserInfo = Depends(RequireOwner)): return RemoveNoneResponse(await service.get_user(actor.company_id, str(user_id))) @router.patch(path="/update/{user_id}", response_model=Res_CompanyUser, summary="회사 유저 수정") async def update_user( user_id: UUID, req: Req_UpdateCompanyUser, service: CompanyUserService = Depends(), actor: UserInfo = Depends(RequireOwner) ): return RemoveNoneResponse(await service.update_user(actor.company_id, str(user_id), req)) @router.delete(path="/delete/{user_id}", response_model=Res_DeleteCompanyUser, summary="회사 유저 삭제") async def delete_user(user_id: UUID, service: CompanyUserService = Depends(), actor: UserInfo = Depends(RequireOwner)): return RemoveNoneResponse(await service.delete_user(actor.company_id, str(user_id)))