80 lines
2.1 KiB
Python
80 lines
2.1 KiB
Python
|
|
from pydantic import BaseModel
|
|||
|
|
from datetime import datetime
|
|||
|
|
|
|||
|
|
|
|||
|
|
# === Token schemas ===
|
|||
|
|
|
|||
|
|
class WidgetTokenCreate(BaseModel):
|
|||
|
|
"""Создание токена виджета"""
|
|||
|
|
pass # Не требует параметров
|
|||
|
|
|
|||
|
|
|
|||
|
|
class WidgetTokenResponse(BaseModel):
|
|||
|
|
"""Ответ с токеном виджета"""
|
|||
|
|
id: int
|
|||
|
|
token: str
|
|||
|
|
created_at: datetime
|
|||
|
|
expires_at: datetime | None
|
|||
|
|
is_active: bool
|
|||
|
|
urls: dict[str, str] # Готовые URL для виджетов
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
from_attributes = True
|
|||
|
|
|
|||
|
|
|
|||
|
|
class WidgetTokenListItem(BaseModel):
|
|||
|
|
"""Элемент списка токенов"""
|
|||
|
|
id: int
|
|||
|
|
token: str
|
|||
|
|
created_at: datetime
|
|||
|
|
is_active: bool
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
from_attributes = True
|
|||
|
|
|
|||
|
|
|
|||
|
|
# === Widget data schemas ===
|
|||
|
|
|
|||
|
|
class WidgetLeaderboardEntry(BaseModel):
|
|||
|
|
"""Запись в лидерборде виджета"""
|
|||
|
|
rank: int
|
|||
|
|
nickname: str
|
|||
|
|
avatar_url: str | None
|
|||
|
|
total_points: int
|
|||
|
|
current_streak: int
|
|||
|
|
is_current_user: bool # Для подсветки
|
|||
|
|
|
|||
|
|
|
|||
|
|
class WidgetLeaderboardResponse(BaseModel):
|
|||
|
|
"""Ответ лидерборда для виджета"""
|
|||
|
|
entries: list[WidgetLeaderboardEntry]
|
|||
|
|
current_user_rank: int | None
|
|||
|
|
total_participants: int
|
|||
|
|
marathon_title: str
|
|||
|
|
|
|||
|
|
|
|||
|
|
class WidgetCurrentResponse(BaseModel):
|
|||
|
|
"""Текущее задание для виджета"""
|
|||
|
|
has_assignment: bool
|
|||
|
|
game_title: str | None = None
|
|||
|
|
game_cover_url: str | None = None
|
|||
|
|
assignment_type: str | None = None # "challenge" | "playthrough"
|
|||
|
|
challenge_title: str | None = None
|
|||
|
|
challenge_description: str | None = None
|
|||
|
|
points: int | None = None
|
|||
|
|
difficulty: str | None = None # easy, medium, hard
|
|||
|
|
bonus_completed: int | None = None # Для прохождений
|
|||
|
|
bonus_total: int | None = None
|
|||
|
|
|
|||
|
|
|
|||
|
|
class WidgetProgressResponse(BaseModel):
|
|||
|
|
"""Прогресс участника для виджета"""
|
|||
|
|
nickname: str
|
|||
|
|
avatar_url: str | None
|
|||
|
|
rank: int
|
|||
|
|
total_points: int
|
|||
|
|
current_streak: int
|
|||
|
|
completed_count: int
|
|||
|
|
dropped_count: int
|
|||
|
|
marathon_title: str
|