import random import string from flask import Blueprint, jsonify, request from ..models import db from ..models.session import Session, Participant, Recipe from ..services.recipes import get_recipes 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": [ { "id": r.id, "title": r.title, "url": r.url, "imageUrl": r.image_url, "meta": r.meta, "position": r.position, } for r in session.recipes ], "matchedRecipeId": session.matched_recipe_id, } @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) for index, recipe_data in enumerate(get_recipes()): db.session.add(Recipe(session_id=session.id, position=index, **recipe_data)) db.session.commit() return jsonify({"session": serialize_session(session), "participantId": host.id}) @bp.post("//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("/") def get_session(code): session = Session.query.filter_by(code=code.upper()).first_or_404() return jsonify({"session": serialize_session(session)})