"""Sound played tracking model.""" from datetime import datetime from zoneinfo import ZoneInfo from sqlalchemy import DateTime, ForeignKey, Integer, func, text from sqlalchemy.orm import Mapped, mapped_column, relationship from app.database import db class SoundPlayed(db.Model): """Model to track when users play sounds.""" __tablename__ = "sound_played" id: Mapped[int] = mapped_column(primary_key=True) # Foreign keys user_id: Mapped[int] = mapped_column( Integer, ForeignKey("user.id"), nullable=True, ) sound_id: Mapped[int] = mapped_column( Integer, ForeignKey("sound.id"), nullable=False, ) # Timestamp played_at: Mapped[datetime] = mapped_column( DateTime, default=lambda: datetime.now(tz=ZoneInfo("UTC")), nullable=False, ) # Relationships user: Mapped["User"] = relationship("User", backref="sounds_played") sound: Mapped["Sound"] = relationship("Sound", backref="play_history") def __repr__(self) -> str: """Return string representation of SoundPlayed.""" return ( f"" ) def to_dict(self) -> dict: """Convert sound played record to dictionary.""" return { "id": self.id, "user_id": self.user_id, "sound_id": self.sound_id, "played_at": self.played_at.isoformat(), "user": ( { "id": self.user.id, "name": self.user.name, "email": self.user.email, } if self.user else None ), "sound": ( { "id": self.sound.id, "name": self.sound.name, "filename": self.sound.filename, "type": self.sound.type, } if self.sound else None ), } @classmethod def create_play_record( cls, user_id: int | None, sound_id: int, *, commit: bool = True, ) -> "SoundPlayed": """Create a new sound played record.""" play_record = cls( user_id=user_id, sound_id=sound_id, ) db.session.add(play_record) if commit: db.session.commit() return play_record