|
10 | 10 |
|
11 | 11 | from consts.model import ( |
12 | 12 | GroupCreateRequest, GroupUpdateRequest, |
13 | | - GroupUserRequest, GroupListRequest, SetDefaultGroupRequest |
| 13 | + GroupUserRequest, GroupListRequest, SetDefaultGroupRequest, |
| 14 | + GroupMembersUpdateRequest |
14 | 15 | ) |
15 | 16 | from consts.exceptions import NotFoundException, ValidationError, UnauthorizedError |
16 | 17 | from services.group_service import ( |
17 | 18 | create_group, get_group_info, update_group, delete_group, |
18 | 19 | add_user_to_single_group, remove_user_from_single_group, get_group_users, |
19 | 20 | add_user_to_groups, get_tenant_default_group_id, set_tenant_default_group_id, |
20 | | - get_groups_by_tenant |
| 21 | + get_groups_by_tenant, update_group_members |
21 | 22 | ) |
22 | 23 | from services.tenant_service import get_tenant_info |
23 | 24 | from utils.auth_utils import get_current_user_id |
@@ -140,11 +141,13 @@ async def get_groups_endpoint( |
140 | 141 | try: |
141 | 142 | # Validate tenant exists |
142 | 143 | get_tenant_info(request.tenant_id) |
143 | | - # Get groups under given tenant with pagination |
| 144 | + # Get groups under given tenant with pagination and sorting |
144 | 145 | result = get_groups_by_tenant( |
145 | 146 | tenant_id=request.tenant_id, |
146 | 147 | page=request.page, |
147 | | - page_size=request.page_size |
| 148 | + page_size=request.page_size, |
| 149 | + sort_by=request.sort_by, |
| 150 | + sort_order=request.sort_order |
148 | 151 | ) |
149 | 152 |
|
150 | 153 | return JSONResponse( |
@@ -486,6 +489,70 @@ async def get_group_users_endpoint(group_id: int) -> JSONResponse: |
486 | 489 | ) |
487 | 490 |
|
488 | 491 |
|
| 492 | +@router.put("/{group_id}/members") |
| 493 | +async def update_group_members_endpoint( |
| 494 | + group_id: int, |
| 495 | + request: GroupMembersUpdateRequest, |
| 496 | + authorization: Optional[str] = Header(None) |
| 497 | +) -> JSONResponse: |
| 498 | + """ |
| 499 | + Update group members by setting the exact list of users. |
| 500 | +
|
| 501 | + Args: |
| 502 | + group_id: Group identifier |
| 503 | + request: Request containing the list of user IDs to set as group members |
| 504 | + authorization: Bearer token for authentication |
| 505 | +
|
| 506 | + Returns: |
| 507 | + JSONResponse: Update results with counts |
| 508 | + """ |
| 509 | + try: |
| 510 | + # Get current user ID from token |
| 511 | + current_user_id, _ = get_current_user_id(authorization) |
| 512 | + |
| 513 | + # Update group members |
| 514 | + result = update_group_members( |
| 515 | + group_id=group_id, |
| 516 | + user_ids=request.user_ids, |
| 517 | + current_user_id=current_user_id |
| 518 | + ) |
| 519 | + |
| 520 | + logger.info(f"Updated group {group_id} members by user {current_user_id}: {result}") |
| 521 | + |
| 522 | + return JSONResponse( |
| 523 | + status_code=HTTPStatus.OK, |
| 524 | + content={ |
| 525 | + "message": "Group members updated successfully", |
| 526 | + "data": result |
| 527 | + } |
| 528 | + ) |
| 529 | + |
| 530 | + except NotFoundException as exc: |
| 531 | + logger.warning(f"Group not found for member update: {group_id}") |
| 532 | + raise HTTPException( |
| 533 | + status_code=HTTPStatus.NOT_FOUND, |
| 534 | + detail=str(exc) |
| 535 | + ) |
| 536 | + except ValidationError as exc: |
| 537 | + logger.warning(f"Group members update validation error: {str(exc)}") |
| 538 | + raise HTTPException( |
| 539 | + status_code=HTTPStatus.BAD_REQUEST, |
| 540 | + detail=str(exc) |
| 541 | + ) |
| 542 | + except UnauthorizedError as exc: |
| 543 | + logger.warning(f"Unauthorized group members update attempt: {str(exc)}") |
| 544 | + raise HTTPException( |
| 545 | + status_code=HTTPStatus.UNAUTHORIZED, |
| 546 | + detail=str(exc) |
| 547 | + ) |
| 548 | + except Exception as exc: |
| 549 | + logger.error(f"Unexpected error during group members update: {str(exc)}") |
| 550 | + raise HTTPException( |
| 551 | + status_code=HTTPStatus.INTERNAL_SERVER_ERROR, |
| 552 | + detail="Failed to update group members" |
| 553 | + ) |
| 554 | + |
| 555 | + |
489 | 556 | @router.post("/members/batch") |
490 | 557 | async def add_user_to_groups_endpoint( |
491 | 558 | request: GroupUserRequest, |
|
0 commit comments