Add Pydantic models for nodes usage history, subscriptions, and user management

- Implemented models for nodes usage history including NodeInfoDto, GetUserAccessibleNodesResponse, and usage statistics.
- Created subscription-related models such as UserSubscription, SubscriptionInfoData, and various response DTOs for subscription information.
- Developed models for subscription settings, templates, and system statistics, enhancing the API's capability to manage and retrieve subscription configurations.
- Introduced user management models including CreateUserRequestDto, UpdateUserRequestDto, and various response DTOs for user actions.
- Added bulk actions for user updates and statistics tracking, improving the efficiency of user management operations.
- Established a base controller for handling API requests and responses, along with decorators for HTTP methods to streamline API interactions.
- Included utility functions for serialization using orjson for better performance with Pydantic models.
This commit is contained in:
Artem 2025-07-03 12:22:16 +02:00
parent 6e90ab89e9
commit 950a7ffab3
No known key found for this signature in database
GPG key ID: 833485276B7902CE
85 changed files with 87 additions and 87 deletions

View file

@ -3,7 +3,7 @@ from typing import Optional
import httpx
from remnawave_api.controllers import (
from remnawave.controllers import (
APITokensManagementController,
AuthController,
BandWidthStatsController,

View file

@ -4,13 +4,13 @@ from httpx import Response
from rapid_api_client import Path
from rapid_api_client.annotations import PydanticBody
from remnawave_api.models import (
from remnawave.models import (
CreateApiTokenRequestDto,
CreateApiTokenResponseDto,
DeleteApiTokenResponseDto,
FindAllApiTokensResponseDto,
)
from remnawave_api.rapid import BaseController, delete, get, post
from remnawave.rapid import BaseController, delete, get, post
class APITokensManagementController(BaseController):

View file

@ -2,7 +2,7 @@ from typing import Annotated
from rapid_api_client.annotations import PydanticBody
from remnawave_api.models import (
from remnawave.models import (
GetStatusResponseDto,
LoginRequestDto,
LoginResponseDto,
@ -11,7 +11,7 @@ from remnawave_api.models import (
TelegramCallbackRequestDto,
TelegramCallbackResponseDto,
)
from remnawave_api.rapid import BaseController, get, post
from remnawave.rapid import BaseController, get, post
class AuthController(BaseController):

View file

@ -2,8 +2,8 @@ from typing import Annotated
from rapid_api_client import Query
from remnawave_api.models import GetNodesUsageByRangeResponseDto, GetNodesRealtimeUsageResponseDto
from remnawave_api.rapid import BaseController, get
from remnawave.models import GetNodesUsageByRangeResponseDto, GetNodesRealtimeUsageResponseDto
from remnawave.rapid import BaseController, get
class BandWidthStatsController(BaseController):

View file

@ -3,7 +3,7 @@ from typing import Annotated
from rapid_api_client import Path, Query
from rapid_api_client.annotations import PydanticBody
from remnawave_api.models import (
from remnawave.models import (
CreateConfigProfileRequestDto,
CreateConfigProfileResponseDto,
DeleteConfigProfileResponseDto,
@ -14,7 +14,7 @@ from remnawave_api.models import (
UpdateConfigProfileRequestDto,
UpdateConfigProfileResponseDto,
)
from remnawave_api.rapid import BaseController, delete, get, patch, post
from remnawave.rapid import BaseController, delete, get, patch, post
class ConfigProfilesController(BaseController):

View file

@ -3,7 +3,7 @@ from typing import Annotated, List
from rapid_api_client import Path
from rapid_api_client.annotations import PydanticBody
from remnawave_api.models import (
from remnawave.models import (
CreateHostRequestDto,
CreateHostResponseDto,
DeleteHostResponseDto,
@ -14,7 +14,7 @@ from remnawave_api.models import (
UpdateHostRequestDto,
UpdateHostResponseDto,
)
from remnawave_api.rapid import AttributeBody, BaseController, delete, get, post, patch
from remnawave.rapid import AttributeBody, BaseController, delete, get, post, patch
class HostsController(BaseController):

View file

@ -3,7 +3,7 @@ from uuid import UUID
from rapid_api_client import PydanticBody
from remnawave_api.models import (
from remnawave.models import (
BulkDeleteHostsResponseDto,
BulkDisableHostsResponseDto,
BulkEnableHostsResponseDto,
@ -11,7 +11,7 @@ from remnawave_api.models import (
SetInboundToManyHostsResponseDto,
SetPortToManyHostsResponseDto,
)
from remnawave_api.rapid import AttributeBody, BaseController, post
from remnawave.rapid import AttributeBody, BaseController, post
class HostsBulkActionsController(BaseController):

View file

@ -1,7 +1,7 @@
from typing import Annotated
from uuid import UUID
from remnawave_api.models import (
from remnawave.models import (
CreateUserHwidDeviceResponseDto,
DeleteUserHwidDeviceResponseDto,
GetUserHwidDevicesResponseDto,
@ -9,7 +9,7 @@ from remnawave_api.models import (
HWIDDeleteRequest
)
from rapid_api_client import Path, PydanticBody
from remnawave_api.rapid import AttributeBody, BaseController, post, get
from remnawave.rapid import AttributeBody, BaseController, post, get
class HWIDUserController(BaseController):

View file

@ -2,8 +2,8 @@ from typing import Annotated, Optional
from uuid import UUID
from rapid_api_client import Path
from remnawave_api.models import GetAllInboundsResponseDto, GetInboundsByProfileUuidResponseDto
from remnawave_api.rapid import BaseController, get
from remnawave.models import GetAllInboundsResponseDto, GetInboundsByProfileUuidResponseDto
from remnawave.rapid import BaseController, get
class InboundsController(BaseController):

View file

@ -1,13 +1,13 @@
from typing import Annotated
from uuid import UUID
from remnawave_api.models import (
from remnawave.models import (
AddInboundToNodesResponseDto,
AddInboundToUsersResponseDto,
RemoveInboundFromNodesResponseDto,
RemoveInboundFromUsersResponseDto,
)
from remnawave_api.rapid import AttributeBody, BaseController, post
from remnawave.rapid import AttributeBody, BaseController, post
class InboundsBulkActionsController(BaseController):

View file

@ -3,7 +3,7 @@ from typing import Annotated
from rapid_api_client import Path, Query
from rapid_api_client.annotations import PydanticBody
from remnawave_api.models import (
from remnawave.models import (
CreateInfraBillingNodeRequestDto,
CreateInfraBillingNodeResponseDto,
CreateInfraProviderRequestDto,
@ -21,7 +21,7 @@ from remnawave_api.models import (
UpdateInfraProviderRequestDto,
UpdateInfraProviderResponseDto,
)
from remnawave_api.rapid import BaseController, delete, get, patch, post
from remnawave.rapid import BaseController, delete, get, patch, post
class InfraBillingController(BaseController):

View file

@ -3,7 +3,7 @@ from typing import Annotated
from rapid_api_client import Path
from rapid_api_client.annotations import PydanticBody
from remnawave_api.models import (
from remnawave.models import (
AddUsersToInternalSquadRequestDto,
AddUsersToInternalSquadResponseDto,
CreateInternalSquadRequestDto,
@ -16,7 +16,7 @@ from remnawave_api.models import (
UpdateInternalSquadRequestDto,
UpdateInternalSquadResponseDto,
)
from remnawave_api.rapid import BaseController, delete, get, patch, post
from remnawave.rapid import BaseController, delete, get, patch, post
class InternalSquadsController(BaseController):

View file

@ -1,5 +1,5 @@
from remnawave_api.models import GetPubKeyResponseDto
from remnawave_api.rapid import BaseController, get
from remnawave.models import GetPubKeyResponseDto
from remnawave.rapid import BaseController, get
class KeygenController(BaseController):

View file

@ -3,7 +3,7 @@ from typing import Annotated
from rapid_api_client import Path
from rapid_api_client.annotations import PydanticBody
from remnawave_api.models import (
from remnawave.models import (
CreateNodeRequestDto,
CreateNodeResponseDto,
DeleteNodeResponseDto,
@ -18,7 +18,7 @@ from remnawave_api.models import (
UpdateNodeRequestDto,
UpdateNodeResponseDto,
)
from remnawave_api.rapid import BaseController, delete, get, patch, post
from remnawave.rapid import BaseController, delete, get, patch, post
class NodesController(BaseController):

View file

@ -2,11 +2,11 @@ from typing import Annotated
from rapid_api_client import Path, Query
from remnawave_api.models import (
from remnawave.models import (
GetNodeUserUsageByRangeResponseDto,
GetNodesUsageByRangeResponseDto,
)
from remnawave_api.rapid import BaseController, get
from remnawave.rapid import BaseController, get
class NodesUsageHistoryController(BaseController):

View file

@ -2,9 +2,9 @@ from typing import Annotated
from rapid_api_client import Path
from remnawave_api.enums import ClientType
from remnawave_api.models import GetSubscriptionInfoResponseDto
from remnawave_api.rapid import BaseController, get
from remnawave.enums import ClientType
from remnawave.models import GetSubscriptionInfoResponseDto
from remnawave.rapid import BaseController, get
class SubscriptionController(BaseController):

View file

@ -2,12 +2,12 @@ from typing import Annotated
from rapid_api_client.annotations import PydanticBody
from remnawave_api.models import (
from remnawave.models import (
GetSubscriptionSettingsResponseDto,
UpdateSubscriptionSettingsRequestDto,
UpdateSubscriptionSettingsResponseDto,
)
from remnawave_api.rapid import BaseController, get, patch
from remnawave.rapid import BaseController, get, patch
class SubscriptionsSettingsController(BaseController):

View file

@ -2,9 +2,9 @@ from typing import Annotated
from rapid_api_client.annotations import Path, PydanticBody
from remnawave_api.enums import TemplateType
from remnawave_api.models import GetTemplateResponseDto, UpdateTemplateRequestDto, UpdateTemplateResponseDto
from remnawave_api.rapid import BaseController, get, put
from remnawave.enums import TemplateType
from remnawave.models import GetTemplateResponseDto, UpdateTemplateRequestDto, UpdateTemplateResponseDto
from remnawave.rapid import BaseController, get, put
class SubscriptionsTemplateController(BaseController):

View file

@ -1,9 +1,9 @@
from remnawave_api.models import (
from remnawave.models import (
GetBandwidthStatsResponseDto,
GetNodesStatisticsResponseDto,
GetStatsResponseDto,
)
from remnawave_api.rapid import BaseController, get
from remnawave.rapid import BaseController, get
class SystemController(BaseController):

View file

@ -3,7 +3,7 @@ from typing import Annotated, Optional
from rapid_api_client import Path, Query
from rapid_api_client.annotations import PydanticBody
from remnawave_api.models import (
from remnawave.models import (
CreateUserRequestDto,
DeleteUserResponseDto,
EmailUserResponseDto,
@ -15,7 +15,7 @@ from remnawave_api.models import (
TagsResponseDto,
RevokeUserRequestDto
)
from remnawave_api.rapid import BaseController, delete, get, patch, post
from remnawave.rapid import BaseController, delete, get, patch, post
class UsersController(BaseController):

View file

@ -3,8 +3,8 @@ from uuid import UUID
from rapid_api_client.annotations import PydanticBody
from remnawave_api.enums import UserStatus
from remnawave_api.models import (
from remnawave.enums import UserStatus
from remnawave.models import (
BulkAllResetTrafficUsersResponseDto,
BulkAllUpdateUsersRequestDto,
BulkAllUpdateUsersResponseDto,
@ -12,7 +12,7 @@ from remnawave_api.models import (
BulkUpdateUsersInboundsRequestDto,
UpdateUserFields,
)
from remnawave_api.rapid import AttributeBody, BaseController, patch, post
from remnawave.rapid import AttributeBody, BaseController, patch, post
class UsersBulkActionsController(BaseController):

View file

@ -2,8 +2,8 @@ from typing import Annotated
from rapid_api_client import Path, Query
from remnawave_api.models import GetUserUsageByRangeResponseDto
from remnawave_api.rapid import BaseController, get
from remnawave.models import GetUserUsageByRangeResponseDto
from remnawave.rapid import BaseController, get
class UsersStatsController(BaseController):

View file

@ -2,8 +2,8 @@ from typing import Annotated
from rapid_api_client.annotations import JsonBody
from remnawave_api.models import GetConfigResponseDto, UpdateConfigResponseDto
from remnawave_api.rapid import BaseController, get, put
from remnawave.models import GetConfigResponseDto, UpdateConfigResponseDto
from remnawave.rapid import BaseController, get, put
class XrayConfigController(BaseController):

View file

@ -2,7 +2,7 @@ from datetime import datetime
from pydantic import AliasChoices, BaseModel, Field
from remnawave_api.enums import ErrorCode
from remnawave.enums import ErrorCode
from typing import Any, List, Optional

View file

@ -2,7 +2,7 @@ from datetime import datetime
import httpx
from remnawave_api.enums import ErrorCode
from remnawave.enums import ErrorCode
from .general import (
ApiError,
ApiErrorResponse,

View file

@ -3,7 +3,7 @@ from uuid import UUID
from pydantic import BaseModel, Field, StringConstraints, RootModel
from remnawave_api.enums import ALPN, Fingerprint, SecurityLayer
from remnawave.enums import ALPN, Fingerprint, SecurityLayer
class ReorderResponse(BaseModel):

View file

@ -3,7 +3,7 @@ from uuid import UUID
from pydantic import BaseModel, Field
from remnawave_api.models import HostResponseDto
from remnawave.models import HostResponseDto
class SetInboundToManyHostsRequestDto(BaseModel):

View file

@ -4,7 +4,7 @@ from uuid import UUID
from pydantic import BaseModel, Field, StringConstraints, RootModel
from remnawave_api.models.internal_squads import InboundsDto
from remnawave.models.internal_squads import InboundsDto
class ExcludedInbounds(BaseModel):

View file

@ -3,7 +3,7 @@ from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field
from remnawave_api.enums import TrafficLimitStrategy, UserStatus
from remnawave.enums import TrafficLimitStrategy, UserStatus
class HappCrypto(BaseModel):

View file

@ -3,7 +3,7 @@ from uuid import UUID
from pydantic import BaseModel, Field
from remnawave_api.enums import TemplateType
from remnawave.enums import TemplateType
class TemplateResponseDto(BaseModel):

View file

@ -9,7 +9,7 @@ from pydantic import (
StringConstraints,
)
from remnawave_api.enums import TrafficLimitStrategy, UserStatus
from remnawave.enums import TrafficLimitStrategy, UserStatus
class UserActiveInboundsDto(BaseModel):

View file

@ -4,8 +4,8 @@ from uuid import UUID
from pydantic import BaseModel, EmailStr, Field, constr
from remnawave_api.enums import UserStatus
from remnawave_api.enums.users import TrafficLimitStrategy
from remnawave.enums import UserStatus
from remnawave.enums.users import TrafficLimitStrategy
class BulkUpdateUsersInboundsRequestDto(BaseModel):

View file

@ -21,9 +21,9 @@ from rapid_api_client.client import pydantic_xml, RapidParameter, RapidParameter
from rapid_api_client.typing import BM, T
from rapid_api_client.utils import filter_none_values, find_annotation
from remnawave_api.exceptions import ApiError, ApiErrorResponse, handle_api_error
from remnawave_api.rapid import AttributeBody
from remnawave_api.utils.serializer import orjson_default
from remnawave.exceptions import ApiError, ApiErrorResponse, handle_api_error
from remnawave.rapid import AttributeBody
from remnawave.utils.serializer import orjson_default
class BaseController(RapidApi):

Binary file not shown.

View file

@ -3,7 +3,7 @@ import os
import pytest
from dotenv import load_dotenv
from remnawave_api import RemnawaveSDK
from remnawave import RemnawaveSDK
load_dotenv()
REMNAWAVE_BASE_URL = os.getenv("REMNAWAVE_BASE_URL")

View file

@ -1,7 +1,7 @@
import pytest
from remnawave_api.models import LoginRequestDto, LoginResponseDto, LoginTelegramRequestDto
from remnawave_api.exceptions import ForbiddenError, ApiError
from remnawave.models import LoginRequestDto, LoginResponseDto, LoginTelegramRequestDto
from remnawave.exceptions import ForbiddenError, ApiError
from tests.conftest import REMNAWAVE_ADMIN_PASSWORD, REMNAWAVE_ADMIN_USERNAME

View file

@ -1,4 +1,4 @@
from remnawave_api.models import GetNodesUsageByRangeResponseDto, GetNodesRealtimeUsageResponseDto
from remnawave.models import GetNodesUsageByRangeResponseDto, GetNodesRealtimeUsageResponseDto
from tests.utils import generate_isoformat_range

View file

@ -1,6 +1,6 @@
import pytest
from remnawave_api.models import (
from remnawave.models import (
CreateConfigProfileRequestDto,
CreateConfigProfileResponseDto,
DeleteConfigProfileResponseDto,

View file

@ -2,8 +2,8 @@ import random
import pytest
from remnawave_api.enums import ALPN, Fingerprint
from remnawave_api.models import (
from remnawave.enums import ALPN, Fingerprint
from remnawave.models import (
CreateHostRequestDto,
CreateHostResponseDto,
DeleteHostResponseDto,

View file

@ -3,7 +3,7 @@ import uuid
import pytest
from remnawave_api.models import (
from remnawave.models import (
CreateUserHwidDeviceRequestDto,
DeleteUserHwidDeviceRequestDto,
CreateUserHwidDeviceResponseDto,

View file

@ -1,6 +1,6 @@
import pytest
from remnawave_api.models import GetAllInboundsResponseDto
from remnawave.models import GetAllInboundsResponseDto
@pytest.mark.asyncio

View file

@ -2,7 +2,7 @@ from datetime import datetime, timedelta
import pytest
from remnawave_api.models import (
from remnawave.models import (
CreateInfraBillingNodeRequestDto,
CreateInfraBillingNodeResponseDto,
CreateInfraProviderRequestDto,

View file

@ -1,7 +1,7 @@
from uuid import UUID
import pytest
from remnawave_api.models import (
from remnawave.models import (
AddUsersToInternalSquadRequestDto,
AddUsersToInternalSquadResponseDto,
CreateInternalSquadRequestDto,

View file

@ -1,6 +1,6 @@
import pytest
from remnawave_api.models import GetPubKeyResponseDto
from remnawave.models import GetPubKeyResponseDto
@pytest.mark.asyncio

View file

@ -2,7 +2,7 @@ import random
import pytest
from remnawave_api.models import (
from remnawave.models import (
NodeConfigProfileRequestDto,
CreateNodeRequestDto,
DeleteNodeResponseDto,
@ -13,7 +13,7 @@ from remnawave_api.models import (
ReorderNodeResponseDto,
UpdateNodeRequestDto,
)
from remnawave_api.models.nodes import ReorderNodeItem
from remnawave.models.nodes import ReorderNodeItem
from tests.conftest import REMNAWAVE_CONFIG_PROFILE_UUID, REMNAWAVE_INBOUND_UUID
from tests.utils import generate_random_string

View file

@ -2,7 +2,7 @@ from datetime import datetime, timedelta
import pytest
from remnawave_api.models import (
from remnawave.models import (
GetNodeUserUsageByRangeResponseDto,
GetNodesUsageByRangeResponseDto,
)

View file

@ -1,7 +1,7 @@
import pytest
from remnawave_api.enums import ClientType
from remnawave_api.models import GetSubscriptionInfoResponseDto
from remnawave.enums import ClientType
from remnawave.models import GetSubscriptionInfoResponseDto
from tests.conftest import REMNAWAVE_SHORT_UUID

View file

@ -1,6 +1,6 @@
import pytest
from remnawave_api.models import (
from remnawave.models import (
GetSubscriptionSettingsResponseDto,
UpdateSubscriptionSettingsRequestDto,
UpdateSubscriptionSettingsResponseDto,

View file

@ -1,7 +1,7 @@
import pytest
from remnawave_api.enums import TemplateType
from remnawave_api.models import GetTemplateResponseDto, UpdateTemplateRequestDto, UpdateTemplateResponseDto
from remnawave.enums import TemplateType
from remnawave.models import GetTemplateResponseDto, UpdateTemplateRequestDto, UpdateTemplateResponseDto
@pytest.mark.asyncio

View file

@ -1,6 +1,6 @@
import pytest
from remnawave_api.models import (
from remnawave.models import (
GetBandwidthStatsResponseDto,
GetNodesStatisticsResponseDto,
GetStatsResponseDto,

View file

@ -4,9 +4,9 @@ from datetime import datetime, timedelta
import pytest
import pytz
from remnawave_api.enums import ErrorCode, UserStatus
from remnawave_api.exceptions import ApiError
from remnawave_api.models import (
from remnawave.enums import ErrorCode, UserStatus
from remnawave.exceptions import ApiError
from remnawave.models import (
CreateUserRequestDto,
DeleteUserResponseDto,
EmailUserResponseDto,

View file

@ -4,7 +4,7 @@ from typing import List
import pytest
import pytz
from remnawave_api.models import BulkResponseDto, UpdateUserFields
from remnawave.models import BulkResponseDto, UpdateUserFields
from tests.conftest import REMNAWAVE_USER_UUID

View file

@ -1,6 +1,6 @@
import pytest
from remnawave_api.models import GetUserUsageByRangeResponseDto
from remnawave.models import GetUserUsageByRangeResponseDto
from tests.conftest import REMNAWAVE_USER_UUID
from tests.utils import generate_isoformat_range