Skip to content

Commit 046f576

Browse files
feat: sync SDK with API changes
1 parent e29c438 commit 046f576

7 files changed

Lines changed: 448 additions & 1 deletion

File tree

src/blindpay/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "2.0.1"
1+
__version__ = "2.1.0"
22

33
from ._internal.exceptions import BlindPayError
44
from .client import BlindPay, BlindPaySync
@@ -27,6 +27,8 @@
2727
TrackingTransaction,
2828
TransactionDocumentType,
2929
TransactionStatus,
30+
VoucherStatus,
31+
VoucherType,
3032
)
3133

3234
__all__ = [
@@ -57,4 +59,6 @@
5759
"TrackingPartnerFee",
5860
"TrackingPayment",
5961
"TrackingTransaction",
62+
"VoucherStatus",
63+
"VoucherType",
6064
]

src/blindpay/client.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
VirtualAccountsResource,
3232
VirtualAccountsResourceSync,
3333
)
34+
from blindpay.resources.vouchers.vouchers import VouchersResource, VouchersResourceSync
3435
from blindpay.resources.wallets.blockchain import BlockchainWalletsResource, BlockchainWalletsResourceSync
3536
from blindpay.resources.wallets.offramp import OfframpWalletsResource, OfframpWalletsResourceSync
3637
from blindpay.resources.webhooks.webhooks import WebhookEndpointsResource, WebhookEndpointsResourceSync
@@ -321,6 +322,12 @@ def fees(self) -> "FeesResource":
321322

322323
return create_fees_resource(self._instance_id, self._api)
323324

325+
@cached_property
326+
def vouchers(self) -> "VouchersResource":
327+
from blindpay.resources.vouchers import create_vouchers_resource
328+
329+
return create_vouchers_resource(self._instance_id, self._api)
330+
324331
@cached_property
325332
def upload(self) -> "UploadResource":
326333
from blindpay.resources.upload import create_upload_resource
@@ -539,6 +546,12 @@ def fees(self) -> "FeesResourceSync":
539546

540547
return create_fees_resource_sync(self._instance_id, self._api)
541548

549+
@cached_property
550+
def vouchers(self) -> "VouchersResourceSync":
551+
from blindpay.resources.vouchers import create_vouchers_resource_sync
552+
553+
return create_vouchers_resource_sync(self._instance_id, self._api)
554+
542555
@cached_property
543556
def upload(self) -> "UploadResourceSync":
544557
from blindpay.resources.upload import create_upload_resource_sync

src/blindpay/resources/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from .transfers import create_transfers_resource
1313
from .upload import create_upload_resource
1414
from .virtual_accounts import create_virtual_accounts_resource
15+
from .vouchers import create_vouchers_resource
1516
from .wallets import create_blockchain_wallets_resource, create_offramp_wallets_resource
1617
from .webhooks import create_webhook_endpoints_resource
1718

