from datetime import datetime from . import db class Session(db.Model): __tablename__ = "sessions" id = db.Column(db.Integer, primary_key=True) code = db.Column(db.String(6), unique=True, nullable=False, index=True) status = db.Column(db.String(20), nullable=False, default="waiting") current_recipe_index = db.Column(db.Integer, nullable=False, default=0) matched_recipe_id = db.Column(db.Integer, db.ForeignKey("recipes.id"), nullable=True) created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) participants = db.relationship("Participant", backref="session", cascade="all, delete-orphan") settings = db.relationship("SessionSettings", backref="session", cascade="all, delete-orphan", uselist=False) recipes = db.relationship( "Recipe", backref="session", cascade="all, delete-orphan", foreign_keys="Recipe.session_id", order_by="Recipe.position", ) class Participant(db.Model): __tablename__ = "participants" id = db.Column(db.Integer, primary_key=True) session_id = db.Column(db.Integer, db.ForeignKey("sessions.id"), nullable=False) name = db.Column(db.String(80), nullable=False) is_host = db.Column(db.Boolean, nullable=False, default=False) created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) class SessionSettings(db.Model): __tablename__ = "session_settings" id = db.Column(db.Integer, primary_key=True) session_id = db.Column(db.Integer, db.ForeignKey("sessions.id"), nullable=False, unique=True) required_likes = db.Column(db.Integer, nullable=False, default=2) match_mode = db.Column(db.String(20), nullable=False, default="first_match") voting_round = db.Column(db.Integer, nullable=False, default=1) class Recipe(db.Model): __tablename__ = "recipes" id = db.Column(db.Integer, primary_key=True) session_id = db.Column(db.Integer, db.ForeignKey("sessions.id"), nullable=False) position = db.Column(db.Integer, nullable=False) title = db.Column(db.String(255), nullable=False) url = db.Column(db.Text, nullable=False) image_url = db.Column(db.Text, nullable=True) meta = db.Column(db.String(255), nullable=True) class Vote(db.Model): __tablename__ = "votes" id = db.Column(db.Integer, primary_key=True) session_id = db.Column(db.Integer, db.ForeignKey("sessions.id"), nullable=False) participant_id = db.Column(db.Integer, db.ForeignKey("participants.id"), nullable=False) recipe_id = db.Column(db.Integer, db.ForeignKey("recipes.id"), nullable=False) vote = db.Column(db.String(3), nullable=False) # yes/no created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) __table_args__ = ( db.UniqueConstraint("participant_id", "recipe_id", name="uq_participant_recipe_vote"), )