Skip to content

Commit

Permalink
feat(Transaction): Added transactions.revise operation (#100)
Browse files Browse the repository at this point in the history
  • Loading branch information
vijayasingam-paddle authored Jan 21, 2025
1 parent 9b9902c commit 6468561
Show file tree
Hide file tree
Showing 9 changed files with 89 additions and 1 deletion.
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,18 @@ When we make [non-breaking changes](https://developer.paddle.com/api-reference/a

This means when upgrading minor versions of the SDK, you may notice type errors. You can safely ignore these or fix by adding additional type guards.

## 2.4.0 - 2025-01-21

### Added

- Added `transactions.revise` operation to revise a transaction and added `revisedAt` to `Transaction` entity, see [related changelog](https://developer.paddle.com/changelog/2024/revise-transaction-customer-information?utm_source=dx&utm_medium=paddle-node-sdk).

### Changed

- Dependabot updates

---

## 2.3.2 - 2025-01-06

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@paddle/paddle-node-sdk",
"version": "2.3.2",
"version": "2.4.0",
"description": "A Node.js SDK that you can use to integrate Paddle Billing with applications written in server-side JavaScript.",
"main": "dist/cjs/index.cjs.node.js",
"module": "dist/esm/index.esm.node.js",
Expand Down
18 changes: 18 additions & 0 deletions src/__tests__/mocks/resources/transactions.mock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import {
CreateTransactionRequestBody,
ReviseTransactionRequestBody,
TransactionPreviewRequestBody,
UpdateTransactionRequestBody,
} from '../../../resources/index.js';
Expand Down Expand Up @@ -62,6 +63,22 @@ export const UpdateTransactionMock: UpdateTransactionRequestBody = {
checkout: { url: 'NO_VALUE' },
};

export const ReviseTransactionMock: ReviseTransactionRequestBody = {
address: {
firstLine: '3811 Ditmars Blvd',
secondLine: 'Suite 435',
city: 'Astoria',
region: 'NY',
},
business: {
name: 'Maryjane',
taxIdentifier: 'AB0123456789',
},
customer: {
name: 'Maryjane',
},
};

export const CreateTransactionExpectation = {
status: 'draft',
customer_id: 'ctm_01grnn4zta5a1mf02jjze7y2ys',
Expand Down Expand Up @@ -269,6 +286,7 @@ export const TransactionMock: ITransactionResponse = {
created_at: '2024-10-12T07:20:50.52Z',
updated_at: '2024-10-13T07:20:50.52Z',
billed_at: '2024-10-12T07:20:50.52Z',
revised_at: '2024-10-12T07:20:50.52Z',
adjustments: [
{
action: 'credit',
Expand Down
16 changes: 16 additions & 0 deletions src/__tests__/resources/transactions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
CreateTransactionMock,
ListTransactionMockResponse,
PreviewTransactionMock,
ReviseTransactionMock,
TransactionMock,
TransactionMockResponse,
TransactionPreviewMockResponse,
Expand All @@ -20,6 +21,7 @@ import {
CreateTransactionRequestBody,
GetTransactionQueryParameters,
ListTransactionQueryParameters,
ReviseTransactionRequestBody,
TransactionsResource,
UpdateTransactionRequestBody,
} from '../../resources/index.js';
Expand Down Expand Up @@ -144,4 +146,18 @@ describe('TransactionsResource', () => {
expect(paddleInstance.post).toBeCalledWith(`/transactions/preview`, PreviewTransactionMock);
expect(updatedTransaction).toBeDefined();
});

test('should be able to revise an existing transaction', async () => {
const transactionId = TransactionMock.id;
const transactionToBeRevised: ReviseTransactionRequestBody = ReviseTransactionMock;

const paddleInstance = getPaddleTestClient();
paddleInstance.post = jest.fn().mockResolvedValue(TransactionMockResponse);

const transactionsResource = new TransactionsResource(paddleInstance);
const revisedTransaction = await transactionsResource.revise(transactionId, transactionToBeRevised);

expect(paddleInstance.post).toBeCalledWith(`/transactions/${transactionId}/revise`, transactionToBeRevised);
expect(revisedTransaction).toBeDefined();
});
});
2 changes: 2 additions & 0 deletions src/entities/transaction/transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ export class Transaction {
public readonly createdAt: string;
public readonly updatedAt: string;
public readonly billedAt: string | null;
public readonly revisedAt: string | null;
public readonly address: Address | null;
public readonly adjustments: TransactionAdjustment[] | null;
public readonly adjustmentsTotals: AdjustmentTotals | null;
Expand Down Expand Up @@ -82,6 +83,7 @@ export class Transaction {
this.createdAt = transaction.created_at;
this.updatedAt = transaction.updated_at;
this.billedAt = transaction.billed_at ? transaction.billed_at : null;
this.revisedAt = transaction.revised_at ? transaction.revised_at : null;
this.address = transaction.address ? new Address(transaction.address) : null;
this.adjustments = transaction.adjustments
? transaction.adjustments?.map((adjustment) => new TransactionAdjustment(adjustment))
Expand Down
17 changes: 17 additions & 0 deletions src/resources/transactions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
type GetTransactionInvoicePdfQueryParameters,
type GetTransactionQueryParameters,
type ListTransactionQueryParameters,
type ReviseTransactionRequestBody,
type TransactionPreviewRequestBody,
type UpdateTransactionQueryParameters,
type UpdateTransactionRequestBody,
Expand All @@ -30,6 +31,7 @@ const TransactionPaths = {
update: '/transactions/{transaction_id}',
getInvoicePDF: '/transactions/{transaction_id}/invoice',
preview: '/transactions/preview',
revise: '/transactions/{transaction_id}/revise',
} as const;

export * from './operations/index.js';
Expand Down Expand Up @@ -120,4 +122,19 @@ export class TransactionsResource extends BaseResource {

return new TransactionPreview(data);
}

public async revise(transactionId: string, reviseTransaction: ReviseTransactionRequestBody): Promise<Transaction> {
const urlWithPathParams = new PathParameters(TransactionPaths.revise, {
transaction_id: transactionId,
}).deriveUrl();

const response = await this.client.post<
ReviseTransactionRequestBody,
Response<ITransactionResponse> | ErrorResponse
>(urlWithPathParams, reviseTransaction);

const data = this.handleResponse<ITransactionResponse>(response);

return new Transaction(data);
}
}
1 change: 1 addition & 0 deletions src/resources/transactions/operations/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ export * from './get-transaction-query-parameters.js';
export * from './update-transaction-request-body.js';
export * from './transaction-preview-request-body.js';
export * from './get-transaction-invoice-pdf-query-parameters.js';
export * from './revise-transaction-request-body.js';
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/**
* ! Autogenerated code !
* Do not make changes to this file.
* Changes may be overwritten as part of auto-generation.
*/

export interface ReviseTransactionRequestBody {
customer?: {
name?: string;
};
business?: {
name?: string;
taxIdentifier?: string;
};
address?: {
firstLine?: string;
secondLine?: string | null;
city?: string;
region?: string;
};
}
1 change: 1 addition & 0 deletions src/types/transaction/transaction-response.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export interface ITransactionResponse {
created_at: string;
updated_at: string;
billed_at?: string | null;
revised_at?: string | null;
address?: IAddressResponse | null;
adjustments?: ITransactionAdjustmentResponse[] | null;
adjustments_totals?: IAdjustmentTotalsResponse | null;
Expand Down

0 comments on commit 6468561

Please sign in to comment.