feat: Обновить модели для поддержки новых типов данных и улучшить валидацию полей

This commit is contained in:
Artem 2025-06-21 23:41:57 +02:00
parent 641d70a495
commit 060b2f2d70
No known key found for this signature in database
GPG key ID: 833485276B7902CE
3 changed files with 44 additions and 12 deletions

View file

@ -38,7 +38,8 @@ pip install git+https://github.com/sm1ky/remnawave-api.git@development
| Contract Version | Remnawave Panel Version |
| ---------------- | ----------------------- |
| 1.1.2 | >=1.6.3,<=1.6.8 |
| 1.1.3 | >=1.6.12 |
| 1.1.2 | >=1.6.3,<=1.6.11 |
| 1.1.1 | 1.6.1, 1.6.2 |
| 1.1.0 | 1.6.0 |
| 1.0.8 | 1.5.7 |

View file

@ -1,6 +1,6 @@
[project]
name = "remnawave-api"
version = "1.1.2"
version = "1.1.3"
description = "A Python SDK for interacting with the Remnawave API."
authors = [
{name = "Artem",email = "sm1ky@forestsnet.com"}

View file

@ -1,8 +1,8 @@
from datetime import datetime
from typing import List, Optional
from typing import Annotated, List, Literal, Optional
from uuid import UUID
from pydantic import BaseModel, Field
from pydantic import BaseModel, EmailStr, Field, constr
from remnawave_api.enums import UserStatus
from remnawave_api.enums.users import TrafficLimitStrategy
@ -12,6 +12,10 @@ class BulkUpdateUsersInboundsRequestDto(BaseModel):
uuids: List[UUID]
active_user_inbounds: List[UUID] = Field(serialization_alias="activeUserInbounds")
TagStr = Annotated[
str,
Field(min_length=1, max_length=16, pattern=r"^[A-Z0-9_]+$")
]
class UpdateUserFields(BaseModel):
status: Optional[UserStatus] = None
@ -23,25 +27,52 @@ class UpdateUserFields(BaseModel):
)
expire_at: Optional[datetime] = Field(None, serialization_alias="expireAt")
description: Optional[str] = None
tag: Optional[str] = None
tag: Optional[TagStr] = Field(
None,
description="Tag for user. Must be uppercase, alphanumeric, and can include underscores. Max length 16 characters."
)
telegram_id: Optional[int] = Field(None, serialization_alias="telegramId")
email: Optional[str] = None
class BulkAllUpdateUsersRequestDto(BaseModel):
status: Optional[str] = None
status: Optional[Literal["ACTIVE", "DISABLED", "LIMITED", "EXPIRED"]] = Field(
"ACTIVE"
)
traffic_limit_bytes: Optional[int] = Field(
None, serialization_alias="trafficLimitBytes", strict=True, ge=0
None,
serialization_alias="trafficLimitBytes",
ge=0,
description="Traffic limit in bytes. 0 - unlimited"
)
traffic_limit_strategy: Optional[str] = Field(
None, serialization_alias="trafficLimitStrategy"
traffic_limit_strategy: Optional[Literal["NO_RESET", "DAY", "WEEK", "MONTH"]] = Field(
None,
serialization_alias="trafficLimitStrategy",
description="Traffic limit reset strategy"
)
expire_at: Optional[datetime] = Field(None, serialization_alias="expireAt")
expire_at: Optional[datetime] = Field(
None,
serialization_alias="expireAt",
description="Expiration date"
)
description: Optional[str] = None
tag: Optional[str] = None
telegram_id: Optional[int] = Field(None, serialization_alias="telegramId")
telegram_id: Optional[int] = Field(
None,
serialization_alias="telegramId"
)
email: Optional[str] = None
tag: Optional[TagStr] = Field(
None,
description="Tag for user. Must be uppercase, alphanumeric, and can include underscores. Max length 16 characters."
)
class BulkResponseDto(BaseModel):
affected_rows: int = Field(alias="affectedRows")