"""ORM model for per-user settings (general preferences + scrobbling).""" import uuid from sqlalchemy import Boolean, ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column from app.infrastructure.db.base import Base from app.infrastructure.db.models.mixins import TimestampMixin class UserSettingsModel(TimestampMixin, Base): """One row per user, created lazily on first save. The primary key *is* the user id (a 1:1 extension of ``users``), so there's no separate surrogate id.""" __tablename__ = "user_settings" user_id: Mapped[uuid.UUID] = mapped_column( ForeignKey("users.id", ondelete="CASCADE"), primary_key=True, ) theme: Mapped[str] = mapped_column(String(16), default="system", nullable=False) stream_quality: Mapped[str] = mapped_column(String(16), default="original", nullable=False) scrobble_enabled: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False) scrobble_provider: Mapped[str | None] = mapped_column(String(16), nullable=True) scrobble_username: Mapped[str | None] = mapped_column(String(255), nullable=True) # Fernet-encrypted scrobbler session key / token (see core.security). Never # the plaintext — mirrors how the Subsonic app-password is stored. scrobble_session_key_enc: Mapped[str | None] = mapped_column(String(512), nullable=True)