55for extracurricular activities at Mergington High School.
66"""
77
8- from fastapi import FastAPI , HTTPException
8+ from fastapi import FastAPI , HTTPException , Query
99from fastapi .staticfiles import StaticFiles
1010from fastapi .responses import RedirectResponse
11+
1112import os
1213from pathlib import Path
14+ import json
15+ from threading import Lock
1316
1417app = FastAPI (title = "Mergington High School API" ,
1518 description = "API for viewing and signing up for extracurricular activities" )
1922app .mount ("/static" , StaticFiles (directory = os .path .join (Path (__file__ ).parent ,
2023 "static" )), name = "static" )
2124
22- # In-memory activity database
23- activities = {
24- "Chess Club" : {
25- "description" : "Learn strategies and compete in chess tournaments" ,
26- "schedule" : "Fridays, 3:30 PM - 5:00 PM" ,
27- "max_participants" : 12 ,
28- "participants" : ["michael@mergington.edu" , "daniel@mergington.edu" ]
29- },
30- "Programming Class" : {
31- "description" : "Learn programming fundamentals and build software projects" ,
32- "schedule" : "Tuesdays and Thursdays, 3:30 PM - 4:30 PM" ,
33- "max_participants" : 20 ,
34- "participants" : ["emma@mergington.edu" , "sophia@mergington.edu" ]
35- },
36- "Gym Class" : {
37- "description" : "Physical education and sports activities" ,
38- "schedule" : "Mondays, Wednesdays, Fridays, 2:00 PM - 3:00 PM" ,
39- "max_participants" : 30 ,
40- "participants" : ["john@mergington.edu" , "olivia@mergington.edu" ]
41- },
42- "Soccer Team" : {
43- "description" : "Practice and compete in interschool soccer matches" ,
44- "schedule" : "Tuesdays and Thursdays, 4:00 PM - 5:30 PM" ,
45- "max_participants" : 25 ,
46- "participants" : ["alex@mergington.edu" , "mia@mergington.edu" ]
47- },
48- "Swimming Club" : {
49- "description" : "Swimming lessons and competitive training" ,
50- "schedule" : "Wednesdays, 3:30 PM - 5:00 PM" ,
51- "max_participants" : 15 ,
52- "participants" : ["lucas@mergington.edu" ]
53- },
54- "Art Studio" : {
55- "description" : "Explore painting, drawing, and mixed media art" ,
56- "schedule" : "Mondays, 3:30 PM - 5:00 PM" ,
57- "max_participants" : 18 ,
58- "participants" : ["isabella@mergington.edu" , "ava@mergington.edu" ]
59- },
60- "Drama Club" : {
61- "description" : "Acting, theater production, and performance arts" ,
62- "schedule" : "Thursdays, 4:00 PM - 6:00 PM" ,
63- "max_participants" : 20 ,
64- "participants" : ["noah@mergington.edu" ]
65- },
66- "Debate Team" : {
67- "description" : "Develop critical thinking and public speaking skills" ,
68- "schedule" : "Wednesdays, 3:30 PM - 5:00 PM" ,
69- "max_participants" : 16 ,
70- "participants" : ["liam@mergington.edu" , "charlotte@mergington.edu" ]
71- },
72- "Science Olympiad" : {
73- "description" : "Compete in science and engineering challenges" ,
74- "schedule" : "Fridays, 3:30 PM - 5:30 PM" ,
75- "max_participants" : 15 ,
76- "participants" : ["ethan@mergington.edu" ]
77- }
78- }
25+
26+ # Persistent activities store
27+ DATA_FILE = os .path .join (Path (__file__ ).parent , "activities.json" )
28+ _activities_lock = Lock ()
29+
30+ def load_activities ():
31+ with _activities_lock :
32+ with open (DATA_FILE , "r" , encoding = "utf-8" ) as f :
33+ return json .load (f )
34+
35+ def save_activities (activities ):
36+ with _activities_lock :
37+ with open (DATA_FILE , "w" , encoding = "utf-8" ) as f :
38+ json .dump (activities , f , indent = 2 )
7939
8040
8141@app .get ("/" )
@@ -85,24 +45,33 @@ def root():
8545
8646@app .get ("/activities" )
8747def get_activities ():
88- return activities
48+ return load_activities ()
8949
9050
9151@app .post ("/activities/{activity_name}/signup" )
9252def signup_for_activity (activity_name : str , email : str ):
9353 """Sign up a student for an activity"""
94- # Validate activity exists
54+ activities = load_activities ()
9555 if activity_name not in activities :
9656 raise HTTPException (status_code = 404 , detail = "Activity not found" )
97-
98- # Get the specific activity
9957 activity = activities [activity_name ]
100-
101-
102- # Validate student is not already signed up
10358 if email in activity ["participants" ]:
10459 raise HTTPException (status_code = 400 , detail = "Student already signed up for this activity" )
105-
106- # Add student
10760 activity ["participants" ].append (email )
61+ save_activities (activities )
10862 return {"message" : f"Signed up { email } for { activity_name } " }
63+
64+
65+ # Unregister a participant from an activity
66+ @app .delete ("/activities/{activity_name}/unregister" )
67+ def unregister_from_activity (activity_name : str , email : str = Query (...)):
68+ """Unregister a student from an activity"""
69+ activities = load_activities ()
70+ if activity_name not in activities :
71+ raise HTTPException (status_code = 404 , detail = "Activity not found" )
72+ activity = activities [activity_name ]
73+ if email not in activity ["participants" ]:
74+ raise HTTPException (status_code = 400 , detail = "Student is not registered for this activity" )
75+ activity ["participants" ].remove (email )
76+ save_activities (activities )
77+ return {"message" : f"Unregistered { email } from { activity_name } " }
0 commit comments