from datetime import datetime, timezone from sqlalchemy import String, Integer, Float, DateTime, ForeignKey, Text, Boolean from sqlalchemy.orm import Mapped, mapped_column, relationship from app.core.database import Base class Recommendation(Base): __tablename__ = "recommendations" id: Mapped[int] = mapped_column(primary_key=True) user_id: Mapped[int] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), index=True) playlist_id: Mapped[int | None] = mapped_column(ForeignKey("playlists.id", ondelete="SET NULL"), nullable=True) # Recommended track info title: Mapped[str] = mapped_column(String(500)) artist: Mapped[str] = mapped_column(String(500)) album: Mapped[str | None] = mapped_column(String(500), nullable=True) spotify_id: Mapped[str | None] = mapped_column(String(255), nullable=True) preview_url: Mapped[str | None] = mapped_column(String(500), nullable=True) image_url: Mapped[str | None] = mapped_column(String(500), nullable=True) bandcamp_url: Mapped[str | None] = mapped_column(String(500), nullable=True) # AI explanation reason: Mapped[str] = mapped_column(Text) score: Mapped[float | None] = mapped_column(Float, nullable=True) query: Mapped[str | None] = mapped_column(Text, nullable=True) # User interaction saved: Mapped[bool] = mapped_column(Boolean, default=False) disliked: Mapped[bool] = mapped_column(Boolean, default=False, server_default="false") created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) ) user: Mapped["User"] = relationship(back_populates="recommendations") from app.models.user import User # noqa: E402, F811