Skip to content

Commit 7849165

Browse files
committed
PM-1099 - pr feedback
1 parent d61eac9 commit 7849165

File tree

7 files changed

+73
-41
lines changed

7 files changed

+73
-41
lines changed

src/api/webhooks/trolley/handlers/payment.handler.ts

+17-10
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { Injectable, Logger } from '@nestjs/common';
22
import {
33
PaymentProcessedEventData,
4+
PaymentProcessedEventStatus,
45
PaymentWebhookEvent,
56
} from './payment.types';
67
import { WebhookEvent } from '../../webhooks.decorators';
78
import { PaymentsService } from 'src/shared/payments';
89
import { payment_status } from '@prisma/client';
910
import { PrismaService } from 'src/shared/global/prisma.service';
11+
import { JsonObject } from '@prisma/client/runtime/library';
1012

1113
@Injectable()
1214
export class PaymentHandler {
@@ -35,12 +37,13 @@ export class PaymentHandler {
3537
);
3638
}
3739

38-
if (payload.status !== 'processed') {
40+
if (payload.status !== PaymentProcessedEventStatus.PROCESSED) {
3941
await this.updatePaymentStates(
4042
winningIds,
4143
externalTransactionId,
4244
payload.status.toUpperCase() as payment_status,
4345
payload.status.toUpperCase(),
46+
{ failureMessage: payload.failureMessage },
4447
);
4548

4649
return;
@@ -59,9 +62,10 @@ export class PaymentHandler {
5962
paymentId: string,
6063
processingState: payment_status,
6164
releaseState: string,
65+
metadata?: JsonObject,
6266
): Promise<void> {
63-
await this.prisma.$transaction(async (tx) => {
64-
try {
67+
try {
68+
await this.prisma.$transaction(async (tx) => {
6569
await this.paymentsService.updatePaymentProcessingState(
6670
winningIds,
6771
processingState,
@@ -71,13 +75,16 @@ export class PaymentHandler {
7175
await this.paymentsService.updatePaymentReleaseState(
7276
paymentId,
7377
releaseState,
78+
tx,
79+
metadata,
7480
);
75-
} catch (error) {
76-
this.logger.error(
77-
`Failed to update payment statuses: ${error.message}`,
78-
);
79-
throw error;
80-
}
81-
});
81+
});
82+
} catch (error) {
83+
this.logger.error(
84+
`Failed to update payment states for paymentId: ${paymentId}, winnings: ${winningIds.join(',')}, error: ${error.message}`,
85+
error.stack,
86+
);
87+
throw error;
88+
}
8289
}
8390
}

src/api/webhooks/trolley/handlers/payment.types.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@ export enum PaymentWebhookEvent {
44
returned = 'payment.returned',
55
}
66

7+
export enum PaymentProcessedEventStatus {
8+
PROCESSED = 'processed',
9+
FAILED = 'failed',
10+
RETURNED = 'returned',
11+
}
12+
713
export interface PaymentProcessedEventData {
814
id: string;
915
recipient: {
1016
id: string;
1117
referenceId: string;
1218
email: string;
1319
};
14-
status: 'processed' | 'failed' | 'returned';
20+
status: PaymentProcessedEventStatus;
1521
externalId?: string;
1622
sourceAmount: string; // gross amount
1723
fees: string;

src/api/webhooks/trolley/trolley.service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ if (!trolleyWhHmac) {
2020
*/
2121
@Injectable()
2222
export class TrolleyService {
23-
private readonly logger = new Logger('Webhooks/TolleyService');
23+
private readonly logger = new Logger('Webhooks/TrolleyService');
2424

2525
constructor(
2626
@Inject('trolleyHandlerFns')

src/api/withdrawal/withdrawal.controller.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export class WithdrawalController {
4040
})
4141
@ApiResponse({
4242
status: 200,
43-
description: 'Get wallet detail successfully.',
43+
description: 'Operation successful.',
4444
type: ResponseDto<string>,
4545
})
4646
@HttpCode(HttpStatus.OK)

src/api/withdrawal/withdrawal.service.ts

+35-23
Original file line numberDiff line numberDiff line change
@@ -143,37 +143,49 @@ export class WithdrawalService {
143143
);
144144
} catch (e) {
145145
this.logger.error(
146-
`Failed to update payment processing state: ${e.message}`,
146+
`Failed to update payment processing state: ${e.message} for winnings '${winningsIds.join(',')}`,
147147
);
148148
throw new Error('Failed to update payment processing state!');
149149
}
150150

151-
const paymentRelease = await tx.payment_releases.create({
152-
data: {
153-
user_id: userId,
154-
total_net_amount: totalAmount,
155-
status: payment_status.PROCESSING,
156-
payment_method_id: hasVerifiedPaymentMethod.payment_method_id,
157-
payee_id: recipient.trolley_id,
158-
external_transaction_id: paymentBatch.id,
159-
payment_release_associations: {
160-
createMany: {
161-
data: winnings.map((w) => ({
162-
payment_id: w.paymentId,
163-
})),
151+
try {
152+
const paymentRelease = await tx.payment_releases.create({
153+
data: {
154+
user_id: userId,
155+
total_net_amount: totalAmount,
156+
status: payment_status.PROCESSING,
157+
payment_method_id: hasVerifiedPaymentMethod.payment_method_id,
158+
payee_id: recipient.trolley_id,
159+
external_transaction_id: paymentBatch.id,
160+
payment_release_associations: {
161+
createMany: {
162+
data: winnings.map((w) => ({
163+
payment_id: w.paymentId,
164+
})),
165+
},
164166
},
165167
},
166-
},
167-
});
168-
this.logger.log(
169-
`Payment release created successfully. ID: ${paymentRelease.payment_release_id}`,
170-
);
168+
});
169+
this.logger.log(
170+
`Payment release created successfully. ID: ${paymentRelease.payment_release_id}`,
171+
);
172+
} catch (error) {
173+
this.logger.error(`Failed to create payment release: ${error.message}`);
174+
throw new Error('Failed to create db entry for payment release!');
175+
}
171176

172-
// generate quote
173-
await this.trolleyService.client.batch.generateQuote(paymentBatch.id);
177+
try {
178+
// generate quote
179+
await this.trolleyService.client.batch.generateQuote(paymentBatch.id);
174180

175-
// trigger trolley payment (batch) process
176-
await this.trolleyService.client.batch.startProcessing(paymentBatch.id);
181+
// trigger trolley payment (batch) process
182+
await this.trolleyService.client.batch.startProcessing(paymentBatch.id);
183+
} catch (error) {
184+
this.logger.error(
185+
`Failed to process trolley payment batch: ${error.message}`,
186+
);
187+
throw new Error('Failed to process trolley payment batch!');
188+
}
177189
});
178190
}
179191
}

src/shared/global/trolley.service.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import url from 'url';
22
import crypto from 'crypto';
33
import trolley, { Batch } from 'trolleyhq';
4-
import { Injectable } from '@nestjs/common';
4+
import { Injectable, Logger } from '@nestjs/common';
55
import { ENV_CONFIG } from 'src/config';
66

77
const TROLLEY_ACCESS_KEY = ENV_CONFIG.TROLLEY_ACCESS_KEY;
@@ -15,6 +15,8 @@ const client = trolley({
1515

1616
@Injectable()
1717
export class TrolleyService {
18+
private readonly logger = new Logger(`global/TrolleyService`);
19+
1820
get client() {
1921
return client;
2022
}
@@ -68,9 +70,11 @@ export class TrolleyService {
6870
[],
6971
);
7072

71-
console.info(`Created payment batch with id ${paymentBatch.id}`);
73+
this.logger.debug(`Created payment batch with id ${paymentBatch.id}`);
7274
} catch (e) {
73-
console.error(`Failed to create batch payment, error '${e.message}'!`);
75+
this.logger.error(
76+
`Failed to create batch payment, error '${e.message}'!`,
77+
);
7478
return;
7579
}
7680

@@ -87,11 +91,11 @@ export class TrolleyService {
8791
externalId: `${winningsIds.join(',')},${Date.now()}`,
8892
});
8993

90-
console.info(`Created payment with id ${payment.id}`);
94+
this.logger.debug(`Created payment with id ${payment.id}`);
9195

9296
return paymentBatch;
9397
} catch (e) {
94-
console.error(`Failed to create payment, error '${e.message}'!`);
98+
this.logger.error(`Failed to create payment, error '${e.message}'!`);
9599
}
96100
}
97101
}

src/shared/payments/payments.service.ts

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Injectable } from '@nestjs/common';
2+
import { JsonObject } from '@prisma/client/runtime/library';
23
import { PrismaService } from '../global/prisma.service';
34
import { payment_status, Prisma } from '@prisma/client';
45
import { uniq } from 'lodash';
@@ -134,6 +135,7 @@ export class PaymentsService {
134135
externalTransactionId: string,
135136
status: string,
136137
transaction?: Prisma.TransactionClient,
138+
metadata?: JsonObject,
137139
) {
138140
const prismaClient = transaction || this.prisma;
139141
try {
@@ -143,6 +145,7 @@ export class PaymentsService {
143145
},
144146
data: {
145147
status,
148+
metadata,
146149
},
147150
});
148151

0 commit comments

Comments
 (0)