9a2aea038a
- Add pyproject.toml with uv and ruff configuration - Pin Python version to 3.13 via .python-version - Add Makefile commands: lint, format, fix - Apply ruff formatting to entire codebase - Remove unused imports (base64 in yookassa/simple_subscription) - Update .gitignore for new config files
151 lines
5.7 KiB
Python
151 lines
5.7 KiB
Python
"""Pydantic-схемы для управления серверами через Web API."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
from .users import PromoGroupSummary
|
|
|
|
|
|
class ServerResponse(BaseModel):
|
|
"""Полная информация о сервере."""
|
|
|
|
model_config = ConfigDict(from_attributes=True, populate_by_name=True)
|
|
|
|
id: int
|
|
squad_uuid: str = Field(alias='squadUuid')
|
|
display_name: str = Field(alias='displayName')
|
|
original_name: str | None = Field(default=None, alias='originalName')
|
|
country_code: str | None = Field(default=None, alias='countryCode')
|
|
is_available: bool = Field(alias='isAvailable')
|
|
is_trial_eligible: bool = Field(default=False, alias='isTrialEligible')
|
|
price_kopeks: int = Field(alias='priceKopeks')
|
|
price_rubles: float = Field(alias='priceRubles')
|
|
description: str | None = None
|
|
sort_order: int = Field(default=0, alias='sortOrder')
|
|
max_users: int | None = Field(default=None, alias='maxUsers')
|
|
current_users: int = Field(default=0, alias='currentUsers')
|
|
created_at: datetime | None = Field(default=None, alias='createdAt')
|
|
updated_at: datetime | None = Field(default=None, alias='updatedAt')
|
|
promo_groups: list[PromoGroupSummary] = Field(default_factory=list, alias='promoGroups')
|
|
|
|
|
|
class ServerListResponse(BaseModel):
|
|
"""Список серверов с пагинацией."""
|
|
|
|
items: list[ServerResponse]
|
|
total: int
|
|
page: int
|
|
limit: int
|
|
|
|
|
|
class ServerCreateRequest(BaseModel):
|
|
"""Запрос на создание сервера."""
|
|
|
|
squad_uuid: str = Field(alias='squadUuid')
|
|
display_name: str = Field(alias='displayName')
|
|
original_name: str | None = Field(default=None, alias='originalName')
|
|
country_code: str | None = Field(default=None, alias='countryCode')
|
|
price_kopeks: int = Field(default=0, alias='priceKopeks')
|
|
description: str | None = None
|
|
max_users: int | None = Field(default=None, alias='maxUsers')
|
|
is_available: bool = Field(default=True, alias='isAvailable')
|
|
is_trial_eligible: bool = Field(default=False, alias='isTrialEligible')
|
|
sort_order: int = Field(default=0, alias='sortOrder')
|
|
promo_group_ids: list[int] | None = Field(
|
|
default=None,
|
|
alias='promoGroupIds',
|
|
description='Список идентификаторов промогрупп, доступных на сервере.',
|
|
)
|
|
|
|
|
|
class ServerUpdateRequest(BaseModel):
|
|
"""Запрос на обновление свойств сервера."""
|
|
|
|
display_name: str | None = Field(default=None, alias='displayName')
|
|
original_name: str | None = Field(default=None, alias='originalName')
|
|
country_code: str | None = Field(default=None, alias='countryCode')
|
|
price_kopeks: int | None = Field(default=None, alias='priceKopeks')
|
|
description: str | None = None
|
|
max_users: int | None = Field(default=None, alias='maxUsers')
|
|
is_available: bool | None = Field(default=None, alias='isAvailable')
|
|
is_trial_eligible: bool | None = Field(default=None, alias='isTrialEligible')
|
|
sort_order: int | None = Field(default=None, alias='sortOrder')
|
|
promo_group_ids: list[int] | None = Field(
|
|
default=None,
|
|
alias='promoGroupIds',
|
|
description='Если передан список, он заменит текущие промогруппы сервера.',
|
|
)
|
|
|
|
|
|
class ServerSyncResponse(BaseModel):
|
|
"""Результат синхронизации серверов с RemnaWave."""
|
|
|
|
model_config = ConfigDict(populate_by_name=True)
|
|
|
|
created: int
|
|
updated: int
|
|
removed: int
|
|
total: int
|
|
|
|
|
|
class ServerStatisticsResponse(BaseModel):
|
|
"""Агрегированная статистика по серверам."""
|
|
|
|
model_config = ConfigDict(populate_by_name=True)
|
|
|
|
total_servers: int = Field(alias='totalServers')
|
|
available_servers: int = Field(alias='availableServers')
|
|
unavailable_servers: int = Field(alias='unavailableServers')
|
|
servers_with_connections: int = Field(alias='serversWithConnections')
|
|
total_revenue_kopeks: int = Field(alias='totalRevenueKopeks')
|
|
total_revenue_rubles: float = Field(alias='totalRevenueRubles')
|
|
|
|
|
|
class ServerCountsSyncResponse(BaseModel):
|
|
"""Результат обновления счетчиков пользователей серверов."""
|
|
|
|
model_config = ConfigDict(populate_by_name=True)
|
|
|
|
updated: int
|
|
|
|
|
|
class ServerConnectedUser(BaseModel):
|
|
"""Краткая информация о пользователе, подключенном к серверу."""
|
|
|
|
model_config = ConfigDict(populate_by_name=True)
|
|
|
|
id: int
|
|
telegram_id: int | None = Field(default=None, alias='telegramId')
|
|
username: str | None = None
|
|
first_name: str | None = Field(default=None, alias='firstName')
|
|
last_name: str | None = Field(default=None, alias='lastName')
|
|
status: str
|
|
balance_kopeks: int = Field(alias='balanceKopeks')
|
|
balance_rubles: float = Field(alias='balanceRubles')
|
|
subscription_id: int | None = Field(default=None, alias='subscriptionId')
|
|
subscription_status: str | None = Field(default=None, alias='subscriptionStatus')
|
|
subscription_end_date: datetime | None = Field(default=None, alias='subscriptionEndDate')
|
|
|
|
|
|
class ServerConnectedUsersResponse(BaseModel):
|
|
"""Список пользователей, подключенных к серверу."""
|
|
|
|
model_config = ConfigDict(populate_by_name=True)
|
|
|
|
items: list[ServerConnectedUser]
|
|
total: int
|
|
limit: int
|
|
offset: int
|
|
|
|
|
|
class ServerDeleteResponse(BaseModel):
|
|
"""Ответ при удалении сервера."""
|
|
|
|
model_config = ConfigDict(populate_by_name=True)
|
|
|
|
success: bool
|
|
message: str
|