1+ from datetime import datetime
2+ from fastapi import APIRouter , Depends , HTTPException , Body
3+ from database import db
4+ from typings .activity_v2 import Activity , ActivityMember
5+ from typings .log import inject_log
6+ from typings .user import User as UserV1
7+ from util .object_id import get_current_user
8+ from util .permission import volunteer_member
9+ from util .user import get_user_name
10+ from utils import validate_object_id
11+
12+ router = APIRouter ()
13+
14+ @router .post ("/{activity_id}/members" )
15+ async def add_activity_member_v3 (
16+ activity_id : str ,
17+ members : list [ActivityMember ] = Body (),
18+ user = Depends (get_current_user ),
19+ log = Depends (inject_log ),
20+ ):
21+ """
22+ :param activity_id: ID of the activity to be retrieved
23+ :param user: Current user
24+ :param member: ActivityMember object to be added
25+ :param log: Logger object
26+ :return: Activity object
27+ """
28+
29+ target_activity = await db .zvms_new .get_collection ("activities" ).find_one (
30+ {"_id" : validate_object_id (activity_id )}
31+ )
32+
33+ results = []
34+
35+ for member in members :
36+ target_user = await db .zvms .get_collection ("users" ).find_one (
37+ {"_id" : validate_object_id (member .member )}
38+ )
39+ target_activity = Activity .model_validate (target_activity , strict = False )
40+ target_user = UserV1 .model_validate (target_user , strict = False )
41+ await volunteer_member .validate_create_permission (
42+ user , target_user , target_activity
43+ )
44+
45+ if target_activity .type != "hybrid" and target_activity .type != member .mode :
46+ raise HTTPException (
47+ status_code = 400 , detail = "Activity type and member mode do not match"
48+ )
49+
50+ existing : ActivityMember = await db .zvms_new .get_collection ("activity_members" ).find_one (
51+ {
52+ "member" : str (member .member ),
53+ "activity" : str (activity_id ),
54+ "mode" : member .mode ,
55+ }
56+ )
57+
58+ if existing :
59+
60+ updated_data = {
61+ "duration" : existing .duration + member .duration ,
62+ "mode" : member .mode ,
63+ }
64+
65+ result = await db .zvms_new .get_collection ("activity_members" ).update_one (
66+ {"_id" : validate_object_id (existing ._id )},
67+ {"$set" : updated_data },
68+ )
69+
70+ results .append (str (existing ._id ))
71+
72+ continue
73+
74+ member_ = member .model_dump ()
75+
76+ result = await db .zvms_new .get_collection ("activity_members" ).insert_one (member_ )
77+
78+ log .with_text (
79+ f'User { await get_user_name (user ["id" ])} added member { target_user .name } to activity { target_activity .name } at { datetime .now ().isoformat ()} .'
80+ )
81+ await log .insert_log ()
82+
83+ results .append (str (result .inserted_id ))
84+
85+ return {
86+ "result" : results ,
87+ "count" : await db .zvms_new .get_collection ("activity_members" ).count_documents (
88+ {"activity" : str (activity_id )}
89+ ),
90+ }
0 commit comments