From 89d0f2ee8f18a75d10eb685c1fe4f059d9c29aa8 Mon Sep 17 00:00:00 2001 From: YuehuCao Date: Fri, 26 Sep 2025 17:17:14 +0800 Subject: [PATCH] feat(new): new interfaces for create or update role&permission, and query method not using pagination --- .../permission/create_or_update_permission.py | 45 +++++++++++++++++ .../query_permission_no_pagination.py | 45 +++++++++++++++++ .../routes/role/create_or_update_role.py | 49 +++++++++++++++++++ .../routes/role/query_role_no_pagination.py | 47 ++++++++++++++++++ 4 files changed, 186 insertions(+) create mode 100644 apps/authentication/webapi/routes/permission/create_or_update_permission.py create mode 100644 apps/authentication/webapi/routes/permission/query_permission_no_pagination.py create mode 100644 apps/authentication/webapi/routes/role/create_or_update_role.py create mode 100644 apps/authentication/webapi/routes/role/query_role_no_pagination.py diff --git a/apps/authentication/webapi/routes/permission/create_or_update_permission.py b/apps/authentication/webapi/routes/permission/create_or_update_permission.py new file mode 100644 index 0000000..74bd900 --- /dev/null +++ b/apps/authentication/webapi/routes/permission/create_or_update_permission.py @@ -0,0 +1,45 @@ +from datetime import datetime + +from fastapi import APIRouter, Depends +from pydantic import BaseModel +from typing import Optional + +from backend.services.permission.permission_service import PermissionService +from common.token.token_manager import TokenManager + + +router = APIRouter() +token_manager = TokenManager() +permission_service = PermissionService() + + +class CreateOrUpdatePermissionRequest(BaseModel): + permission_key: str + permission_name: str + custom_permission_id: Optional[str] = None + description: Optional[str] = None + + +class PermissionResponse(BaseModel): + id: str + permission_key: str + permission_name: str + description: Optional[str] = None + created_at: datetime + updated_at: datetime + + +@router.post( + "/create-or-update", + response_model=PermissionResponse, + operation_id="create-or-update-permission", + summary="Create or Update Permission", + description="Create or update a permission by id." +) +async def create_or_update_permission( + req: CreateOrUpdatePermissionRequest, + #_: bool = Depends(token_manager.has_all_permissions([DefaultPermissionEnum.CHANGE_PERMISSIONS.value.permission_key])) +) -> PermissionResponse: + doc = await permission_service.create_or_update_permission(req.permission_key, req.permission_name, req.custom_permission_id, + req.description) + return PermissionResponse(**doc.dict()) diff --git a/apps/authentication/webapi/routes/permission/query_permission_no_pagination.py b/apps/authentication/webapi/routes/permission/query_permission_no_pagination.py new file mode 100644 index 0000000..fc2bfba --- /dev/null +++ b/apps/authentication/webapi/routes/permission/query_permission_no_pagination.py @@ -0,0 +1,45 @@ +from datetime import datetime + +from fastapi import APIRouter +from pydantic import BaseModel +from typing import Optional, List +from backend.services.permission.permission_service import PermissionService +from common.token.token_manager import TokenManager + +router = APIRouter() +token_manager = TokenManager() +permission_service = PermissionService() + +class QueryPermissionNoPaginationRequest(BaseModel): + permission_id: Optional[str] = None + permission_key: Optional[str] = None + permission_name: Optional[str] = None + +class PermissionResponse(BaseModel): + id: str + permission_key: str + permission_name: str + description: Optional[str] = None + created_at: datetime + updated_at: datetime + +class QueryPermissionNoPaginationResponse(BaseModel): + items: List[PermissionResponse] + total: int + +@router.post( + "/query_permission_no_pagination", + response_model=QueryPermissionNoPaginationResponse, + operation_id="query-permission-no-pagination", + summary="Query Permission No Pagination", + description="Query permissions fuzzy search." +) +async def query_permission_no_pagination( + req: QueryPermissionNoPaginationRequest, +) -> QueryPermissionNoPaginationResponse: + result = await permission_service.query_permissions_no_pagination(req.permission_id, req.permission_key, req.permission_name) + items = [PermissionResponse(**item) for item in result["items"]] + return QueryPermissionNoPaginationResponse( + items=items, + total=result["total"] + ) \ No newline at end of file diff --git a/apps/authentication/webapi/routes/role/create_or_update_role.py b/apps/authentication/webapi/routes/role/create_or_update_role.py new file mode 100644 index 0000000..d96343e --- /dev/null +++ b/apps/authentication/webapi/routes/role/create_or_update_role.py @@ -0,0 +1,49 @@ +from datetime import datetime + +from fastapi import APIRouter, Depends +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 CreateOrUpdateRoleRequest(BaseModel): + role_key: str + role_name: str + role_level: int + custom_role_id: Optional[str] = None + role_description: Optional[str] = None + + + +class RoleResponse(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( + "/create-or-update", + response_model=RoleResponse, + operation_id="create-or-update-role", + summary="Create or Update Role", + description="Create or update a role by id." +) +async def create_or_update_permission( + req: CreateOrUpdateRoleRequest, + #_: bool = Depends(token_manager.has_all_permissions([DefaultPermissionEnum.CHANGE_PERMISSIONS.value.permission_key])) +) -> RoleResponse: + doc = await role_service.create_or_update_role(req.role_key, req.role_name, req.role_level, req.custom_role_id, req.role_description) + + return RoleResponse(**doc.dict()) diff --git a/apps/authentication/webapi/routes/role/query_role_no_pagination.py b/apps/authentication/webapi/routes/role/query_role_no_pagination.py new file mode 100644 index 0000000..3721d3b --- /dev/null +++ b/apps/authentication/webapi/routes/role/query_role_no_pagination.py @@ -0,0 +1,47 @@ +from datetime import datetime + +from fastapi import APIRouter +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 QueryRoleNoPaginationRequest(BaseModel): + role_id: Optional[str] = None + role_key: Optional[str] = None + role_name: Optional[str] = None + +class RoleResponse(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 + +class QueryRoleNoPaginationResponse(BaseModel): + items: List[RoleResponse] + total: int + +@router.post( + "/query_role_no_pagination", + response_model=QueryRoleNoPaginationResponse, + operation_id="query-role-no-pagination", + summary="Query Role No Pagination", + description="Query roles fuzzy search without pagination." +) +async def query_role_no_pagination( + req: QueryRoleNoPaginationRequest, +) -> QueryRoleNoPaginationResponse: + result = await role_service.query_roles_no_pagination(req.role_id, req.role_key, req.role_name) + items = [RoleResponse(**item) for item in result["items"]] + return QueryRoleNoPaginationResponse( + items=items, + total=result["total"] + )