72 lines
1.5 KiB
Python
72 lines
1.5 KiB
Python
import uuid
|
|
from datetime import datetime
|
|
from typing import Literal
|
|
|
|
from pydantic import BaseModel, EmailStr, Field
|
|
|
|
|
|
class SignupRequest(BaseModel):
|
|
email: EmailStr
|
|
password: str = Field(min_length=8, max_length=200)
|
|
display_name: str = Field(min_length=1, max_length=100)
|
|
|
|
|
|
class LoginRequest(BaseModel):
|
|
email: EmailStr
|
|
password: str
|
|
|
|
|
|
class TokenResponse(BaseModel):
|
|
access_token: str
|
|
token_type: str = "bearer"
|
|
|
|
|
|
class UserOut(BaseModel):
|
|
id: uuid.UUID
|
|
email: EmailStr
|
|
display_name: str
|
|
created_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class SongCreateRequest(BaseModel):
|
|
title: str = Field(min_length=1, max_length=200)
|
|
prompt: str = Field(min_length=1, max_length=2000)
|
|
mode: Literal["instrumental", "vocals"] = "instrumental"
|
|
lyrics: str | None = Field(default=None, max_length=4000)
|
|
is_public: bool = False
|
|
|
|
|
|
class SongUpdateRequest(BaseModel):
|
|
title: str | None = Field(default=None, min_length=1, max_length=200)
|
|
is_public: bool | None = None
|
|
|
|
|
|
class SongOut(BaseModel):
|
|
id: uuid.UUID
|
|
user_id: uuid.UUID
|
|
owner_display_name: str | None = None
|
|
title: str
|
|
prompt: str
|
|
lyrics: str | None
|
|
mode: str
|
|
status: str
|
|
error_message: str | None
|
|
duration_seconds: float | None
|
|
cover_seed: int
|
|
is_public: bool
|
|
like_count: int
|
|
liked_by_me: bool = False
|
|
audio_url: str | None = None
|
|
created_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class SongListResponse(BaseModel):
|
|
items: list[SongOut]
|
|
total: int
|