Files
rezept_finder/backend/app/routes/sessions.py
T
2026-06-09 23:10:17 +02:00

75 lines
2.3 KiB
Python

import random
import string
from flask import Blueprint, jsonify, request
from ..models import db
from ..models.session import Session, Participant
from ..services.session_recipes import add_recipe_batch, serialize_recipe
from ..services.session_settings import get_match_mode, get_required_likes, get_voting_round
bp = Blueprint("sessions", __name__)
def generate_code():
return "".join(random.choices(string.ascii_uppercase + string.digits, k=6))
def serialize_session(session):
return {
"id": session.id,
"code": session.code,
"status": session.status,
"currentRecipeIndex": session.current_recipe_index,
"participants": [
{"id": p.id, "name": p.name, "isHost": p.is_host}
for p in session.participants
],
"recipes": [serialize_recipe(recipe) for recipe in session.recipes],
"matchedRecipeId": session.matched_recipe_id,
"requiredLikes": get_required_likes(session),
"matchMode": get_match_mode(session),
"votingRound": get_voting_round(session),
}
@bp.post("")
def create_session():
data = request.get_json() or {}
name = (data.get("name") or "Host").strip()
code = generate_code()
while Session.query.filter_by(code=code).first():
code = generate_code()
session = Session(code=code)
db.session.add(session)
db.session.flush()
host = Participant(session_id=session.id, name=name, is_host=True)
db.session.add(host)
add_recipe_batch(session)
db.session.commit()
return jsonify({"session": serialize_session(session), "participantId": host.id})
@bp.post("/<code>/join")
def join_session(code):
data = request.get_json() or {}
name = (data.get("name") or "Gast").strip()
session = Session.query.filter_by(code=code.upper()).first_or_404()
if session.status != "waiting":
return jsonify({"error": "Session wurde bereits gestartet."}), 409
participant = Participant(session_id=session.id, name=name, is_host=False)
db.session.add(participant)
db.session.commit()
return jsonify({"session": serialize_session(session), "participantId": participant.id})
@bp.get("/<code>")
def get_session(code):
session = Session.query.filter_by(code=code.upper()).first_or_404()
return jsonify({"session": serialize_session(session)})