From 97ef97bd46251c538d43fb10c937d7da8678442e Mon Sep 17 00:00:00 2001 From: Artem Date: Sat, 30 Aug 2025 21:46:34 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20bulk=20actions,=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=81?= =?UTF-8?q?=20inbounds,=20=D0=B2=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D1=81=20squads.=20=D0=A2=D0=B0=D0=BA-?= =?UTF-8?q?=D0=B6=D0=B5=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B=20inb?= =?UTF-8?q?ounds=20c=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B5=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- remnawave/controllers/users_bulk_actions.py | 10 +++--- remnawave/models/__init__.py | 4 +-- remnawave/models/users.py | 38 +++++++-------------- remnawave/models/users_bulk_actions.py | 4 +-- 4 files changed, 22 insertions(+), 34 deletions(-) diff --git a/remnawave/controllers/users_bulk_actions.py b/remnawave/controllers/users_bulk_actions.py index 702ad09..a8006da 100644 --- a/remnawave/controllers/users_bulk_actions.py +++ b/remnawave/controllers/users_bulk_actions.py @@ -9,7 +9,7 @@ from remnawave.models import ( BulkAllUpdateUsersRequestDto, BulkAllUpdateUsersResponseDto, BulkResponseDto, - BulkUpdateUsersInboundsRequestDto, + BulkUpdateUsersInternalSquadsRequestDto, UpdateUserFields, ) from remnawave.rapid import AttributeBody, BaseController, patch, post @@ -62,12 +62,12 @@ class UsersBulkActionsController(BaseController): """Bulk Update Users""" ... - @post("/users/bulk/update-inbounds", response_class=BulkResponseDto) - async def bulk_update_users_inbounds( + @post("/users/bulk/update-squads", response_class=BulkResponseDto) + async def bulk_update_users_internal_squads( self, - body: Annotated[BulkUpdateUsersInboundsRequestDto, PydanticBody()], + body: Annotated[BulkUpdateUsersInternalSquadsRequestDto, PydanticBody()], ) -> BulkResponseDto: - """Bulk Update Users Inbounds""" + """Bulk Update Users Internal Squads""" ... @post("/users/bulk/all/update", response_class=BulkAllUpdateUsersResponseDto) diff --git a/remnawave/models/__init__.py b/remnawave/models/__init__.py index 71d35c1..a2b7c55 100644 --- a/remnawave/models/__init__.py +++ b/remnawave/models/__init__.py @@ -220,7 +220,7 @@ from .users_bulk_actions import ( BulkAllUpdateUsersRequestDto, BulkAllUpdateUsersResponseDto, BulkResponseDto, - BulkUpdateUsersInboundsRequestDto, + BulkUpdateUsersInternalSquadsRequestDto, UpdateUserFields, ) from .users_stats import UserUsageByRange, UserUsageByRangeResponseDto @@ -401,7 +401,7 @@ __all__ = [ "BulkAllUpdateUsersRequestDto", "BulkAllUpdateUsersResponseDto", "BulkResponseDto", - "BulkUpdateUsersInboundsRequestDto", + "BulkUpdateUsersInternalSquadsRequestDto", "UpdateUserFields", # Users stats models "UserUsageByRange", diff --git a/remnawave/models/users.py b/remnawave/models/users.py index bc6b4a7..3ef85f7 100644 --- a/remnawave/models/users.py +++ b/remnawave/models/users.py @@ -35,9 +35,11 @@ class HappCrypto(BaseModel): class CreateUserRequestDto(BaseModel): + expire_at: datetime = Field(..., serialization_alias="expireAt") username: Annotated[ str, StringConstraints(pattern=r"^[a-zA-Z0-9_-]+$", min_length=3, max_length=36) ] + created_at: Optional[datetime] = Field(None, serialization_alias="createdAt") status: Optional[UserStatus] = None subscription_uuid: Optional[str] = Field( None, serialization_alias="subscriptionUuid" @@ -56,11 +58,6 @@ class CreateUserRequestDto(BaseModel): traffic_limit_strategy: Optional[TrafficLimitStrategy] = Field( None, serialization_alias="trafficLimitStrategy" ) - active_user_inbounds: Optional[List[str]] = Field( - None, serialization_alias="activeUserInbounds" - ) - expire_at: datetime = Field(..., serialization_alias="expireAt") - created_at: Optional[datetime] = Field(None, serialization_alias="createdAt") last_traffic_reset_at: Optional[datetime] = Field( None, serialization_alias="lastTrafficResetAt" ) @@ -78,30 +75,24 @@ class CreateUserRequestDto(BaseModel): class UpdateUserRequestDto(BaseModel): uuid: UUID + active_internal_squads: Optional[List[str]] = Field( + None, serialization_alias="activeInternalSquads" + ) + description: Optional[str] = None + email: Optional[str] = None + expire_at: Optional[datetime] = Field(None, serialization_alias="expireAt") + hwidDeviceLimit: Optional[int] = Field( + None, serialization_alias="hwidDeviceLimit", strict=True, ge=0 + ) status: Optional[UserStatus] = None + tag: Optional[str] = None + telegram_id: Optional[int] = Field(None, serialization_alias="telegramId") traffic_limit_bytes: Optional[int] = Field( None, serialization_alias="trafficLimitBytes", strict=True, ge=0 ) traffic_limit_strategy: Optional[TrafficLimitStrategy] = Field( None, serialization_alias="trafficLimitStrategy" ) - active_user_inbounds: Optional[List[str]] = Field( - None, serialization_alias="activeUserInbounds" - ) - expire_at: Optional[datetime] = Field(None, serialization_alias="expireAt") - last_traffic_reset_at: Optional[datetime] = Field( - None, serialization_alias="lastTrafficResetAt" - ) - description: Optional[str] = None - tag: Optional[str] = None - telegram_id: Optional[int] = Field(None, serialization_alias="telegramId") - email: Optional[str] = None - hwidDeviceLimit: Optional[int] = Field( - None, serialization_alias="hwidDeviceLimit", strict=True, ge=0 - ) - active_internal_squads: Optional[List[str]] = Field( - None, serialization_alias="activeInternalSquads" - ) class UserResponseDto(BaseModel): @@ -129,9 +120,6 @@ class UserResponseDto(BaseModel): hwidDeviceLimit: Optional[int] = Field( None, serialization_alias="hwidDeviceLimit", strict=True, ge=0 ) - active_user_inbounds: Optional[List[UserActiveInboundsDto]] = Field( - None, alias="activeUserInbounds" - ) active_internal_squads: Optional[List[ActiveInternalSquadDto]] = Field( None, alias="activeInternalSquads" ) diff --git a/remnawave/models/users_bulk_actions.py b/remnawave/models/users_bulk_actions.py index 0f41baa..b76fe93 100644 --- a/remnawave/models/users_bulk_actions.py +++ b/remnawave/models/users_bulk_actions.py @@ -8,9 +8,9 @@ from remnawave.enums import UserStatus from remnawave.enums.users import TrafficLimitStrategy -class BulkUpdateUsersInboundsRequestDto(BaseModel): +class BulkUpdateUsersInternalSquadsRequestDto(BaseModel): uuids: List[UUID] - active_user_inbounds: List[UUID] = Field(serialization_alias="activeUserInbounds") + active_internal_squads: List[UUID] = Field(serialization_alias="activeInternalSquads") TagStr = Annotated[ str,