From 0bb2ec23626b0d4694076549e183343ebf9b77a2 Mon Sep 17 00:00:00 2001 From: Lukasz Chmielewski Date: Wed, 10 Sep 2025 12:09:57 +0200 Subject: [PATCH] updated resp and logging --- src/modules/transaction/application/output.ts | 12 ++++++ .../process-transaction.use-case.ts | 13 ++++-- .../domain/services/webhook.service.ts | 2 +- .../interfaces/transaction.controller.ts | 26 +++++++++--- src/shared/clients/webhook/webhook.client.ts | 40 ++++++++++++++----- .../clients/webhook/webhook.interface.ts | 2 +- .../transaction/webhook.service.spec.ts | 2 +- 7 files changed, 77 insertions(+), 20 deletions(-) create mode 100644 src/modules/transaction/application/output.ts diff --git a/src/modules/transaction/application/output.ts b/src/modules/transaction/application/output.ts new file mode 100644 index 0000000..df390ef --- /dev/null +++ b/src/modules/transaction/application/output.ts @@ -0,0 +1,12 @@ +import { TransactionStatusEnum } from "../domain/validation/status"; + +export interface TransactionGatewayOutput { + transactionId: number; + transactionStatus: TransactionStatusEnum; +} + +export interface GatewayOutput { + status: number; + statusText: string; + data: TransactionGatewayOutput; +} diff --git a/src/modules/transaction/application/process-transaction-use-case/process-transaction.use-case.ts b/src/modules/transaction/application/process-transaction-use-case/process-transaction.use-case.ts index 62d249c..30ea435 100644 --- a/src/modules/transaction/application/process-transaction-use-case/process-transaction.use-case.ts +++ b/src/modules/transaction/application/process-transaction-use-case/process-transaction.use-case.ts @@ -1,4 +1,3 @@ -import { AxiosResponse } from "axios"; import { inject, injectable } from "tsyringe"; import { RegisteredServicesEnum } from "../../../../shared/DIcontainer/registeredServicesEnum"; import { BaseClass } from "../../../../shared/utils/log-prefix.class"; @@ -6,6 +5,7 @@ import { Logger } from "../../../../shared/utils/logger"; import { TransactionService } from "../../domain/services/transaction.service"; import { WebhookService } from "../../domain/services/webhook.service"; import { TransactionInput } from "../input"; +import { GatewayOutput } from "../output"; @injectable() export class ProcessTransactionUseCase extends BaseClass { @@ -23,7 +23,7 @@ export class ProcessTransactionUseCase extends BaseClass { public async run( input: TransactionInput, webhookUrl: string - ): Promise { + ): Promise { this.appLogger.info( `${this.logPrefix} processing ${JSON.stringify(input)}` ); @@ -35,6 +35,13 @@ export class ProcessTransactionUseCase extends BaseClass { this.appLogger.info( `${this.logPrefix} received the ${resp.status}: ${resp.statusText}` ); - return resp; + return { + status: resp.status, + statusText: resp.statusText, + data: { + transactionId: transaction.id, + transactionStatus: transaction.status, + }, + }; } } diff --git a/src/modules/transaction/domain/services/webhook.service.ts b/src/modules/transaction/domain/services/webhook.service.ts index 146b5fd..be53e6b 100644 --- a/src/modules/transaction/domain/services/webhook.service.ts +++ b/src/modules/transaction/domain/services/webhook.service.ts @@ -59,7 +59,7 @@ export class WebhookService extends BaseClass { private buildPayload(transaction: Transaction): WebhookPayload { return { - transactionId: transaction.id, + id: transaction.id, amount: transaction.amount, currency: transaction.currency, status: transaction.status, diff --git a/src/modules/transaction/interfaces/transaction.controller.ts b/src/modules/transaction/interfaces/transaction.controller.ts index 9eb2080..0f8c3ee 100644 --- a/src/modules/transaction/interfaces/transaction.controller.ts +++ b/src/modules/transaction/interfaces/transaction.controller.ts @@ -7,6 +7,7 @@ import { HttpMethodEnum } from "../../../shared/types/http-methods"; import { ValidationError } from "../../../shared/utils/error"; import { BaseClass } from "../../../shared/utils/log-prefix.class"; import { Logger } from "../../../shared/utils/logger"; +import { GatewayOutput } from "../application/output"; import { ProcessTransactionUseCase } from "../application/process-transaction-use-case/process-transaction.use-case"; import { CURRENCY_TYPE } from "../domain/validation/currency"; import { TRANSACTION_STATUS_TYPE } from "../domain/validation/status"; @@ -29,22 +30,36 @@ export class TransactionController extends BaseClass { ): Promise => { try { this.appLogger.info( - `${this.logPrefix} - ${req.url} - Processing transaction: ${req.body}` + `${this.logPrefix} - ${ + req.webhookUrl + } - Processing transaction: ${JSON.stringify(req.safeFields, null, 2)}` ); const input = req.safeFields!; const webhookUrl = req.webhookUrl!; this.appLogger.info( `${this.logPrefix} - ${req.url} - Using webhook URL: ${webhookUrl}` ); - const result = await this.processTransactionUseCase.run( + const result: GatewayOutput = await this.processTransactionUseCase.run( input, webhookUrl ); - resp.status(HttpStatusCode.Ok).send({ result }); + this.appLogger.info( + `${this.logPrefix} - ${req.url} - Sending result: ${JSON.stringify( + result + )}` + ); + resp.status(HttpStatusCode.Ok).send({ + result, + }); } catch (error) { this.appLogger.error( - `[${this.constructor.name}] Error processing health check request: ${error}` + `[${this.logPrefix}] Error processing health check request: ${ + error instanceof Error ? error.message : String(error) + }` ); + if (error instanceof Error && error.stack) { + this.appLogger.error(error.stack); + } next(error); } }; @@ -96,8 +111,9 @@ export class TransactionController extends BaseClass { } catch (err) { if (err instanceof Error) { next(new ValidationError(err)); + } else { + next(err); } - next(err); } }; diff --git a/src/shared/clients/webhook/webhook.client.ts b/src/shared/clients/webhook/webhook.client.ts index 635e93e..c10cda3 100644 --- a/src/shared/clients/webhook/webhook.client.ts +++ b/src/shared/clients/webhook/webhook.client.ts @@ -1,4 +1,4 @@ -import axios, { AxiosResponse, HttpStatusCode } from "axios"; +import axios, { AxiosResponse } from "axios"; import { inject, injectable } from "tsyringe"; import { RegisteredServicesEnum } from "../../DIcontainer/registeredServicesEnum"; import { BaseClass } from "../../utils/log-prefix.class"; @@ -19,17 +19,39 @@ export class WebhookClient extends BaseClass { `${this.logPrefix} Sending request to Token Wallet Service at ${meta.webhookUrl}` ); - const resp = await axios.post(meta.webhookUrl, meta.payload); + try { + const resp = await axios.post(meta.webhookUrl, meta.payload); - this.appLogger.info( - `${this.logPrefix} Received response with status: ${resp.status}` - ); + this.appLogger.info( + `${this.logPrefix} Received response with status: ${resp.status}` + ); - if (resp.status !== HttpStatusCode.Ok) { - throw new Error( - `${this.logPrefix} Failed to send webhook: ${resp.statusText}` + // Log the response body for debugging + this.appLogger.info( + `${this.logPrefix} Response body: ${JSON.stringify(resp.data)}` ); + + return resp; + } catch (error: any) { + this.appLogger.error( + `${this.logPrefix} Error sending webhook request: ${error.message}` + ); + + // If it's an axios error with response, return the response + if (error.response) { + this.appLogger.info( + `${this.logPrefix} Received error response with status: ${error.response.status}` + ); + this.appLogger.info( + `${this.logPrefix} Error response body: ${JSON.stringify( + error.response.data + )}` + ); + return error.response; + } + + // If it's a network error or other issue, re-throw + throw error; } - return resp; } } diff --git a/src/shared/clients/webhook/webhook.interface.ts b/src/shared/clients/webhook/webhook.interface.ts index 19755a4..ae0a8c2 100644 --- a/src/shared/clients/webhook/webhook.interface.ts +++ b/src/shared/clients/webhook/webhook.interface.ts @@ -2,7 +2,7 @@ import { CurrencyEnum } from "../../../modules/transaction/domain/validation/cur import { TransactionStatusEnum } from "../../../modules/transaction/domain/validation/status"; export interface WebhookPayload { - transactionId: number; + id: number; status: TransactionStatusEnum; amount: number; currency: CurrencyEnum; diff --git a/tests/modules/transaction/webhook.service.spec.ts b/tests/modules/transaction/webhook.service.spec.ts index ef5ae67..5e067f7 100644 --- a/tests/modules/transaction/webhook.service.spec.ts +++ b/tests/modules/transaction/webhook.service.spec.ts @@ -58,7 +58,7 @@ describe("WebhookService", () => { new Date() ); const payload = (service as any).buildPayload(tx); - expect(payload.transactionId).toBe(1); + expect(payload.id).toBe(1); expect(payload.amount).toBe(100); }); });