-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
77 lines (60 loc) · 2.58 KB
/
app.py
File metadata and controls
77 lines (60 loc) · 2.58 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
"""
High School Management System API
A super simple FastAPI application that allows students to view and sign up
for extracurricular activities at Mergington High School.
"""
from fastapi import FastAPI, HTTPException, Query
from fastapi.staticfiles import StaticFiles
from fastapi.responses import RedirectResponse
import os
from pathlib import Path
import json
from threading import Lock
app = FastAPI(title="Mergington High School API",
description="API for viewing and signing up for extracurricular activities")
# Mount the static files directory
current_dir = Path(__file__).parent
app.mount("/static", StaticFiles(directory=os.path.join(Path(__file__).parent,
"static")), name="static")
# Persistent activities store
DATA_FILE = os.path.join(Path(__file__).parent, "activities.json")
_activities_lock = Lock()
def load_activities():
with _activities_lock:
with open(DATA_FILE, "r", encoding="utf-8") as f:
return json.load(f)
def save_activities(activities):
with _activities_lock:
with open(DATA_FILE, "w", encoding="utf-8") as f:
json.dump(activities, f, indent=2)
@app.get("/")
def root():
return RedirectResponse(url="/static/index.html")
@app.get("/activities")
def get_activities():
return load_activities()
@app.post("/activities/{activity_name}/signup")
def signup_for_activity(activity_name: str, email: str):
"""Sign up a student for an activity"""
activities = load_activities()
if activity_name not in activities:
raise HTTPException(status_code=404, detail="Activity not found")
activity = activities[activity_name]
if email in activity["participants"]:
raise HTTPException(status_code=400, detail="Student already signed up for this activity")
activity["participants"].append(email)
save_activities(activities)
return {"message": f"Signed up {email} for {activity_name}"}
# Unregister a participant from an activity
@app.delete("/activities/{activity_name}/unregister")
def unregister_from_activity(activity_name: str, email: str = Query(...)):
"""Unregister a student from an activity"""
activities = load_activities()
if activity_name not in activities:
raise HTTPException(status_code=404, detail="Activity not found")
activity = activities[activity_name]
if email not in activity["participants"]:
raise HTTPException(status_code=400, detail="Student is not registered for this activity")
activity["participants"].remove(email)
save_activities(activities)
return {"message": f"Unregistered {email} from {activity_name}"}