Skip to content

Commit d37ef89

Browse files
committed
feat: move endpoints services to openapi gateway
1 parent b476d62 commit d37ef89

File tree

24 files changed

+276
-678
lines changed

24 files changed

+276
-678
lines changed

docs/en/services/chat.md

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ different message types, manage chat participants, and track chat history and up
1111

1212
## Chat Methods
1313

14-
| Method | Description | Parameters |
15-
|---------------------------------------|-------------------|-------------------------------|
16-
| [`create_message()`](#create-message) | Create a message | `request: MessageRequest` |
17-
| [`create_chat()`](#create-chat) | Create a chat | `request: CreateChatRequest` |
18-
| [`get_messages()`](#get-messages) | Get chat messages | `request: GetMessagesRequest` |
19-
| [`get_chats()`](#get-chats) | Get chats list | `request: GetChatsRequest` |
14+
| Method | Description | Parameters |
15+
|---------------------------------------|-------------------|----------------------------------------------------------------|
16+
| [`create_message()`](#create-message) | Create a message | `chat_id: int, request: MessageRequest` |
17+
| [`create_chat()`](#create-chat) | Create a chat | `request: CreateChatRequest` |
18+
| [`get_messages()`](#get-messages) | Get chat messages | `chat_id: int, request: Optional[GetMessagesRequest] = None` |
19+
| [`get_chats()`](#get-chats) | Get chats list | `request: GetChatsRequest` |
2020

2121
## Examples
2222

@@ -46,7 +46,7 @@ async def create_message_example():
4646
text="Hello, how can I help you?"
4747
)
4848
)
49-
message = await client.create_message(request=request)
49+
message = await client.chat.create_message(chat_id=123, request=request)
5050
return message
5151
```
5252

@@ -60,7 +60,7 @@ async def create_chat_example():
6060
request = CreateChatRequest(
6161
user_id=123
6262
)
63-
new_chat = await client.create_chat(request=request)
63+
new_chat = await client.chat.create_chat(request=request)
6464
return new_chat
6565
```
6666

@@ -72,12 +72,21 @@ from basalam_sdk.chat.models import GetMessagesRequest
7272

7373
async def get_messages_example():
7474
request = GetMessagesRequest(
75-
chat_id=123,
7675
message_id=456,
7776
limit=20,
7877
order="desc",
7978
)
80-
messages = await client.get_messages(request=request)
79+
messages = await client.chat.get_messages(chat_id=123, request=request)
80+
81+
# Option 2: With default parameters (request is optional)
82+
messages = await client.chat.get_messages(chat_id=123)
83+
84+
# Option 3: With only some custom parameters
85+
messages = await client.chat.get_messages(
86+
chat_id=123,
87+
request=GetMessagesRequest(limit=50)
88+
)
89+
8190
return messages
8291
```
8392

@@ -93,7 +102,7 @@ async def get_chats_example():
93102
order_by=MessageOrderByEnum.UPDATED_AT,
94103
filters=MessageFiltersEnum.UNSEEN
95104
)
96-
chats = await client.get_chats(request=request)
105+
chats = await client.chat.get_chats(request=request)
97106
return chats
98107
```
99108

docs/en/services/core.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ information, handle bank account operations, and manage categories and attribute
4848
| [`verify_user_bank_account_otp()`](#verify-user-bank-account-otp) | Verify bank account OTP | `user_id`, `request: UserCardsOtpSchema` |
4949
| [`verify_user_bank_account()`](#verify-user-bank-account) | Verify bank accounts | `user_id`, `request: UserVerifyBankInformationSchema` |
5050
| [`delete_user_bank_account()`](#delete-user-bank-account) | Delete bank account | `user_id`, `bank_account_id` |
51-
| [`update_user_bank_account()`](#update-user-bank-account) | Update bank account | `bank_account_id`, `request: UpdateUserBankInformationSchema` |
51+
| [`update_user_bank_account()`](#update-user-bank-account) | Update bank account | `user_id`, `bank_account_id`, `request: UpdateUserBankInformationSchema` |
5252
| [`update_user_verification()`](#update-user-verification) | Update user verification | `user_id`, `request: UserVerificationSchema` |
5353
| [`get_category_attributes()`](#get-category-attributes) | Get category attributes | `category_id`, `product_id`, `vendor_id`, `exclude_multi_selects` |
5454
| [`get_categories()`](#get-categories) | Get all categories | `None` |

docs/en/services/wallet.md

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ refunds, and handle credit-specific operations.
2424
| [`get_expense_by_ref()`](#get-expense-by-ref-example) | Get expense by reference | `user_id`, `reason_id`, `reference_id`, `x_operator_id` |
2525
| [`delete_expense_by_ref()`](#delete-expense-by-ref-example) | Delete expense by reference | `user_id`, `reason_id`, `reference_id`, `rollback_reason_id`, `x_operator_id` |
2626
| [`create_refund()`](#create-refund-example) | Process a refund | `request`, `x_operator_id` |
27-
| [`can_rollback_refund()`](#can-rollback-refund-example) | Check if refund can be rolled back | `refund_reason`, `refund_reference_id`, `x_operator_id` |
28-
| [`rollback_refund()`](#rollback-refund-example) | Rollback a refund | `request`, `x_operator_id` |
27+
| [`can_rollback_refund()`](#can-rollback-refund-example) | Check if refund can be rolled back | `refund_id`, `refund_reason`, `refund_reference_id`, `x_operator_id`| |
28+
| [`rollback_refund()`](#rollback-refund-example) | Rollback a refund | `refund_id`, `request`, `x_operator_id` |
2929

3030
## Examples
3131

@@ -49,7 +49,7 @@ client = BasalamClient(auth=auth)
4949

5050
```python
5151
async def get_balance_example():
52-
balance = await client.get_balance(
52+
balance = await client.wallet.get_balance(
5353
user_id=123,
5454
filters=[
5555
BalanceFilter(
@@ -61,7 +61,7 @@ async def get_balance_example():
6161
],
6262
x_operator_id=456
6363
)
64-
64+
6565
print(f"User balance: {balance}")
6666
return balance
6767
```
@@ -70,7 +70,7 @@ async def get_balance_example():
7070

7171
```python
7272
async def get_transactions_example():
73-
transactions = await client.get_transactions(
73+
transactions = await client.wallet.get_transactions(
7474
user_id=123,
7575
page=1,
7676
per_page=20,
@@ -87,7 +87,7 @@ async def get_transactions_example():
8787

8888
```python
8989
async def create_expense_example():
90-
expense = await client.create_expense(
90+
expense = await client.wallet.create_expense(
9191
user_id=123,
9292
request=SpendCreditRequest(
9393
reason_id=1,
@@ -112,7 +112,7 @@ async def create_expense_example():
112112

113113
```python
114114
async def create_expense_from_credit_example():
115-
expense = await client.create_expense_from_credit(
115+
expense = await client.wallet.create_expense_from_credit(
116116
user_id=123,
117117
credit_id=789,
118118
request=SpendSpecificCreditRequest(
@@ -137,7 +137,7 @@ async def create_expense_from_credit_example():
137137

138138
```python
139139
async def get_expense_example():
140-
expense = await client.get_expense(
140+
expense = await client.wallet.get_expense(
141141
user_id=123,
142142
expense_id=456,
143143
x_operator_id=456
@@ -153,7 +153,7 @@ async def get_expense_example():
153153

154154
```python
155155
async def delete_expense_example():
156-
result = await client.delete_expense(
156+
result = await client.wallet.delete_expense(
157157
user_id=123,
158158
expense_id=456,
159159
rollback_reason_id=2,
@@ -168,7 +168,7 @@ async def delete_expense_example():
168168

169169
```python
170170
async def get_expense_by_ref_example():
171-
expense = await client.get_expense_by_ref(
171+
expense = await client.wallet.get_expense_by_ref(
172172
user_id=123,
173173
reason_id=1,
174174
reference_id=456,
@@ -184,7 +184,7 @@ async def get_expense_by_ref_example():
184184

185185
```python
186186
async def delete_expense_by_ref_example():
187-
result = await client.delete_expense_by_ref(
187+
result = await client.wallet.delete_expense_by_ref(
188188
user_id=123,
189189
reason_id=1,
190190
reference_id=456,
@@ -200,7 +200,7 @@ async def delete_expense_by_ref_example():
200200

201201
```python
202202
async def create_refund_example():
203-
refund = await client.create_refund(
203+
refund = await client.wallet.create_refund(
204204
request=RefundRequest(
205205
original_reason=1,
206206
original_reference_id=456,
@@ -226,23 +226,25 @@ async def create_refund_example():
226226

227227
```python
228228
async def can_rollback_refund_example():
229-
can_rollback = await client.can_rollback_refund(
230-
refund_reason=2,
231-
refund_reference_id=789,
229+
# Assuming refund_id is 999
230+
can_rollback = await client.wallet.can_rollback_refund(
231+
refund_id=999,
232232
x_operator_id=456
233233
)
234-
234+
235235
print(f"Can rollback refund: {can_rollback.status}")
236236
print(f"Message: {can_rollback.message}")
237-
237+
238238
return can_rollback
239239
```
240240

241241
### Rollback Refund Example
242242

243243
```python
244244
async def rollback_refund_example():
245-
result = await client.rollback_refund(
245+
# Assuming refund_id is 999
246+
result = await client.wallet.rollback_refund(
247+
refund_id=999,
246248
request=RollbackRefundRequest(
247249
refund_reason=2,
248250
rollback_refund_reason=3,
@@ -258,7 +260,7 @@ async def rollback_refund_example():
258260
),
259261
x_operator_id=456
260262
)
261-
263+
262264
print(f"Refund rolled back: {result.id}")
263265
return result
264266
```

src/basalam_sdk/auth.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,6 @@ async def refresh_token(self) -> TokenInfo:
385385
Note: Personal Token flow doesn't support automatic token refresh.
386386
You need to provide a new token manually.
387387
"""
388-
print("Token refresh not supported for PersonalToken authentication. Please provide a new token manually.")
389388
return self._token_info
390389

391390
def refresh_token_sync(self) -> TokenInfo:
@@ -395,7 +394,6 @@ def refresh_token_sync(self) -> TokenInfo:
395394
Note: Personal Token flow doesn't support automatic token refresh.
396395
You need to provide a new token manually.
397396
"""
398-
print("Token refresh not supported for PersonalToken authentication. Please provide a new token manually.")
399397
return self._token_info
400398

401399

@@ -545,7 +543,6 @@ async def refresh_token(self) -> TokenInfo:
545543
"""
546544
Refresh token functionality is not available in this implementation.
547545
"""
548-
print("Refresh token functionality is not available for this authorization code implementation.")
549546
if not self._token_info:
550547
raise BasalamAuthError("No token available. You must first exchange an authorization code.")
551548
return self._token_info
@@ -554,7 +551,6 @@ def refresh_token_sync(self) -> TokenInfo:
554551
"""
555552
Refresh token functionality is not available in this implementation.
556553
"""
557-
print("Refresh token functionality is not available for this authorization code implementation.")
558554
if not self._token_info:
559555
raise BasalamAuthError("No token available. You must first exchange an authorization code.")
560556
return self._token_info

src/basalam_sdk/basalam_client.pyi

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ class BasalamClient:
111111
def create_message_sync( self, request: MessageRequest, user_agent: Optional[str] = None ) -> MessageResponse: ...
112112
async def get_chats( self, request: GetChatsRequest ) -> ChatListResponse: ...
113113
def get_chats_sync( self, request: GetChatsRequest ) -> ChatListResponse: ...
114-
async def get_messages( self, request: GetMessagesRequest ) -> GetMessagesResponse: ...
115-
def get_messages_sync( self, request: GetMessagesRequest ) -> GetMessagesResponse: ...
114+
async def get_messages( self, request: Optional[GetMessagesRequest] = None ) -> GetMessagesResponse: ...
115+
def get_messages_sync( self, request: Optional[GetMessagesRequest] = None ) -> GetMessagesResponse: ...
116116
async def create_invoice_payment( self, invoice_id: int, request: CreatePaymentRequestModel ) -> Dict[str, Any]: ...
117117
def create_invoice_payment_sync( self, invoice_id: int, request: CreatePaymentRequestModel ) -> Dict[str, Any]: ...
118118
async def create_payment_callback( self, payment_id: int, request: PaymentVerifyRequestModel ) -> Dict[str, Any]: ...
@@ -147,14 +147,8 @@ class BasalamClient:
147147
def search_products_sync(self, request: ProductSearchModel) -> Dict[str, Any]: ...
148148
async def upload_file( self, file: BinaryIO, file_type: UserUploadFileTypeEnum, custom_unique_name: Optional[str] = None, expire_minutes: Optional[int] = None ) -> FileResponse: ...
149149
def upload_file_sync( self, file: BinaryIO, file_type: UserUploadFileTypeEnum, custom_unique_name: Optional[str] = None, expire_minutes: Optional[int] = None ) -> FileResponse: ...
150-
async def can_rollback_refund( self, refund_reason: int, refund_reference_id: int, x_operator_id: Optional[int] = None ) -> CanRollbackRefundResponse: ...
151-
def can_rollback_refund_sync( self, refund_reason: int, refund_reference_id: int, x_operator_id: Optional[int] = None ) -> CanRollbackRefundResponse: ...
152150
async def create_expense( self, user_id: int, request: SpendCreditRequest, x_operator_id: Optional[int] = None ) -> SpendResponse: ...
153-
async def create_expense_from_credit( self, user_id: int, credit_id: int, request: SpendSpecificCreditRequest, x_operator_id: Optional[int] = None ) -> SpendResponse: ...
154-
def create_expense_from_credit_sync( self, user_id: int, credit_id: int, request: SpendSpecificCreditRequest, x_operator_id: Optional[int] = None ) -> SpendResponse: ...
155151
def create_expense_sync( self, user_id: int, request: SpendCreditRequest, x_operator_id: Optional[int] = None ) -> SpendResponse: ...
156-
async def create_refund( self, request: RefundRequest, x_operator_id: Optional[int] = None ) -> Union[CreditCreationResponse, SpendResponse]: ...
157-
def create_refund_sync( self, request: RefundRequest, x_operator_id: Optional[int] = None ) -> Union[CreditCreationResponse, SpendResponse]: ...
158152
async def delete_expense( self, user_id: int, expense_id: int, rollback_reason_id: int, x_operator_id: Optional[int] = None ) -> SpendResponse: ...
159153
async def delete_expense_by_ref( self, user_id: int, reason_id: int, reference_id: int, rollback_reason_id: int, x_operator_id: Optional[int] = None ) -> SpendResponse: ...
160154
def delete_expense_by_ref_sync( self, user_id: int, reason_id: int, reference_id: int, rollback_reason_id: int, x_operator_id: Optional[int] = None ) -> SpendResponse: ...
@@ -167,8 +161,6 @@ class BasalamClient:
167161
def get_expense_sync( self, user_id: int, expense_id: int, x_operator_id: Optional[int] = None ) -> SpendResponse: ...
168162
async def get_transactions( self, user_id: int, page: int = 1, per_page: int = 50, x_operator_id: Optional[int] = None ) -> HistoryPaginationResponse: ...
169163
def get_transactions_sync( self, user_id: int, page: int = 1, per_page: int = 50, x_operator_id: Optional[int] = None ) -> HistoryPaginationResponse: ...
170-
async def rollback_refund( self, request: RollbackRefundRequest, x_operator_id: Optional[int] = None ) -> SpendResponse: ...
171-
def rollback_refund_sync( self, request: RollbackRefundRequest, x_operator_id: Optional[int] = None ) -> SpendResponse: ...
172164
async def create_webhook(self, request: CreateWebhookRequest) -> WebhookResource: ...
173165
async def create_webhook_service(self, request: CreateServiceRequest) -> ServiceResource: ...
174166
def create_webhook_service_sync(self, request: CreateServiceRequest) -> ServiceResource: ...

src/basalam_sdk/base_client.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,32 @@ def _handle_http_error(e: httpx.HTTPStatusError) -> None:
7272
response=e.response,
7373
)
7474

75+
@staticmethod
76+
def _unwrap_response(data: Union[Dict, List]) -> Union[Dict, List]:
77+
"""
78+
Unwrap response data if it's wrapped in a single-key dictionary.
79+
80+
This handles cases where the API returns data wrapped in a single key,
81+
like {"openapi_raw_data": [...]} or any future wrapper format.
82+
83+
Args:
84+
data: The response data to unwrap
85+
86+
Returns:
87+
The unwrapped data if it was wrapped, otherwise the original data
88+
"""
89+
# If it's a dict with exactإإly one key and the value is a list,
90+
# return the list value (unwrap it)
91+
if isinstance(data, dict) and len(data) == 1:
92+
key = next(iter(data))
93+
value = data[key]
94+
# Only unwrap if the single value is a list (common for wrapped list responses)
95+
# This preserves single-key dict responses that are meant to be dicts
96+
if isinstance(value, list):
97+
return value
98+
99+
return data
100+
75101
@staticmethod
76102
def _parse_response_data(
77103
response: httpx.Response,

0 commit comments

Comments
 (0)