@@ -31,6 +32,7 @@
3132
"create_transfers_resource",
3233
"create_upload_resource",
3334
"create_virtual_accounts_resource",
35+
"create_vouchers_resource",
3436
"create_blockchain_wallets_resource",
3537
"create_offramp_wallets_resource",
3638
"create_webhook_endpoints_resource",
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from .vouchers import (
2+
CreateVoucherInput,
3+
CreateVoucherResponse,
4+
DeleteVoucherResponse,
5+
ListVouchersResponse,
6+
UpdateVoucherInput,
7+
Voucher,
8+
VouchersResource,
9+
VouchersResourceSync,
10+
create_vouchers_resource,
11+
create_vouchers_resource_sync,
12+
)
13+
14+
__all__ = [
15+
"CreateVoucherInput",
16+
"CreateVoucherResponse",
17+
"DeleteVoucherResponse",
18+
"ListVouchersResponse",
19+
"UpdateVoucherInput",
20+
"Voucher",
21+
"VouchersResource",
22+
"VouchersResourceSync",
23+
"create_vouchers_resource",
24+
"create_vouchers_resource_sync",
25+
]
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
from typing import Any, List, Optional
2+
3+
from typing_extensions import TypedDict
4+
5+
from ..._internal.api_client import InternalApiClient, InternalApiClientSync
6+
from ...types import BlindpayApiResponse, Currency, PaginationMetadata, VoucherStatus, VoucherType
7+
8+
9+
class CreateVoucherInput(TypedDict):
10+
code: str
11+
type: VoucherType
12+
currency: Currency
13+
amount: float
14+
description: Optional[str]
15+
max_redemptions: Optional[int]
16+
expires_at: Optional[str]
17+
receiver_id: Optional[str]
18+
metadata: Optional[Any]
19+
20+
21+
class CreateVoucherResponse(TypedDict):
22+
id: str
23+
code: str
24+
type: VoucherType
25+
status: VoucherStatus
26+
currency: Currency
27+
amount: float
28+
29+
30+
class UpdateVoucherInput(TypedDict, total=False):
31+
description: Optional[str]
32+
status: Optional[VoucherStatus]
33+
max_redemptions: Optional[int]
34+
expires_at: Optional[str]
35+
metadata: Optional[Any]
36+
37+
38+
class Voucher(TypedDict):
39+
id: str
40+
code: str
41+
description: Optional[str]
42+
type: VoucherType
43+
status: VoucherStatus
44+
currency: Currency
45+
amount: float
46+
max_redemptions: Optional[int]
47+
current_redemptions: int
48+
expires_at: Optional[str]
49+
receiver_id: Optional[str]
50+
metadata: Optional[Any]
51+
created_at: str
52+
updated_at: str
53+
54+
55+
class ListVouchersResponse(TypedDict):
56+
data: List[Voucher]
57+
pagination: PaginationMetadata
58+
59+
60+
class DeleteVoucherResponse(TypedDict):
61+
success: bool
62+
63+
64+
class VouchersResource:
65+
def __init__(self, instance_id: str, client: InternalApiClient):
66+
self._instance_id = instance_id
67+
self._client = client
68+
69+
async def create(self, data: CreateVoucherInput) -> BlindpayApiResponse[CreateVoucherResponse]:
70+
return await self._client.post(f"/instances/{self._instance_id}/vouchers", data)
71+
72+
async def list(self) -> BlindpayApiResponse[ListVouchersResponse]:
73+
return await self._client.get(f"/instances/{self._instance_id}/vouchers")
74+
75+
async def get(self, voucher_id: str) -> BlindpayApiResponse[Voucher]:
76+
return await self._client.get(f"/instances/{self._instance_id}/vouchers/{voucher_id}")
77+
78+
async def update(self, voucher_id: str, data: UpdateVoucherInput) -> BlindpayApiResponse[Voucher]:
79+
return await self._client.patch(f"/instances/{self._instance_id}/vouchers/{voucher_id}", data)
80+
81+
async def delete(self, voucher_id: str) -> BlindpayApiResponse[DeleteVoucherResponse]:
82+
return await self._client.delete(f"/instances/{self._instance_id}/vouchers/{voucher_id}")
83+
84+
85+
class VouchersResourceSync:
86+
def __init__(self, instance_id: str, client: InternalApiClientSync):
87+
self._instance_id = instance_id
88+
self._client = client
89+
90+
def create(self, data: CreateVoucherInput) -> BlindpayApiResponse[CreateVoucherResponse]:
91+
return self._client.post(f"/instances/{self._instance_id}/vouchers", data)
92+
93+
def list(self) -> BlindpayApiResponse[ListVouchersResponse]:
94+
return self._client.get(f"/instances/{self._instance_id}/vouchers")
95+
96+
def get(self, voucher_id: str) -> BlindpayApiResponse[Voucher]:
97+
return self._client.get(f"/instances/{self._instance_id}/vouchers/{voucher_id}")
98+
99+
def update(self, voucher_id: str, data: UpdateVoucherInput) -> BlindpayApiResponse[Voucher]:
100+
return self._client.patch(f"/instances/{self._instance_id}/vouchers/{voucher_id}", data)
101+
102+
def delete(self, voucher_id: str) -> BlindpayApiResponse[DeleteVoucherResponse]:
103+
return self._client.delete(f"/instances/{self._instance_id}/vouchers/{voucher_id}")
104+
105+
106+
def create_vouchers_resource(instance_id: str, client: InternalApiClient) -> VouchersResource:
107+
return VouchersResource(instance_id, client)
108+
109+
110+
def create_vouchers_resource_sync(instance_id: str, client: InternalApiClientSync) -> VouchersResourceSync:
111+
return VouchersResourceSync(instance_id, client)

src/blindpay/types.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,3 +381,7 @@ class TrackingPartnerFee(TypedDict):
381381
BankingPartner = Literal["cfsb", "citi", "hsbc", "jpmorgan"]
382382

383383
PaymentMethod = Literal["ach", "wire", "pix", "spei", "transfers", "pse", "international_swift"]
384+
385+
VoucherType = Literal["single_use", "multi_use", "time_limited"]
386+
387+
VoucherStatus = Literal["active", "redeemed", "expired", "revoked"]

0 commit comments

Comments
 (0)