meerdere updates
This commit is contained in:
@@ -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"]
|
||||||
@@ -1,4 +1,21 @@
|
|||||||
from database import execute
|
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(
|
def create_event(
|
||||||
room_id,
|
room_id,
|
||||||
@@ -67,3 +84,35 @@ def create_event(
|
|||||||
|
|
||||||
# print("Nieuw event ID:", event)
|
# print("Nieuw event ID:", event)
|
||||||
|
|
||||||
|
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,)
|
||||||
|
)
|
||||||
|
|||||||
+72
-12
@@ -2,10 +2,15 @@ from fastapi import FastAPI, Depends
|
|||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from database import fetch_all, fetch_one
|
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 auth import create_user, verify_user, create_token, get_current_user
|
||||||
from rooms import create_room, search_room, accept_room
|
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):
|
class Login(BaseModel):
|
||||||
username: str
|
username: str
|
||||||
@@ -118,6 +123,42 @@ def get_me(
|
|||||||
|
|
||||||
# rooms
|
# 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")
|
@app.post("/create-room")
|
||||||
def api_create_room(
|
def api_create_room(
|
||||||
@@ -125,18 +166,24 @@ def api_create_room(
|
|||||||
user_id: int = Depends(get_current_user)
|
user_id: int = Depends(get_current_user)
|
||||||
):
|
):
|
||||||
|
|
||||||
|
try:
|
||||||
room_id = create_room(
|
room_id = create_room(
|
||||||
room.room_name,
|
|
||||||
user_id,
|
user_id,
|
||||||
|
room.room_name,
|
||||||
room.invite_code
|
room.invite_code
|
||||||
)
|
)
|
||||||
|
|
||||||
|
except sqlite3.IntegrityError:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=409,
|
||||||
|
detail="invite_code already exists"
|
||||||
|
)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"status": "created",
|
"status": "created",
|
||||||
"room_id": room_id
|
"room_id": room_id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@app.post("/search-room")
|
@app.post("/search-room")
|
||||||
def api_search_room(
|
def api_search_room(
|
||||||
room: RoomSearch
|
room: RoomSearch
|
||||||
@@ -188,7 +235,6 @@ def api_create_event(
|
|||||||
user_id: int = Depends(get_current_user)
|
user_id: int = Depends(get_current_user)
|
||||||
):
|
):
|
||||||
|
|
||||||
# check of gebruiker lid is
|
|
||||||
member = fetch_one(
|
member = fetch_one(
|
||||||
"""
|
"""
|
||||||
SELECT *
|
SELECT *
|
||||||
@@ -233,15 +279,29 @@ def get_events(
|
|||||||
user_id: int = Depends(get_current_user)
|
user_id: int = Depends(get_current_user)
|
||||||
):
|
):
|
||||||
|
|
||||||
events = fetch_all(
|
events = get_user_events(user_id)
|
||||||
"""
|
|
||||||
SELECT *
|
|
||||||
FROM events
|
|
||||||
WHERE creator_id = ?
|
|
||||||
""",
|
|
||||||
(user_id,)
|
|
||||||
)
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"events": [dict(event) for event in events]
|
"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)
|
||||||
|
}
|
||||||
@@ -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
|
||||||
+5
-6
@@ -5,8 +5,8 @@ from database import execute, fetch_one
|
|||||||
DEFAULT_ROLE = "member"
|
DEFAULT_ROLE = "member"
|
||||||
|
|
||||||
def create_room(
|
def create_room(
|
||||||
|
user_id,
|
||||||
room_name,
|
room_name,
|
||||||
creator_id,
|
|
||||||
invite_code
|
invite_code
|
||||||
):
|
):
|
||||||
query = """
|
query = """
|
||||||
@@ -18,7 +18,7 @@ def create_room(
|
|||||||
query,
|
query,
|
||||||
(
|
(
|
||||||
room_name,
|
room_name,
|
||||||
creator_id,
|
user_id,
|
||||||
invite_code
|
invite_code
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -49,9 +49,9 @@ def create_room(
|
|||||||
member_id = execute(
|
member_id = execute(
|
||||||
query3,
|
query3,
|
||||||
(
|
(
|
||||||
|
user_id,
|
||||||
room_id,
|
room_id,
|
||||||
creator_id,
|
"owner"
|
||||||
role
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -99,10 +99,9 @@ def accept_room(user_id, invite_code):
|
|||||||
|
|
||||||
room_id = room["id"]
|
room_id = room["id"]
|
||||||
|
|
||||||
# check dubbele join
|
|
||||||
existing = fetch_one(
|
existing = fetch_one(
|
||||||
"""
|
"""
|
||||||
SELECT id
|
SELECT *
|
||||||
FROM room_members
|
FROM room_members
|
||||||
WHERE room_id = ?
|
WHERE room_id = ?
|
||||||
AND user_id = ?
|
AND user_id = ?
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user