Files
remnawave-bedolaga-telegram…/app/webapi/schemas/servers.py
T

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