diff --git a/backend/event_signups.py b/backend/event_signups.py index f707eef..c5b0b2a 100644 --- a/backend/event_signups.py +++ b/backend/event_signups.py @@ -36,4 +36,20 @@ def count_confirmations(event_id): (event_id,) ) - return result["amount"] \ No newline at end of file + return result["amount"] + +def get_event_responses(event_id): + + return fetch_all( + """ + SELECT + users.id, + users.username, + event_signups.status + FROM event_signups + JOIN users + ON users.id = event_signups.user_id + WHERE event_signups.event_id = ? + """, + (event_id,) + ) \ No newline at end of file diff --git a/backend/events.py b/backend/events.py index ceae02c..fc66a5b 100644 --- a/backend/events.py +++ b/backend/events.py @@ -116,3 +116,61 @@ def check_event_threshold(event_id): """, (event_id,) ) + +def delete_event(event_id): + + from database import execute + + execute( + """ + DELETE FROM events + WHERE id = ? + """, + (event_id,) + ) + +def update_event( + event_id, + title, + description, + start_time, + end_time, + min_people +): + + from database import execute + + execute( + """ + UPDATE events + SET + title = COALESCE(?, title), + description = COALESCE(?, description), + start_time = COALESCE(?, start_time), + end_time = COALESCE(?, end_time), + min_people = COALESCE(?, min_people) + WHERE id = ? + """, + ( + title, + description, + start_time, + end_time, + min_people, + event_id + ) + ) + +def get_room_events(room_id): + + from database import fetch_all + + return fetch_all( + """ + SELECT * + FROM events + WHERE room_id = ? + ORDER BY start_time + """, + (room_id,) + ) \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index 4802143..5ee74bf 100644 --- a/backend/main.py +++ b/backend/main.py @@ -14,6 +14,8 @@ import sqlite3 from typing import Literal from fastapi.middleware.cors import CORSMiddleware +from events import delete_event + class Login(BaseModel): username: str password: str @@ -51,6 +53,13 @@ class RoomSearch(BaseModel): class RoomJoin(BaseModel): invite_code: str +class EventUpdate(BaseModel): + title: str | None = None + description: str | None = None + start_time: str | None = None + end_time: str | None = None + min_people: int | None = None + app = FastAPI( title="Calendar API", @@ -134,10 +143,17 @@ def api_login(login: Login): def get_me( user_id: int = Depends(get_current_user) ): - return { - "user_id": user_id - } + user = fetch_one( + """ + SELECT id, username + FROM users + WHERE id = ? + """, + (user_id,) + ) + + return dict(user) # rooms @@ -157,7 +173,9 @@ def delete_room( "reason": "no_permission" } return { - "status": "deleted" + "status": "not deleted", + "reason": "you are a poopie", + "actual Reason": "i have not built it yet" } @@ -359,8 +377,8 @@ def respond_event( "going": count_confirmations(event_id) } -@app.get("/part_of_rooms") -def get_the_rooms( +@app.get("/rooms") +def api_get_rooms( user_id: int = Depends(get_current_user) ): rooms = get_rooms(user_id) @@ -388,6 +406,315 @@ def api_get_room( return room +@app.get("/rooms/{room_id}/members") +def api_room_members( + room_id: int, + user_id: int = Depends(get_current_user) +): + + room = get_room(room_id, user_id) + + if room is None: + raise HTTPException( + status_code=404, + detail="room not found or no permission" + ) + + members = get_room_members(room_id) + + return { + "members": [dict(member) for member in members] + } + +@app.get("/events/{event_id}") +def api_get_event( + event_id: int, + user_id: int = Depends(get_current_user) +): + + event = fetch_one( + """ + SELECT * + FROM events + WHERE id = ? + """, + (event_id,) + ) + + if event is None: + raise HTTPException( + status_code=404, + detail="event not found" + ) + + member = fetch_one( + """ + SELECT * + FROM room_members + WHERE room_id = ? + AND user_id = ? + """, + ( + event["room_id"], + user_id + ) + ) + + if member is None: + raise HTTPException( + status_code=403, + detail="no access" + ) + + return dict(event) + +@app.get("/events/{event_id}/responses") +def api_event_responses( + event_id: int, + user_id: int = Depends(get_current_user) +): + + event = fetch_one( + """ + SELECT room_id + FROM events + WHERE id = ? + """, + (event_id,) + ) + + if event is None: + raise HTTPException( + status_code=404, + detail="event not found" + ) + + member = fetch_one( + """ + SELECT * + FROM room_members + WHERE room_id = ? + AND user_id = ? + """, + ( + event["room_id"], + user_id + ) + ) + + if member is None: + raise HTTPException( + status_code=403, + detail="no access" + ) + + responses = get_event_responses(event_id) + + return { + "responses": [dict(r) for r in responses] + } + +@app.get("/users/{user_id}") +def api_get_user( + user_id: int, + current_user: int = Depends(get_current_user) +): + + user = fetch_one( + """ + SELECT id, username + FROM users + WHERE id = ? + """, + (user_id,) + ) + + if user is None: + raise HTTPException( + status_code=404, + detail="user not found" + ) + + return dict(user) + +@app.delete("/events/{event_id}") +def api_delete_event( + event_id: int, + user_id: int = Depends(get_current_user) +): + + event = fetch_one( + """ + SELECT creator_id + FROM events + WHERE id = ? + """, + (event_id,) + ) + + if event is None: + raise HTTPException( + status_code=404, + detail="event not found" + ) + + if event["creator_id"] != user_id: + raise HTTPException( + status_code=403, + detail="not event owner" + ) + + delete_event(event_id) + + return { + "status": "deleted" + } + +@app.patch("/events/{event_id}") +def api_update_event( + event_id: int, + event: EventUpdate, + user_id: int = Depends(get_current_user) +): + + old = fetch_one( + """ + SELECT creator_id + FROM events + WHERE id = ? + """, + (event_id,) + ) + + if old is None: + raise HTTPException( + status_code=404, + detail="event not found" + ) + + if old["creator_id"] != user_id: + raise HTTPException( + status_code=403, + detail="not owner" + ) + + + update_event( + event_id, + event.title, + event.description, + event.start_time, + event.end_time, + event.min_people + ) + + + return { + "status": "updated" + } + +@app.delete("/rooms/{room_id}/members/me") +def api_leave_room( + room_id: int, + user_id: int = Depends(get_current_user) +): + + member = fetch_one( + """ + SELECT * + FROM room_members + WHERE room_id = ? + AND user_id = ? + """, + ( + room_id, + user_id + ) + ) + + if member is None: + raise HTTPException( + status_code=404, + detail="not member" + ) + + + leave_room( + room_id, + user_id + ) + + + return { + "status": "left" + } + +@app.get("/rooms/{room_id}/events") +def api_room_events( + room_id: int, + user_id: int = Depends(get_current_user) +): + + member = fetch_one( + """ + SELECT * + FROM room_members + WHERE room_id = ? + AND user_id = ? + """, + ( + room_id, + user_id + ) + ) + + if member is None: + raise HTTPException( + status_code=403, + detail="no access" + ) + + + events = get_room_events(room_id) + + + return { + "events": [ + dict(event) + for event in events + ] + } + +from fastapi.responses import PlainTextResponse +import requests + + +@app.get("/ascii-art", response_class=PlainTextResponse) +def ascii_art(): + response = requests.get( + "http://localhost:8000/me" + ) + + data = response.json() + me_endpoint = data + status = "online" + + return f""" + ██████╗ █████╗ ██╗ ███████╗███╗ ██╗██████╗ █████╗ ██████╗ + ██╔════╝██╔══██╗██║ ██╔════╝████╗ ██║██╔══██╗██╔══██╗██╔══██╗ + ██║ ███████║██║ █████╗ ██╔██╗ ██║██║ ██║███████║██████╔╝ + ██║ ██╔══██║██║ ██╔══╝ ██║╚██╗██║██║ ██║██╔══██║██╔══██╗ + ╚██████╗██║ ██║███████╗███████╗██║ ╚████║██████╔╝██║ ██║██║ ██║ + ╚═════╝╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═══╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ + + status: {status} + + "You are a stinky Poo" + - Ben de Roo, programmer +""" + +print() +print() print() print("YOU CAN NOT START THE SERVER WITH PYTHON") print("start with:") diff --git a/backend/rooms.py b/backend/rooms.py index 868a98d..36f09c4 100644 --- a/backend/rooms.py +++ b/backend/rooms.py @@ -201,4 +201,34 @@ def get_room(room_id, user_id): "members": [dict(member) for member in members], "events": [dict(event) for event in events] } - \ No newline at end of file + +def get_room_members(room_id): + + return fetch_all( + """ + SELECT + users.id, + users.username + FROM room_members + JOIN users + ON users.id = room_members.user_id + WHERE room_members.room_id = ? + """, + (room_id,) + ) + +def leave_room(room_id, user_id): + + from database import execute + + execute( + """ + DELETE FROM room_members + WHERE room_id = ? + AND user_id = ? + """, + ( + room_id, + user_id + ) + ) \ No newline at end of file diff --git a/database/calendar.db b/database/calendar.db new file mode 100644 index 0000000..d0ecf64 Binary files /dev/null and b/database/calendar.db differ diff --git a/database/calendar.db-journal b/database/calendar.db-journal new file mode 100644 index 0000000..ce9c261 Binary files /dev/null and b/database/calendar.db-journal differ