Remnawave_python-sdk/remnawave/controllers/hosts_bulk_actions.py
Artem 294d70e8c6 feat: Обновить SDK до Remnawave API v2.8.0
Новые эндпоинты:
- GET /tokens/scopes (api_tokens_management.get_scopes)
- GET /users/stream — keyset-пагинация (users.get_users_stream)
- PATCH /hosts/bulk/update (hosts_bulk_actions.update_hosts)
- POST /bandwidth-stats/nodes/users (bandwidthstats.get_stats_nodes_users_usage)

Удалённые эндпоинты (вслед за API):
- POST /hosts/bulk/set-inbound, /hosts/bulk/set-port (заменены update_hosts)
- POST /system/tools/happ/encrypt

Изменения моделей:
- Hosts: tags (вместо tag), mihomoIpVersion, pinnedPeerCertSha256,
  verifyPeerCertByName, finalMask, xhttpExtraParams; fingerprint -> str;
  удалены tag/allowInsecure (с обратной совместимостью через свойства)
- API-токены: name/expiresInDays/scopes, tokens/enabled; новый enum Scope
  (полный каталог scope-ов v2.8.0)
- Nodes: nodeConsumptionMultiplier, note, proxyUrl; тело RestartNodeRequestBodyDto
- trafficLimitBytes int -> float (users, nodes, bulk-actions)
- Infra billing: name, nullable nodeUuid, обязательное nextBillingAt
- HWID: requestIp; webhook-события (user/service) обновлены
- Новый enum MihomoIpVersion

Исправления:
- Bulk-ответы хостов переведены на RootModel (раньше падали с ValueError)
- revoke_user_subscription: исправлен порядок Annotated/Optional (тело терялось)
- Restart*RequestBodyDto: populate_by_name (force_restart игнорировался)

Зависимости:
- Убраны избыточные пины pydantic и pydantic-core (покрыты pydantic[email])
- requires-python <3.14 -> <3.15, добавлен классификатор Python 3.14

Версия пакета 2.7.1 -> 2.8.0.
2026-06-30 22:47:15 +02:00

47 lines
1.4 KiB
Python

from typing import Annotated, List
from uuid import UUID
from rapid_api_client import PydanticBody
from remnawave.models import (
BulkDeleteHostsResponseDto,
BulkDisableHostsResponseDto,
BulkEnableHostsResponseDto,
UpdateManyHostsRequestDto,
UpdateManyHostsResponseDto,
)
from remnawave.rapid import AttributeBody, BaseController, patch, post
class HostsBulkActionsController(BaseController):
@post("/hosts/bulk/delete", response_class=BulkDeleteHostsResponseDto)
async def delete_hosts(
self,
uuids: Annotated[List[UUID], AttributeBody()],
) -> BulkDeleteHostsResponseDto:
"""Delete many hosts"""
...
@post("/hosts/bulk/disable", response_class=BulkDisableHostsResponseDto)
async def disable_hosts(
self,
uuids: Annotated[List[UUID], AttributeBody()],
) -> BulkDisableHostsResponseDto:
"""Disable many hosts"""
...
@post("/hosts/bulk/enable", response_class=BulkEnableHostsResponseDto)
async def enable_hosts(
self,
uuids: Annotated[List[UUID], AttributeBody()],
) -> BulkEnableHostsResponseDto:
"""Enable many hosts"""
...
@patch("/hosts/bulk/update", response_class=UpdateManyHostsResponseDto)
async def update_hosts(
self,
body: Annotated[UpdateManyHostsRequestDto, PydanticBody()],
) -> UpdateManyHostsResponseDto:
"""Update many hosts"""
...