From e4ae4bc9d5ed21fb113ce6f4deb3ce0162421222 Mon Sep 17 00:00:00 2001 From: ben Date: Mon, 3 Aug 2026 17:45:56 +0200 Subject: [PATCH] meerdere updates --- backend/event_signups.py | 39 +++++++++++++++++ backend/events.py | 51 +++++++++++++++++++++- backend/main.py | 92 ++++++++++++++++++++++++++++++++------- backend/permissions.py | 34 +++++++++++++++ backend/rooms.py | 13 +++--- database/calendar.db | Bin 49152 -> 49152 bytes 6 files changed, 205 insertions(+), 24 deletions(-) create mode 100644 backend/event_signups.py create mode 100644 backend/permissions.py diff --git a/backend/event_signups.py b/backend/event_signups.py new file mode 100644 index 0000000..f707eef --- /dev/null +++ b/backend/event_signups.py @@ -0,0 +1,39 @@ +from database import execute, fetch_one + + +def respond_to_event(event_id, user_id, status): + + query = """ + INSERT INTO event_signups + (event_id, user_id, status) + VALUES (?, ?, ?) + + ON CONFLICT(event_id, user_id) + DO UPDATE SET status = excluded.status + """ + + return execute( + query, + ( + event_id, + user_id, + status + ) + ) + + +def count_confirmations(event_id): + + query = """ + SELECT COUNT(*) as amount + FROM event_signups + WHERE event_id = ? + AND status = 'going' + """ + + result = fetch_one( + query, + (event_id,) + ) + + return result["amount"] \ No newline at end of file diff --git a/backend/events.py b/backend/events.py index aa24bba..ceae02c 100644 --- a/backend/events.py +++ b/backend/events.py @@ -1,4 +1,21 @@ from database import execute +from database import fetch_all, fetch_one + + +def get_user_events(user_id): + + query = """ + SELECT events.* + FROM events + JOIN room_members + ON events.room_id = room_members.room_id + WHERE room_members.user_id = ? + """ + + return fetch_all( + query, + (user_id,) + ) def create_event( room_id, @@ -66,4 +83,36 @@ def create_event( # ) # print("Nieuw event ID:", event) - \ No newline at end of file + +def check_event_threshold(event_id): + + query = """ + SELECT + events.min_people, + COUNT(event_signups.user_id) AS going + FROM events + + LEFT JOIN event_signups + ON events.id = event_signups.event_id + AND event_signups.status = 'going' + + WHERE events.id = ? + + GROUP BY events.id + """ + + event = fetch_one( + query, + (event_id,) + ) + + if event["going"] >= event["min_people"]: + + execute( + """ + UPDATE events + SET status = 'confirmed' + WHERE id = ? + """, + (event_id,) + ) diff --git a/backend/main.py b/backend/main.py index 401bf59..e072752 100644 --- a/backend/main.py +++ b/backend/main.py @@ -2,10 +2,15 @@ from fastapi import FastAPI, Depends from pydantic import BaseModel from database import fetch_all, fetch_one -from events import create_event +from events import create_event, get_user_events from auth import create_user, verify_user, create_token, get_current_user from rooms import create_room, search_room, accept_room +from permissions import has_role +from events import create_event, get_user_events, check_event_threshold +from fastapi import HTTPException +import sqlite3 +from typing import Literal class Login(BaseModel): username: str @@ -118,6 +123,42 @@ def get_me( # rooms +@app.delete("/room/{room_id}") +def delete_room( + room_id: int, + user_id: int = Depends(get_current_user) +): + + if not has_role( + room_id, + user_id, + ["owner", "admin"] + ): + return { + "status": "denied", + "reason": "no_permission" + } + return { + "status": "deleted" + } + + +# @app.post("/create-room") +# def api_create_room( +# room: RoomCreate, +# user_id: int = Depends(get_current_user) +# ): + +# room_id = create_room( +# user_id, +# room.room_name, +# room.invite_code +# ) + +# return { +# "status": "created", +# **room_id +# } @app.post("/create-room") def api_create_room( @@ -125,18 +166,24 @@ def api_create_room( user_id: int = Depends(get_current_user) ): - room_id = create_room( - room.room_name, - user_id, - room.invite_code - ) + try: + room_id = create_room( + user_id, + room.room_name, + room.invite_code + ) + + except sqlite3.IntegrityError: + raise HTTPException( + status_code=409, + detail="invite_code already exists" + ) return { "status": "created", "room_id": room_id } - @app.post("/search-room") def api_search_room( room: RoomSearch @@ -188,7 +235,6 @@ def api_create_event( user_id: int = Depends(get_current_user) ): - # check of gebruiker lid is member = fetch_one( """ SELECT * @@ -233,15 +279,29 @@ def get_events( user_id: int = Depends(get_current_user) ): - events = fetch_all( - """ - SELECT * - FROM events - WHERE creator_id = ? - """, - (user_id,) - ) + events = get_user_events(user_id) return { "events": [dict(event) for event in events] + } + + +@app.post("/events/{event_id}/respond") +def respond_event( + event_id: int, + status: Literal["going", "maybe", "declined"], + user_id: int = Depends(get_current_user) +): + + respond_to_event( + event_id, + user_id, + status + ) + + check_event_threshold(event_id) + + return { + "status": "response_saved", + "going": count_confirmations(event_id) } \ No newline at end of file diff --git a/backend/permissions.py b/backend/permissions.py new file mode 100644 index 0000000..f7c7035 --- /dev/null +++ b/backend/permissions.py @@ -0,0 +1,34 @@ +from database import fetch_one + + +def get_room_role(room_id, user_id): + member = fetch_one( + """ + SELECT role + FROM room_members + WHERE room_id = ? + AND user_id = ? + """, + ( + room_id, + user_id + ) + ) + + if member is None: + return None + + return member["role"] + + +def has_role(room_id, user_id, allowed_roles): + + role = get_room_role( + room_id, + user_id + ) + + if role is None: + return False + + return role in allowed_roles \ No newline at end of file diff --git a/backend/rooms.py b/backend/rooms.py index 675d5bd..f745cdc 100644 --- a/backend/rooms.py +++ b/backend/rooms.py @@ -5,8 +5,8 @@ from database import execute, fetch_one DEFAULT_ROLE = "member" def create_room( + user_id, room_name, - creator_id, invite_code ): query = """ @@ -18,7 +18,7 @@ def create_room( query, ( room_name, - creator_id, + user_id, invite_code ) ) @@ -48,10 +48,10 @@ def create_room( member_id = execute( query3, - ( + ( + user_id, room_id, - creator_id, - role + "owner" ) ) @@ -99,10 +99,9 @@ def accept_room(user_id, invite_code): room_id = room["id"] - # check dubbele join existing = fetch_one( """ - SELECT id + SELECT * FROM room_members WHERE room_id = ? AND user_id = ? diff --git a/database/calendar.db b/database/calendar.db index 6a02334437931e7fb56fd6fc2561f1586b42e8b7..baee7cc2a9e636093d2f040549342f1f0f655bb8 100644 GIT binary patch delta 693 zcmZo@U~Xt&o*>O=HBrWy(Q0GD5`FDQId+GkxIC6T8d?MVp?dHxqDSvxS3a4c}1n3pSe#?g<(iud01pdMMYv{ zxO-kelwOpNQD(YVl6m4}7x@DMZ2Tt}_f*yQDNdlc}Dq(j?$Ai_{VYa--5x-iVE5Mf}%)zKuooX6IBKH zQ3XXOpN#ip)~M!w10@?+Teukjz_KL!-u$S){>s*izV@~wI; zAvWG_2L6@&cD&tukNA9e@AK>fx_A}Ow}ni7&tj)Wi>T5MP)e)it-EcixYE7 zGD}i(O0rUuQj3!_iZZjxGV`*tQjH9Z%ybQOjT8(ltqcrMd7!|8=uS<^76zKhC@b%) zt1BwY$O<#mJ2A0XA+;nmFFaKtJuxv)Avd*Ta#p{AkdYzKIAjA@Hv9DLVB}%pzreu% zmH#FGUH%Kem^#2O$<4yT$SBUtnx3DTm(In^!pSHOVNZTJUz&@B|0x6iZ~ia*Z#N4R xoa3Juz&ZKeel}fJ7B-+lMpkAp#l*zI!pX_W1q>-x{(DgMz!<$pARPCr0RZX^yFdT{ delta 256 zcmZo@U~Xt&o*>PrJ5k1&QFmj)5`I2beisJ*PyA2#ukv^EyKGieFyf!=B7XoVewl&) zC;vzOJNz&BFK-q!ILN>Gvc8yrst_j=vp8c>etvE-GbbaESz4T0RLsiDz`(%Fzkz}O z8UGpn4M1}i@lW319|zQUhJW&{cnct79slG5`9Tnod-ZBUEPOr;{44qG_#W~3@azM@ z&58o6cqSj{IX!W~!OcE>I~X~b_+K*cf8~F{)qvclV8r41`2**;Q!741tPdW kM2?MxlaY~$iG_uelamYR5LW(sU