feat: добавить эндпоинт для получения сырой подписки по короткому UUID и обновить модели подписки

This commit is contained in:
Artem 2025-08-21 23:58:28 +02:00
parent 94a13687a6
commit 8a84503191
No known key found for this signature in database
GPG key ID: 833485276B7902CE
5 changed files with 78 additions and 13 deletions

View file

@ -3,7 +3,7 @@ from typing import Annotated
from rapid_api_client import Path
from remnawave.enums import ClientType
from remnawave.models import GetSubscriptionInfoResponseDto
from remnawave.models import GetSubscriptionInfoResponseDto, GetRawSubscriptionByShortUuidResponseDto
from remnawave.rapid import BaseController, get
@ -52,3 +52,13 @@ class SubscriptionController(BaseController):
) -> str:
"""None"""
...
# get raw sub by short uuid
@get("/sub/{short_uuid}/raw", response_class=GetRawSubscriptionByShortUuidResponseDto)
async def get_raw_subscription(
self,
short_uuid: Annotated[str, Path(description="Short UUID of the user")],
withDisabledHosts: Annotated[Annotated[bool, Path(description="Include disabled hosts")], bool] = False,
) -> GetRawSubscriptionByShortUuidResponseDto:
"""None"""
...

View file

@ -93,14 +93,6 @@ class UsersController(BaseController):
) -> UserResponseDto:
"""Reset User Traffic"""
...
@post("/users/{uuid}/actions/activate-all-inbounds", response_class=UserResponseDto)
async def activate_all_inbounds(
self,
uuid: Annotated[str, Path(description="UUID of the user")],
) -> UserResponseDto:
"""Activate All Inbounds"""
...
@get("/users/by-short-uuid/{short_uuid}", response_class=UserResponseDto)
async def get_user_by_short_uuid(

View file

@ -16,6 +16,10 @@ class UserSubscription(BaseModel):
days_left: int = Field(alias="daysLeft")
traffic_used: str = Field(alias="trafficUsed")
traffic_limit: str = Field(alias="trafficLimit")
lifetime_traffic_used: str = Field(alias="lifetimeTrafficUsed")
traffic_used_bytes: str = Field(alias="trafficUsedBytes")
traffic_limit_bytes: str = Field(alias="trafficLimitBytes")
lifetime_traffic_used_bytes: int = Field(alias="lifetimeTrafficUsedBytes")
traffic_limit_strategy: TrafficLimitStrategy = Field(alias="trafficLimitStrategy")
expires_at: datetime = Field(alias="expiresAt")
user_status: UserStatus = Field(alias="userStatus")
@ -40,6 +44,69 @@ class GetSubscriptionInfoResponseDto(BaseModel):
happ: HappCrypto
class RawHostAdditionalParams(BaseModel):
mode: Optional[str] = None
heartbeat_period: Optional[int] = Field(None, alias="heartbeatPeriod")
class RawHostProtocolOptions(BaseModel):
class SSOptions(BaseModel):
method: Optional[str] = None
ss: Optional[SSOptions] = None
class RawHostDbData(BaseModel):
raw_inbound: Optional[Dict[str, Any]] = Field(alias="rawInbound")
inbound_tag: str = Field(alias="inboundTag")
uuid: str
config_profile_uuid: Optional[str] = Field(alias="configProfileUuid")
config_profile_inbound_uuid: Optional[str] = Field(alias="configProfileInboundUuid")
is_disabled: bool = Field(alias="isDisabled")
view_position: int = Field(alias="viewPosition")
remark: str
is_hidden: bool = Field(alias="isHidden")
tag: Optional[str] = None
class RawHost(BaseModel):
address: Optional[str] = None
alpn: Optional[str] = None
fingerprint: Optional[str] = None
host: Optional[str] = None
network: Optional[str] = None
password: Optional[str] = None
path: Optional[str] = None
public_key: Optional[str] = Field(None, alias="publicKey")
port: Optional[int] = None
protocol: Optional[str] = None
remark: Optional[str] = None
short_id: Optional[str] = Field(None, alias="shortId")
sni: Optional[str] = None
spider_x: Optional[str] = Field(None, alias="spiderX")
tls: Optional[str] = None
header_type: Optional[str] = Field(None, alias="headerType")
additional_params: Optional[RawHostAdditionalParams] = Field(None, alias="additionalParams")
x_http_extra_params: Optional[Dict[str, Any]] = Field(None, alias="xHttpExtraParams")
mux_params: Optional[Dict[str, Any]] = Field(None, alias="muxParams")
sockopt_params: Optional[Dict[str, Any]] = Field(None, alias="sockoptParams")
server_description: Optional[str] = Field(None, alias="serverDescription")
flow: Optional[str] = None
protocol_options: Optional[RawHostProtocolOptions] = Field(None, alias="protocolOptions")
db_data: RawHostDbData = Field(alias="dbData")
class RawSubscriptionResponse(BaseModel):
user: UserSubscription
subscription_url: str = Field(alias="subscriptionUrl")
raw_hosts: List[RawHost] = Field(alias="rawHosts")
headers: Dict[str, str]
is_hwid_limited: bool = Field(alias="isHwidLimited")
class GetRawSubscriptionByShortUuidResponseDto(RawSubscriptionResponse):
pass
class SubscriptionWithoutHapp(BaseModel):
is_found: bool = Field(alias="isFound")
user: UserSubscription

View file

@ -71,9 +71,6 @@ class CreateUserRequestDto(BaseModel):
hwidDeviceLimit: Optional[int] = Field(
None, serialization_alias="hwidDeviceLimit", strict=True, ge=0
)
activate_all_inbounds: Optional[bool] = Field(
None, serialization_alias="activateAllInbounds"
)
active_internal_squads: Optional[List[str]] = Field(
None, serialization_alias="activeInternalSquads"
)

View file

@ -34,7 +34,6 @@ async def test_users(remnawave) -> None:
email=email,
telegram_id=telegram_id,
expire_at=expire_at,
activate_all_inbounds=True,
)
)