From bda5660bb6d494fc1c29232f72cd34696a37c12f Mon Sep 17 00:00:00 2001 From: YuehuCao Date: Wed, 24 Sep 2025 17:29:27 +0800 Subject: [PATCH] feat(api): add query role by id API --- .../backend/infra/permission/role_handler.py | 9 ++++ .../services/permission/role_service.py | 4 ++ .../webapi/routes/role/__init__.py | 2 + .../webapi/routes/role/query_role_by_id.py | 51 +++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 apps/authentication/webapi/routes/role/query_role_by_id.py diff --git a/apps/authentication/backend/infra/permission/role_handler.py b/apps/authentication/backend/infra/permission/role_handler.py index bb7391e..d096d7e 100644 --- a/apps/authentication/backend/infra/permission/role_handler.py +++ b/apps/authentication/backend/infra/permission/role_handler.py @@ -107,6 +107,15 @@ class RoleHandler: docs = await cursor.skip(skip).limit(limit).to_list() return docs, total + async def query_roles_by_id(self, role_id: PydanticObjectId) -> Optional[RoleDoc]: + """Query a role by its ID""" + if not role_id: + raise RequestValidationError("role_id is required.") + doc = await RoleDoc.get(role_id) + if not doc: + raise RequestValidationError("Role not found.") + return doc + async def assign_permissions_to_role(self, role_id: PydanticObjectId, permission_ids: List[str]) -> Optional[RoleDoc]: """Assign permissions to a role by updating the permission_ids field""" if not role_id or not permission_ids: diff --git a/apps/authentication/backend/services/permission/role_service.py b/apps/authentication/backend/services/permission/role_service.py index 929639f..143b381 100644 --- a/apps/authentication/backend/services/permission/role_service.py +++ b/apps/authentication/backend/services/permission/role_service.py @@ -39,6 +39,10 @@ class RoleService: """Assign permissions to a role by updating the permission_ids field""" return await self.role_handler.assign_permissions_to_role(PydanticObjectId(role_id), permission_ids) + async def query_roles_by_id(self, role_id: str) -> RoleDoc: + """Query a single role by ID""" + return await self.role_handler.query_roles_by_id(PydanticObjectId(role_id)) + async def delete_role(self, role_id: str) -> None: """Delete a role document after checking if it is referenced by any user""" return await self.role_handler.delete_role(PydanticObjectId(role_id)) \ No newline at end of file diff --git a/apps/authentication/webapi/routes/role/__init__.py b/apps/authentication/webapi/routes/role/__init__.py index 61d7118..f82d8b7 100644 --- a/apps/authentication/webapi/routes/role/__init__.py +++ b/apps/authentication/webapi/routes/role/__init__.py @@ -2,6 +2,7 @@ from fastapi import APIRouter from .create_role import router as create_role_router from .update_role import router as update_role_router from .query_role import router as query_role_router +from .query_role_by_id import router as query_role_by_id_router from .assign_permissions import router as assign_permissions_router from .delete_role import router as delete_role_router @@ -10,5 +11,6 @@ router = APIRouter() router.include_router(create_role_router, prefix="/role", tags=["role"]) router.include_router(update_role_router, prefix="/role", tags=["role"]) router.include_router(query_role_router, prefix="/role", tags=["role"]) +router.include_router(query_role_by_id_router, prefix="/role", tags=["role"]) router.include_router(assign_permissions_router, prefix="/role", tags=["role"]) router.include_router(delete_role_router, prefix="/role", tags=["role"]) \ No newline at end of file diff --git a/apps/authentication/webapi/routes/role/query_role_by_id.py b/apps/authentication/webapi/routes/role/query_role_by_id.py new file mode 100644 index 0000000..87fdafc --- /dev/null +++ b/apps/authentication/webapi/routes/role/query_role_by_id.py @@ -0,0 +1,51 @@ +from datetime import datetime + +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel +from typing import Optional, List + +from backend.services.permission.role_service import RoleService +from common.token.token_manager import TokenManager + +router = APIRouter() +token_manager = TokenManager() +role_service = RoleService() + +class QueryRoleByIdRequest(BaseModel): + role_id: str + +class QueryRoleByIdResponse(BaseModel): + id: str + role_key: str + role_name: str + role_description: Optional[str] = None + permission_ids: List[str] + role_level: int + created_at: datetime + updated_at: datetime + + +@router.post( + "/query_by_id", + response_model=QueryRoleByIdResponse, + operation_id="query-role-by-id", + summary="Query Role by Id", + description="Query role by id." +) +async def query_roles_by_id( + req: QueryRoleByIdRequest, +) -> QueryRoleByIdResponse: + try: + result = await role_service.query_roles_by_id(req.role_id) + return QueryRoleByIdResponse( + id=str(result.id), + role_key=result.role_key, + role_name=result.role_name, + role_description=result.role_description, + permission_ids=result.permission_ids, + role_level=result.role_level, + created_at=result.created_at, + updated_at=result.updated_at + ) + except Exception as e: + raise HTTPException(status_code=400, detail=str(e)) \ No newline at end of file