Skip to content

Commit

Permalink
feat: Add getSubscriptionModifiers (#88)
Browse files Browse the repository at this point in the history
Co-authored-by: Valentin Agachi <avaly@users.noreply.github.com>
  • Loading branch information
luke-rogers and avaly committed Jun 21, 2023
1 parent 0323235 commit ee831c5
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 5 deletions.
60 changes: 59 additions & 1 deletion src/__tests__/subscriptions.test.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { PaddleSDK } from '../sdk';
import {
DEFAULT_ERROR,
EXPECTED_BODY,
VENDOR_API_KEY,
VENDOR_ID,
} from '../../utils/constants';
import nock, { SERVER } from '../../utils/nock';
import { PaddleSDK } from '../sdk';

describe('subscription methods', () => {
let instance: PaddleSDK;
Expand Down Expand Up @@ -497,6 +497,64 @@ describe('subscription methods', () => {
});
});

describe('getSubscriptionModifiers', () => {
const path = '/subscription/modifiers';
const expectedBody = {
...EXPECTED_BODY,
};
// https://developer.paddle.com/api-reference/f575ab89eb18c-list-modifiers
const responseBody = {
success: true,
response: {
subscription_id: SUBSCRIPTION_ID,
modifier_id: 1,
amount: '100',
currency: 'GBP',
is_recurring: true,
description: 'Support',
},
};

test('resolves on successful request', async () => {
const scope = nock().post(path, expectedBody).reply(200, responseBody);

const response = await instance.getSubscriptionModifiers();

expect(response).toEqual(responseBody.response);
expect(scope.isDone()).toBeTruthy();
});

test('resolves on successful request all params', async () => {
const expectedBody = Object.assign(
{
subscription_id: SUBSCRIPTION_ID,
plan_id: PLAN_ID,
},
EXPECTED_BODY
);

const scope = nock().post(path, expectedBody).reply(200, responseBody);

const response = await instance.getSubscriptionModifiers({
subscriptionID: SUBSCRIPTION_ID,
planID: PLAN_ID,
});

expect(response).toEqual(responseBody.response);
expect(scope.isDone()).toBeTruthy();
});

test('rejects on error request', async () => {
const scope = nock().post(path, expectedBody).reply(400, DEFAULT_ERROR);

await expect(instance.getSubscriptionModifiers()).rejects.toThrow(
'Request failed with status code 400'
);

expect(scope.isDone()).toBeTruthy();
});
});

describe('createSubscriptionModifier', () => {
const path = '/subscription/modifiers/create';
const expectedBody = {
Expand Down
38 changes: 34 additions & 4 deletions src/sdk.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import crypto from 'crypto';
import axios, { AxiosRequestConfig } from 'axios';
import crypto from 'crypto';

import serialize from './serialize';
import {
CreateSubscriptionModifierBody,
CreateSubscriptionModifierResponse,
CreateOneOffChargeBody,
CreateOneOffChargeResponse,
CreateSubscriptionModifierBody,
CreateSubscriptionModifierResponse,
GeneratePaylinkBody,
GeneratePaylinkResponse,
GetProductCouponsBody,
GetProductCouponsResponse,
GetProductsResponse,
GetSubscriptionModifiersBody,
GetSubscriptionModifiersResponse,
GetSubscriptionPaymentsBody,
GetSubscriptionPaymentsResponse,
GetSubscriptionPlansBody,
Expand All @@ -20,11 +22,11 @@ import {
GetSubscriptionUsersResponse,
GetTransactionsResponse,
GetWebhookHistoryResponse,
PaddleResponseError,
PaddleResponseWrap,
RescheduleSubscriptionPaymentBody,
UpdateSubscriptionUserBody,
UpdateSubscriptionUserResponse,
PaddleResponseError,
} from './types';
import { VERSION } from './version';

Expand Down Expand Up @@ -481,6 +483,34 @@ s * @example
});
}

/**
* Get subscription modifiers.
*
* API documentation: https://developer.paddle.com/api-reference/f575ab89eb18c-list-modifiers
*
* @example
* const result = await client.getSubscriptionModifiers();
* const result = await client.getSubscriptionModifiers({ subscriptionID: 123 });
*/
getSubscriptionModifiers(options?: {
subscriptionID?: number;
planID?: number;
}) {
const { subscriptionID, planID } = options || {};

const body = {
...(subscriptionID && { subscription_id: String(subscriptionID) }),
...(planID && { plan_id: String(planID) }),
};

return this._request<
GetSubscriptionModifiersResponse,
GetSubscriptionModifiersBody
>('/subscription/modifiers', {
body,
});
}

/**
* Create a subscription modifier to dynamically change the subscription payment amount.
*
Expand Down
14 changes: 14 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,20 @@ export interface UpdateSubscriptionUserResponse {
next_payment: Payment;
}

export interface GetSubscriptionModifiersBody {
plan_id?: string;
subscription_id?: string;
}

export interface GetSubscriptionModifiersResponse {
modifier_id: number;
subscription_id: number;
amount: number;
currency: number;
is_recurring: boolean;
description: string;
}

export interface CreateSubscriptionModifierBody {
modifier_amount: number;
modifier_description?: string;
Expand Down

0 comments on commit ee831c5

Please sign in to comment.