mirror of
https://github.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot.git
synced 2026-01-30 16:50:26 +00:00
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
|
||
|