Skip to content

Commit b31c407

Browse files
authored
refactor: activity member creation (#136)
1 parent 3a91433 commit b31c407

File tree

5 files changed

+98
-6
lines changed

5 files changed

+98
-6
lines changed

main.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
activity_statistics_router,
1717
times_router,
1818
mcp_router,
19+
activities_v3_router,
1920
)
2021
from database import close_mongo_connection, connect_to_mongo
2122
import socketio
@@ -24,7 +25,6 @@
2425
from apscheduler.schedulers.asyncio import AsyncIOScheduler
2526
import asyncio
2627
from tasks.compute_time import compute_tasks, generate_reports
27-
from tasks.data_fix import wash_data
2828

2929
scheduler = AsyncIOScheduler()
3030
sio = socketio.AsyncServer(async_mode="asgi")
@@ -35,6 +35,7 @@
3535
app.add_middleware(
3636
CORSMiddleware,
3737
allow_origins=[
38+
"http://localhost:4173",
3839
"http://localhost:5173",
3940
"https://v4.zvms.site",
4041
"https://v4-netlify.zvms.site",
@@ -129,6 +130,7 @@ async def shutdown_event():
129130
activity_statistics_router.router, prefix="/api/v2/statistics/activities"
130131
)
131132
app.include_router(mcp_router.router, prefix="/api/v2/mcp")
133+
app.include_router(activities_v3_router.router, prefix="/api/v3/activities")
132134

133135

134136
@app.get("/api/")

routers/activities_v2_router.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,12 @@ async def create_activity_v2(
4343

4444
activity.creator = str(user["id"])
4545

46-
activity = activity.model_dump()
46+
activity_ = activity.model_dump()
4747

48-
result = await db.zvms_new.get_collection("activities").insert_one(activity)
48+
result = await db.zvms_new.get_collection("activities").insert_one(activity_)
4949

5050
log.with_text(
51-
f'User {await get_user_name(user['id'])} (ID: {user['id']}) created activity {activity["name"]} at {datetime.now().isoformat()} (ID: {result.inserted_id}).'
51+
f'User {await get_user_name(user['id'])} (ID: {user['id']}) created activity {activity_["name"]} at {datetime.now().isoformat()} (ID: {result.inserted_id}).'
5252
)
5353
await log.insert_log()
5454

@@ -340,9 +340,9 @@ async def add_activity_member_v2(
340340
status_code=400, detail="User already in activity with same counting mode"
341341
)
342342

343-
member = member.model_dump()
343+
member_ = member.model_dump()
344344

345-
result = await db.zvms_new.get_collection("activity_members").insert_one(member)
345+
result = await db.zvms_new.get_collection("activity_members").insert_one(member_)
346346

347347
log.with_text(
348348
f'User {await get_user_name(user["id"])} added member {target_user.name} to activity {target_activity.name} at {datetime.now().isoformat()}.'

routers/activities_v3_router.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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+
}

routers/merge_router.py

Whitespace-only changes.

routers/rating_router.py

Whitespace-only changes.

0 commit comments

Comments
 (0)