From a117f61204853baa3273fd1236f59700e91571d7 Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 15 Aug 2025 23:11:16 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=20GetIntern?= =?UTF-8?q?alSquadAccessibleNodesResponseDto=20=D0=B8=20=D1=8D=D0=BD=D0=B4?= =?UTF-8?q?=D0=BF=D0=BE=D0=B8=D0=BD=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=83=D0=BF=D0=BD=D1=8B=D1=85=20=D1=83=D0=B7=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- remnawave/controllers/internal_squads.py | 22 ++++++++++++++++++++-- remnawave/models/__init__.py | 2 ++ remnawave/models/internal_squads.py | 16 ++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/remnawave/controllers/internal_squads.py b/remnawave/controllers/internal_squads.py index 67b8f77..efbdf39 100644 --- a/remnawave/controllers/internal_squads.py +++ b/remnawave/controllers/internal_squads.py @@ -15,6 +15,7 @@ from remnawave.models import ( GetInternalSquadByUuidResponseDto, UpdateInternalSquadRequestDto, UpdateInternalSquadResponseDto, + GetInternalSquadAccessibleNodesResponseDto, ) from remnawave.rapid import BaseController, delete, get, patch, post @@ -57,7 +58,10 @@ class InternalSquadsController(BaseController): """Delete internal squad""" ... - @post("/internal-squads/{uuid}/bulk-actions/add-users", response_class=AddUsersToInternalSquadResponseDto) + @post( + "/internal-squads/{uuid}/bulk-actions/add-users", + response_class=AddUsersToInternalSquadResponseDto, + ) async def add_users_to_internal_squad( self, uuid: Annotated[str, Path(description="UUID of the internal squad")], @@ -65,10 +69,24 @@ class InternalSquadsController(BaseController): """Add users to internal squad""" ... - @delete("/internal-squads/{uuid}/bulk-actions/remove-users", response_class=DeleteUsersFromInternalSquadResponseDto) + @delete( + "/internal-squads/{uuid}/bulk-actions/remove-users", + response_class=DeleteUsersFromInternalSquadResponseDto, + ) async def remove_users_from_internal_squad( self, uuid: Annotated[str, Path(description="UUID of the internal squad")], ) -> DeleteUsersFromInternalSquadResponseDto: """Delete users from internal squad""" ... + + @get( + "/internal-squads/{uuid}/accessible-nodes", + response_class=GetInternalSquadAccessibleNodesResponseDto, + ) + async def get_accessible_nodes( + self, + uuid: Annotated[str, Path(description="UUID of the internal squad")], + ) -> GetInternalSquadAccessibleNodesResponseDto: + """Get accessible nodes for internal squad""" + ... diff --git a/remnawave/models/__init__.py b/remnawave/models/__init__.py index 345a063..896bc21 100644 --- a/remnawave/models/__init__.py +++ b/remnawave/models/__init__.py @@ -129,6 +129,7 @@ from .internal_squads import ( InternalSquadDto, UpdateInternalSquadRequestDto, UpdateInternalSquadResponseDto, + GetInternalSquadAccessibleNodesResponseDto, ) from .keygen import GetPubKeyResponseDto, PubKeyResponseDto # Legacy alias from .nodes import ( @@ -274,6 +275,7 @@ __all__ = [ "GetInboundsResponseDto", "InboundResponseDto", "InboundsResponseDto", # Legacy alias + "GetInternalSquadAccessibleNodesResponseDto", # Keygen models "GetPubKeyResponseDto", "PubKeyResponseDto", # Legacy alias diff --git a/remnawave/models/internal_squads.py b/remnawave/models/internal_squads.py index bc5def3..7b55a46 100644 --- a/remnawave/models/internal_squads.py +++ b/remnawave/models/internal_squads.py @@ -84,3 +84,19 @@ class DeleteUsersFromInternalSquadRequestDto(BaseModel): class DeleteUsersFromInternalSquadResponseDto(BulkActionsResponseDto): pass + + +class AccessibleNodeDto(BaseModel): + uuid: UUID + name: str = Field(alias="nodeName") + country_code: Optional[str] = Field(default=None, alias="countryCode") + config_profile_uuid: Optional[UUID] = Field(default=None, alias="configProfileUuid") + config_profile_name: Optional[str] = Field(default=None, alias="configProfileName") + active_inbounds: List[Optional[UUID]] = Field( + default_factory=list, alias="activeInbounds" + ) + + +class GetInternalSquadAccessibleNodesResponseDto(BaseModel): + squad_uuid: UUID = Field(alias="squadUuid") + accessible_nodes: List[AccessibleNodeDto] = Field(alias="accessibleNodes")