refactor: Organize and implement player and playlist schemas

This commit is contained in:
JSC
2025-07-31 10:23:46 +02:00
parent 3feff2e0f1
commit dc372b961e
5 changed files with 190 additions and 124 deletions

View File

@@ -1 +1,46 @@
"""Schemas package."""
from .auth import (
ApiTokenRequest,
ApiTokenResponse,
ApiTokenStatusResponse,
AuthResponse,
TokenResponse,
UserLoginRequest,
UserRegisterRequest,
UserResponse,
)
from .player import PlayerModeRequest, PlayerSeekRequest, PlayerVolumeRequest
from .playlist import (
PlaylistAddSoundRequest,
PlaylistCreateRequest,
PlaylistReorderRequest,
PlaylistResponse,
PlaylistSoundResponse,
PlaylistStatsResponse,
PlaylistUpdateRequest,
)
__all__ = [
# Auth schemas
"ApiTokenRequest",
"ApiTokenResponse",
"ApiTokenStatusResponse",
"AuthResponse",
"TokenResponse",
"UserLoginRequest",
"UserRegisterRequest",
"UserResponse",
# Player schemas
"PlayerModeRequest",
"PlayerSeekRequest",
"PlayerVolumeRequest",
# Playlist schemas
"PlaylistAddSoundRequest",
"PlaylistCreateRequest",
"PlaylistReorderRequest",
"PlaylistResponse",
"PlaylistSoundResponse",
"PlaylistStatsResponse",
"PlaylistUpdateRequest",
]

23
app/schemas/player.py Normal file
View File

@@ -0,0 +1,23 @@
"""Player schemas."""
from pydantic import BaseModel, Field
from app.services.player import PlayerMode
class PlayerSeekRequest(BaseModel):
"""Request model for seek operation."""
position_ms: int = Field(ge=0, description="Position in milliseconds")
class PlayerVolumeRequest(BaseModel):
"""Request model for volume control."""
volume: int = Field(ge=0, le=100, description="Volume level (0-100)")
class PlayerModeRequest(BaseModel):
"""Request model for mode change."""
mode: PlayerMode = Field(description="Playback mode")

104
app/schemas/playlist.py Normal file
View File

@@ -0,0 +1,104 @@
"""Playlist schemas."""
from pydantic import BaseModel
from app.models.playlist import Playlist
from app.models.sound import Sound
class PlaylistCreateRequest(BaseModel):
"""Request model for creating a playlist."""
name: str
description: str | None = None
genre: str | None = None
class PlaylistUpdateRequest(BaseModel):
"""Request model for updating a playlist."""
name: str | None = None
description: str | None = None
genre: str | None = None
is_current: bool | None = None
class PlaylistResponse(BaseModel):
"""Response model for playlist data."""
id: int
name: str
description: str | None
genre: str | None
is_main: bool
is_current: bool
is_deletable: bool
created_at: str
updated_at: str | None
@classmethod
def from_playlist(cls, playlist: Playlist) -> "PlaylistResponse":
"""Create response from playlist model."""
if playlist.id is None:
raise ValueError("Playlist ID cannot be None")
return cls(
id=playlist.id,
name=playlist.name,
description=playlist.description,
genre=playlist.genre,
is_main=playlist.is_main,
is_current=playlist.is_current,
is_deletable=playlist.is_deletable,
created_at=playlist.created_at.isoformat(),
updated_at=playlist.updated_at.isoformat() if playlist.updated_at else None,
)
class PlaylistSoundResponse(BaseModel):
"""Response model for sound data in playlists."""
id: int
name: str
filename: str
type: str
duration: int | None
size: int | None
play_count: int
created_at: str
@classmethod
def from_sound(cls, sound: Sound) -> "PlaylistSoundResponse":
"""Create response from sound model."""
if sound.id is None:
raise ValueError("Sound ID cannot be None")
return cls(
id=sound.id,
name=sound.name,
filename=sound.filename,
type=sound.type,
duration=sound.duration,
size=sound.size,
play_count=sound.play_count,
created_at=sound.created_at.isoformat(),
)
class PlaylistAddSoundRequest(BaseModel):
"""Request model for adding a sound to a playlist."""
sound_id: int
position: int | None = None
class PlaylistReorderRequest(BaseModel):
"""Request model for reordering sounds in a playlist."""
sound_positions: list[tuple[int, int]]
class PlaylistStatsResponse(BaseModel):
"""Response model for playlist statistics."""
sound_count: int
total_duration_ms: int
total_play_count: int