75 lines
2.3 KiB
Python
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)})
|