update remove_user_as_admin

This commit is contained in:
ben
2026-08-17 17:08:54 +02:00
parent c527a3625e
commit a585a6fa17
+154 -39
View File
@@ -55,6 +55,7 @@ from event_signups import (
get_event_responses, get_event_responses,
) )
class Login(BaseModel): class Login(BaseModel):
username: str username: str
password: str password: str
@@ -117,9 +118,14 @@ app.add_middleware(
allow_headers=["*"], allow_headers=["*"],
) )
# generaal # generaal
@app.get("/") @app.get(
"/",
summary="API status",
description="Returns the current status of the Calendar API.",
)
def home(): def home():
return { return {
"status": "online", "status": "online",
@@ -127,7 +133,11 @@ def home():
} }
@app.get("/database") @app.get(
"/database",
summary="Get database status",
description="Returns the names of all tables currently available in the database.",
)
def database_status( def database_status(
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
): ):
@@ -140,7 +150,11 @@ def database_status(
# users # users
@app.post("/create-user") @app.post(
"/create-user",
summary="Create a user",
description="Creates a new user account. The username must be unique.",
)
def api_create_user(user: UserCreate): def api_create_user(user: UserCreate):
try: try:
user_id = create_user( user_id = create_user(
@@ -160,7 +174,11 @@ def api_create_user(user: UserCreate):
} }
@app.post("/login") @app.post(
"/login",
summary="Log in",
description="Authenticates a user and returns a JWT access token.",
)
def api_login(login: Login): def api_login(login: Login):
user_id = verify_user( user_id = verify_user(
login.username, login.username,
@@ -181,7 +199,11 @@ def api_login(login: Login):
} }
@app.get("/me") @app.get(
"/me",
summary="Get current user",
description="Returns the profile of the currently authenticated user.",
)
def get_me( def get_me(
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
): ):
@@ -196,7 +218,11 @@ def get_me(
return dict(user) return dict(user)
@app.get("/users/{user_id}") @app.get(
"/users/{user_id}",
summary="Get a user",
description="Returns the profile of a user by their user ID.",
)
def api_get_user( def api_get_user(
user_id: int, user_id: int,
current_user: int = Depends(get_current_user), current_user: int = Depends(get_current_user),
@@ -211,7 +237,14 @@ def api_get_user(
return dict(user) return dict(user)
@app.post("/create-room")
# rooms
@app.post(
"/create-room",
summary="Create a room",
description="Creates a new room and makes the authenticated user its owner.",
)
def api_create_room( def api_create_room(
room: RoomCreate, room: RoomCreate,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -235,7 +268,11 @@ def api_create_room(
} }
@app.post("/search-room") @app.post(
"/search-room",
summary="Search for a room",
description="Searches for a room using its invite code.",
)
def api_search_room( def api_search_room(
room: RoomSearch, room: RoomSearch,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -256,7 +293,11 @@ def api_search_room(
} }
@app.post("/join-room") @app.post(
"/join-room",
summary="Join a room",
description="Joins the authenticated user to a room using its invite code.",
)
def api_join_room( def api_join_room(
room: RoomJoin, room: RoomJoin,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -278,7 +319,11 @@ def api_join_room(
} }
@app.get("/rooms") @app.get(
"/rooms",
summary="Get user's rooms",
description="Returns all rooms the authenticated user is a member of.",
)
def api_get_rooms( def api_get_rooms(
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
): ):
@@ -289,7 +334,11 @@ def api_get_rooms(
} }
@app.get("/rooms/{room_id}") @app.get(
"/rooms/{room_id}",
summary="Get a room",
description="Returns information about a room. The authenticated user must be a member.",
)
def api_get_room( def api_get_room(
room_id: int, room_id: int,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -314,7 +363,11 @@ def api_get_room(
return dict(room) return dict(room)
@app.get("/rooms/{room_id}/whoami") @app.get(
"/rooms/{room_id}/whoami",
summary="Get current user's room role",
description="Returns the authenticated user's role and permissions within a room.",
)
def api_room_whoami( def api_room_whoami(
room_id: int, room_id: int,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -334,7 +387,11 @@ def api_room_whoami(
} }
@app.get("/rooms/{room_id}/members") @app.get(
"/rooms/{room_id}/members",
summary="Get room members",
description="Returns all members of a room. The authenticated user must be a member.",
)
def api_room_members( def api_room_members(
room_id: int, room_id: int,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -352,7 +409,11 @@ def api_room_members(
} }
@app.delete("/rooms/{room_id}/members/me") @app.delete(
"/rooms/{room_id}/members/me",
summary="Leave a room",
description="Removes the authenticated user from a room.",
)
def api_leave_room( def api_leave_room(
room_id: int, room_id: int,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -372,7 +433,18 @@ def api_leave_room(
"status": "left", "status": "left",
} }
@app.delete("/rooms/{room_id}/members/{user_id}")
@app.delete(
"/rooms/{room_id}/members/{user_id}",
summary="Remove a room member",
description="""
Removes a member from a room.
Admins can remove members with a lower role.
Owners can remove members and admins.
A user cannot remove someone with an equal or higher role.
""",
)
def api_remove_member( def api_remove_member(
room_id: int, room_id: int,
user_id: int, user_id: int,
@@ -412,9 +484,14 @@ def api_remove_member(
"user_id": user_id, "user_id": user_id,
} }
# some settings
@app.patch("/rooms/{room_id}") # room settings
@app.patch(
"/rooms/{room_id}",
summary="Rename a room",
description="Changes the name of a room. Requires admin or owner permissions.",
)
def update_room( def update_room(
room_id: int, room_id: int,
data: RoomUpdate, data: RoomUpdate,
@@ -433,7 +510,11 @@ def update_room(
) )
@app.post("/rooms/{room_id}/invite-code") @app.post(
"/rooms/{room_id}/invite-code",
summary="Regenerate invite code",
description="Generates a new invite code for a room. Requires admin or owner permissions.",
)
def update_invite_code( def update_invite_code(
room_id: int, room_id: int,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -447,7 +528,11 @@ def update_invite_code(
return regenerate_invite_code(room_id) return regenerate_invite_code(room_id)
@app.delete("/rooms/{room_id}") @app.delete(
"/rooms/{room_id}",
summary="Delete a room",
description="Permanently deletes a room. Only the room owner can perform this action.",
)
def delete_room( def delete_room(
room_id: int, room_id: int,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -463,7 +548,11 @@ def delete_room(
# events # events
@app.get("/rooms/{room_id}/events") @app.get(
"/rooms/{room_id}/events",
summary="Get room events",
description="Returns all events belonging to a room. The authenticated user must be a member.",
)
def api_room_events( def api_room_events(
room_id: int, room_id: int,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -481,7 +570,11 @@ def api_room_events(
} }
@app.post("/events") @app.post(
"/events",
summary="Create an event",
description="Creates a new event in a room. The authenticated user must be a member of the room.",
)
def api_create_event( def api_create_event(
event: EventCreate, event: EventCreate,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -511,7 +604,11 @@ def api_create_event(
} }
@app.get("/events") @app.get(
"/events",
summary="Get user's events",
description="Returns events from rooms the authenticated user belongs to.",
)
def get_events( def get_events(
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
): ):
@@ -522,7 +619,11 @@ def get_events(
} }
@app.get("/events/{event_id}") @app.get(
"/events/{event_id}",
summary="Get an event",
description="Returns a specific event. The authenticated user must be a member of its room.",
)
def api_get_event( def api_get_event(
event_id: int, event_id: int,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -548,7 +649,11 @@ def api_get_event(
return dict(event) return dict(event)
@app.post("/events/{event_id}/respond") @app.post(
"/events/{event_id}/respond",
summary="Respond to an event",
description="Saves the authenticated user's response to an event and checks whether the event reached its confirmation threshold.",
)
def respond_event( def respond_event(
event_id: int, event_id: int,
status: Literal[ status: Literal[
@@ -590,7 +695,11 @@ def respond_event(
} }
@app.get("/events/{event_id}/responses") @app.get(
"/events/{event_id}/responses",
summary="Get event responses",
description="Returns all responses submitted by members for an event.",
)
def api_event_responses( def api_event_responses(
event_id: int, event_id: int,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -622,7 +731,12 @@ def api_event_responses(
], ],
} }
@app.patch("/events/{event_id}")
@app.patch(
"/events/{event_id}",
summary="Update an event",
description="Updates an event. The event creator or a room admin can perform this action.",
)
def api_update_event( def api_update_event(
event_id: int, event_id: int,
event: EventUpdate, event: EventUpdate,
@@ -664,7 +778,11 @@ def api_update_event(
} }
@app.delete("/events/{event_id}") @app.delete(
"/events/{event_id}",
summary="Delete an event",
description="Deletes an event. The event creator or a room admin can perform this action.",
)
def api_delete_event( def api_delete_event(
event_id: int, event_id: int,
user_id: int = Depends(get_current_user), user_id: int = Depends(get_current_user),
@@ -697,23 +815,20 @@ def api_delete_event(
"status": "deleted", "status": "deleted",
} }
# easter egg # easter egg
@app.get( @app.get(
"/ascii-art", "/ascii-art",
summary="Display ASCII art",
description="Returns the Calendar API ASCII art as plain text.",
response_class=PlainTextResponse, response_class=PlainTextResponse,
) )
def ascii_art(): def ascii_art():
return """ return """ __ .__ __
██████╗ █████╗ ██╗ ███████╗███╗ ██╗██████╗ █████╗ ██████╗ ___.__. ____ __ __ _____ _______ ____ _____ _______/ |_|__| ____ | | _____.__. ______ ____ ____
██╔════╝██╔══██╗██║ ██╔════╝████╗ ██║██╔══██╗██╔══██╗██╔══██╗ < | |/ _ \| | \ \__ \\\\_ __ \_/ __ \ \__ \ / ___/\ __\ |/ \| |/ < | | \____ \ / _ \ / _ \
██║ ███████║██║ █████╗ ██╔██╗ ██║██║ ██║███████║██████╔╝ \___ ( <_> ) | / / __ \| | \/\ ___/ / __ \_ \___ \ | | | | | \ < \___ | | |_> > <_> | <_> )
██║ ██╔══██║██║ ██╔══╝ ██║╚██╗██║██║ ██║██╔══██║██╔══██╗ / ____|\____/|____/ (____ /__| \___ > (____ / /____ > |__| |__|___| /__|_ \/ ____| | __/ \____/ \____/
╚██████╗██║ ██║███████╗███████╗██║ ╚████║██████╔╝██║ ██║██║ ██║ \/ \/ \/ \/ \/ \/ \/\/ |__|
╚═════╝╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═══╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝
status: online
"You are a stinky Poo"
- Ben de Roo, programmer
""" """