from datetime import datetime from app.models.model import UTCBaseModel from app.models.score import GameMode from app.utils import utcnow from .beatmap import Beatmap from .user import User from sqlalchemy import Column, DateTime, Index from sqlalchemy.orm import Mapped from sqlmodel import BigInteger, Field, ForeignKey, Relationship, SQLModel class ScoreTokenBase(SQLModel, UTCBaseModel): score_id: int | None = Field(sa_column=Column(BigInteger), default=None) ruleset_id: GameMode playlist_item_id: int | None = Field(default=None) # playlist created_at: datetime = Field(default_factory=utcnow, sa_column=Column(DateTime)) updated_at: datetime = Field(default_factory=utcnow, sa_column=Column(DateTime)) class ScoreToken(ScoreTokenBase, table=True): __tablename__: str = "score_tokens" __table_args__ = (Index("idx_user_playlist", "user_id", "playlist_item_id"),) id: int | None = Field( default=None, sa_column=Column( BigInteger, primary_key=True, index=True, autoincrement=True, ), ) user_id: int = Field(sa_column=Column(BigInteger, ForeignKey("lazer_users.id"))) beatmap_id: int = Field(foreign_key="beatmaps.id") user: Mapped[User] = Relationship() beatmap: Mapped[Beatmap] = Relationship() class ScoreTokenResp(ScoreTokenBase): id: int user_id: int beatmap_id: int @classmethod def from_db(cls, obj: ScoreToken) -> "ScoreTokenResp": return cls.model_validate(obj)