116 lines
3.2 KiB
Python
116 lines
3.2 KiB
Python
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()
|