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

161 lines
5.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""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