-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathroutes.py
More file actions
127 lines (115 loc) · 5.09 KB
/
routes.py
File metadata and controls
127 lines (115 loc) · 5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
from fastapi import APIRouter, Depends, HTTPException, status
from app.groups.schemas import (
GroupCreateRequest, GroupResponse, GroupListResponse, GroupUpdateRequest,
JoinGroupRequest, JoinGroupResponse, MemberRoleUpdateRequest,
LeaveGroupResponse, DeleteGroupResponse, RemoveMemberResponse
)
from app.groups.service import group_service
from app.auth.security import get_current_user
from typing import Dict, Any, List
router = APIRouter(prefix="/groups", tags=["Groups"])
@router.post("", response_model=GroupResponse, status_code=status.HTTP_201_CREATED)
async def create_group(
group_data: GroupCreateRequest,
current_user: Dict[str, Any] = Depends(get_current_user)
):
"""Create a new group"""
group = await group_service.create_group(
group_data.model_dump(exclude_unset=True),
current_user["_id"]
)
if not group:
raise HTTPException(status_code=500, detail="Failed to create group")
return group
@router.get("", response_model=GroupListResponse)
async def list_user_groups(current_user: Dict[str, Any] = Depends(get_current_user)):
"""List all groups the current user belongs to"""
groups = await group_service.get_user_groups(current_user["_id"])
return {"groups": groups}
@router.get("/{group_id}", response_model=GroupResponse)
async def get_group_details(
group_id: str,
current_user: Dict[str, Any] = Depends(get_current_user)
):
"""Get group details including members"""
group = await group_service.get_group_by_id(group_id, current_user["_id"])
if not group:
raise HTTPException(status_code=404, detail="Group not found or access denied")
return group
@router.patch("/{group_id}", response_model=GroupResponse)
async def update_group_metadata(
group_id: str,
updates: GroupUpdateRequest,
current_user: Dict[str, Any] = Depends(get_current_user)
):
"""Update group metadata (admin only)"""
update_data = updates.model_dump(exclude_unset=True)
if not update_data:
raise HTTPException(status_code=400, detail="No update fields provided")
updated_group = await group_service.update_group(group_id, update_data, current_user["_id"])
if not updated_group:
raise HTTPException(status_code=404, detail="Group not found or access denied")
return updated_group
@router.delete("/{group_id}", response_model=DeleteGroupResponse)
async def delete_group(
group_id: str,
current_user: Dict[str, Any] = Depends(get_current_user)
):
"""Delete a group (admin only)"""
deleted = await group_service.delete_group(group_id, current_user["_id"])
if not deleted:
raise HTTPException(status_code=404, detail="Group not found or access denied")
return DeleteGroupResponse(success=True, message="Group deleted successfully")
@router.post("/join", response_model=JoinGroupResponse)
async def join_group_by_code(
join_data: JoinGroupRequest,
current_user: Dict[str, Any] = Depends(get_current_user)
):
"""Join a group using a join code"""
group = await group_service.join_group_by_code(join_data.joinCode, current_user["_id"])
if not group:
raise HTTPException(status_code=404, detail="Invalid join code")
return {"group": group}
@router.post("/{group_id}/leave", response_model=LeaveGroupResponse)
async def leave_group(
group_id: str,
current_user: Dict[str, Any] = Depends(get_current_user)
):
"""Leave a group (only if no outstanding balances)"""
left = await group_service.leave_group(group_id, current_user["_id"])
if not left:
raise HTTPException(status_code=400, detail="Failed to leave group")
return LeaveGroupResponse(success=True, message="Successfully left the group")
@router.get("/{group_id}/members", response_model=List[Dict[str, Any]])
async def get_group_members(
group_id: str,
current_user: Dict[str, Any] = Depends(get_current_user)
):
"""Get list of group members"""
members = await group_service.get_group_members(group_id, current_user["_id"])
return members
@router.patch("/{group_id}/members/{member_id}", response_model=Dict[str, str])
async def update_member_role(
group_id: str,
member_id: str,
role_update: MemberRoleUpdateRequest,
current_user: Dict[str, Any] = Depends(get_current_user)
):
"""Change member role (admin only)"""
updated = await group_service.update_member_role(
group_id, member_id, role_update.role, current_user["_id"]
)
if not updated:
raise HTTPException(status_code=400, detail="Failed to update member role")
return {"message": f"Member role updated to {role_update.role}"}
@router.delete("/{group_id}/members/{member_id}", response_model=RemoveMemberResponse)
async def remove_group_member(
group_id: str,
member_id: str,
current_user: Dict[str, Any] = Depends(get_current_user)
):
"""Remove a member from the group (admin only)"""
removed = await group_service.remove_member(group_id, member_id, current_user["_id"])
if not removed:
raise HTTPException(status_code=400, detail="Failed to remove member")
return RemoveMemberResponse(success=True, message="Member removed successfully")