diff --git a/.changeset/hungry-roses-cross.md b/.changeset/hungry-roses-cross.md new file mode 100644 index 000000000..a0259d520 --- /dev/null +++ b/.changeset/hungry-roses-cross.md @@ -0,0 +1,5 @@ +--- +'@voucherify/sdk': patch +--- + +New endpoint support - `customer-redeemable` diff --git a/packages/sdk/README.md b/packages/sdk/README.md index 47c3914b2..51e58a431 100644 --- a/packages/sdk/README.md +++ b/packages/sdk/README.md @@ -654,6 +654,7 @@ Methods are provided within `client.customers.*` namespace. - [Update Customers in bulk](#update-customers-in-bulk) - [Update Customers' Metadata in bulk](#update-customers-metadata-in-bulk) - [Import and Update Customers using CSV](#import-and-update-customers-using-csv) +- [List Redeemables](#list-redeemables) #### [Create Customer](https://docs.voucherify.io/reference/create-customer) @@ -759,6 +760,12 @@ client.customers.updateInBulk(customers) client.customers.updateMetadataInBulk(sourceIdsAndMetadata) ``` +#### [List Redeemables](https://docs.voucherify.io/reference/list-customer-redeemables) + +```javascript +client.customers.listRedeemables(id, params) +``` + --- ### Consents diff --git a/packages/sdk/src/Customers.ts b/packages/sdk/src/Customers.ts index 9e603ce4c..10532257e 100644 --- a/packages/sdk/src/Customers.ts +++ b/packages/sdk/src/Customers.ts @@ -131,6 +131,13 @@ class Customers { return this.client.post(`/customers/importCSV`, form, undefined, headers) } + + /** + * @see https://docs.voucherify.io/reference/list-customer-redeemables + */ + public listRedeemables(id: string, params?: T.CustomerRedeemablesListQueryParams) { + return this.client.get(`/customers/${encode(id)}/redeemables`, params) + } } export { Customers } diff --git a/packages/sdk/src/types/Customers.ts b/packages/sdk/src/types/Customers.ts index 3fe22d449..086361f70 100644 --- a/packages/sdk/src/types/Customers.ts +++ b/packages/sdk/src/types/Customers.ts @@ -1,4 +1,6 @@ // Legacy code +import { VouchersResponse } from './Vouchers' + export interface SimpleCustomer { id: string name?: string @@ -121,6 +123,40 @@ export interface CustomerActivitiesListResponse { data: Record[] } +export interface CustomerRedeemablesListQueryParams { + limit?: number + page?: number + order?: 'created_at' | '-created_at' | 'id' | '-id' + starting_after_id?: string + filters?: Record +} + +export interface CustomerRedeemablesListResponse { + object: 'list' + total: number + data_ref: 'data' + data: Record[] +} + +export interface CustomerRedeemable { + id: string + created_at: string + redeemable_id: string + redeemable_object: string + customer_id: string + holder_role: 'OWNER' | 'REFERRER' | 'REFEREE' + campaign_id: string + campaign_type: 'LOYALTY_PROGRAM' | 'PROMOTION' | 'DISCOUNT_COUPONS' | 'GIFT_VOUCHERS' | 'REFERRAL_PROGRAM' + voucher_type: 'GIFT' | 'DISCOUNT' | 'LOYALTY_CARD' | 'LUCKY_DRAW' + redeemable: Redeemable +} + +export interface Redeemable { + type: string + voucher: VouchersResponse + status: 'ACTIVE' | 'USED' | 'DISABLED' | 'NOT_ACTIVE' | 'EXPIRED' | 'NO_BALANCE' +} + export type CustomersCreateBody = CustomerRequest export type CustomersCreateResponse = CustomerObject | CustomerUnconfirmed diff --git a/packages/sdk/test/customers.spec.ts b/packages/sdk/test/customers.spec.ts index 821cdfb68..e9bf94871 100644 --- a/packages/sdk/test/customers.spec.ts +++ b/packages/sdk/test/customers.spec.ts @@ -1,6 +1,7 @@ import { voucherifyClient as client } from './client' import { generateRandomString } from './utils/generateRandomString' import { generateCustomerCSV } from './utils/generateCustomerCSV' +import { CustomerRequest, DiscountVouchersTypesEnum, DistributionsPublicationsCreateParams } from '@voucherify/sdk' jest.setTimeout(15000) @@ -173,4 +174,34 @@ describe('Customers API', () => { } expect(updatedCustomerWithNoAddress.address).toEqual(removedAddress) }) + + it('Should return redeemable for customer', async () => { + const createdCustomer: CustomerRequest = await client.customers.create({ source_id: generateRandomString() }) + + const discountCampaign = await client.campaigns.create({ + campaign_type: 'DISCOUNT_COUPONS', + name: generateRandomString(), + type: 'AUTO_UPDATE', + voucher: { + code_config: { + length: 3, + }, + type: 'DISCOUNT_VOUCHER', + discount: { + amount_off: 0, + type: DiscountVouchersTypesEnum.AMOUNT, + }, + }, + }) + + const distributionsPublicationsCreateParams: DistributionsPublicationsCreateParams = { + customer: createdCustomer, + campaign: discountCampaign, + } + + await client.distributions.publications.create(distributionsPublicationsCreateParams) + + const redeemables = await client.customers.listRedeemables(createdCustomer.id as string) + expect(redeemables.data).toBeDefined() + }) })