161 lines
5.9 KiB
Python
161 lines
5.9 KiB
Python
"""Pydantic-схемы для управления серверами через Web API."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import List, Optional
|
|
|
|
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: Optional[str] = Field(default=None, alias="originalName")
|
|
country_code: Optional[str] = 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: Optional[str] = None
|
|
sort_order: int = Field(default=0, alias="sortOrder")
|
|
max_users: Optional[int] = Field(default=None, alias="maxUsers")
|
|
current_users: int = Field(default=0, alias="currentUsers")
|
|
created_at: Optional[datetime] = Field(default=None, alias="createdAt")
|
|
updated_at: Optional[datetime] = 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: Optional[str] = Field(default=None, alias="originalName")
|
|
country_code: Optional[str] = Field(default=None, alias="countryCode")
|
|
price_kopeks: int = Field(default=0, alias="priceKopeks")
|
|
description: Optional[str] = None
|
|
max_users: Optional[int] = 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: Optional[List[int]] = Field(
|
|
default=None,
|
|
alias="promoGroupIds",
|
|
description="Список идентификаторов промогрупп, доступных на сервере.",
|
|
)
|
|
|
|
|
|
class ServerUpdateRequest(BaseModel):
|
|
"""Запрос на обновление свойств сервера."""
|
|
|
|
display_name: Optional[str] = Field(default=None, alias="displayName")
|
|
original_name: Optional[str] = Field(default=None, alias="originalName")
|
|
country_code: Optional[str] = Field(default=None, alias="countryCode")
|
|
price_kopeks: Optional[int] = Field(default=None, alias="priceKopeks")
|
|
description: Optional[str] = None
|
|
max_users: Optional[int] = Field(default=None, alias="maxUsers")
|
|
is_available: Optional[bool] = Field(default=None, alias="isAvailable")
|
|
is_trial_eligible: Optional[bool] = Field(
|
|
default=None, alias="isTrialEligible"
|
|
)
|
|
sort_order: Optional[int] = Field(default=None, alias="sortOrder")
|
|
promo_group_ids: Optional[List[int]] = 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 = Field(alias="telegramId")
|
|
username: Optional[str] = None
|
|
first_name: Optional[str] = Field(default=None, alias="firstName")
|
|
last_name: Optional[str] = Field(default=None, alias="lastName")
|
|
status: str
|
|
balance_kopeks: int = Field(alias="balanceKopeks")
|
|
balance_rubles: float = Field(alias="balanceRubles")
|
|
subscription_id: Optional[int] = Field(default=None, alias="subscriptionId")
|
|
subscription_status: Optional[str] = Field(
|
|
default=None, alias="subscriptionStatus"
|
|
)
|
|
subscription_end_date: Optional[datetime] = 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
|
|
|