from __future__ import annotations from datetime import datetime from pydantic import BaseModel, EmailStr # ── Auth ────────────────────────────────────────────────────────────────────── class UserCreate(BaseModel): username: str email: EmailStr password: str class UserOut(BaseModel): id: str username: str email: str created_at: datetime model_config = {"from_attributes": True} class Token(BaseModel): access_token: str token_type: str = "bearer" # ── Project ─────────────────────────────────────────────────────────────────── class ProjectCreate(BaseModel): name: str description: str = "" is_public: bool = False class ProjectUpdate(BaseModel): name: str | None = None description: str | None = None is_public: bool | None = None class ProjectOut(BaseModel): id: str owner_id: str name: str description: str is_public: bool updated_at: datetime model_config = {"from_attributes": True} class InviteMember(BaseModel): username: str role: str = "viewer" # editor | viewer # ── Song ────────────────────────────────────────────────────────────────────── class SongCreate(BaseModel): title: str artist: str = "" local_path: str = "" bpm: int = 0 duration_sec: int = 0 class SongOut(BaseModel): id: str owner_id: str title: str artist: str local_path: str bpm: int duration_sec: int synced_at: datetime dances: list[SongDanceOut] = [] model_config = {"from_attributes": True} # ── Dance ───────────────────────────────────────────────────────────────────── class SongDanceCreate(BaseModel): dance_name: str dance_order: int = 1 class SongDanceOut(BaseModel): id: str dance_name: str dance_order: int model_config = {"from_attributes": True} class DanceAlternativeCreate(BaseModel): alt_song_dance_id: str note: str = "" class DanceAlternativeOut(BaseModel): id: str song_dance_id: str alt_song_dance_id: str note: str model_config = {"from_attributes": True} # ── ProjectSong ─────────────────────────────────────────────────────────────── class ProjectSongAdd(BaseModel): song_id: str position: int | None = None # None = tilføj sidst class ProjectSongStatusUpdate(BaseModel): status: str # pending | playing | played | skipped class ProjectSongOut(BaseModel): id: str song_id: str position: int status: str song: SongOut model_config = {"from_attributes": True} SongOut.model_rebuild()