diff --git a/enabler/package-lock.json b/enabler/package-lock.json index 2de7f7a..bb44271 100644 --- a/enabler/package-lock.json +++ b/enabler/package-lock.json @@ -1,12 +1,12 @@ { "name": "enabler", - "version": "2.0.1", + "version": "3.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "enabler", - "version": "2.0.1", + "version": "3.0.3", "dependencies": { "@adyen/adyen-web": "5.62.0", "serve": "14.2.1" diff --git a/enabler/package.json b/enabler/package.json index 7b23bdb..511d7b2 100644 --- a/enabler/package.json +++ b/enabler/package.json @@ -1,7 +1,7 @@ { "name": "enabler", "private": true, - "version": "3.0.2", + "version": "3.0.3", "type": "module", "scripts": { "dev": "vite --port 3000", diff --git a/processor/package-lock.json b/processor/package-lock.json index 01e78bb..d7d8b71 100644 --- a/processor/package-lock.json +++ b/processor/package-lock.json @@ -1,17 +1,17 @@ { "name": "payment-integration-adyen", - "version": "3.0.0", + "version": "3.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "payment-integration-adyen", - "version": "3.0.0", + "version": "3.0.3", "license": "ISC", "dependencies": { "@adyen/api-library": "16.2.0", "@commercetools-backend/loggers": "22.23.2", - "@commercetools/connect-payments-sdk": "0.4.2", + "@commercetools/connect-payments-sdk": "0.4.3", "@fastify/autoload": "5.8.0", "@fastify/cors": "9.0.1", "@fastify/formbody": "7.4.0", @@ -813,22 +813,22 @@ } }, "node_modules/@commercetools/connect-payments-sdk": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@commercetools/connect-payments-sdk/-/connect-payments-sdk-0.4.2.tgz", - "integrity": "sha512-l9+Wzx2BBYrsemHq51OAb7Xdg/OZUU7t3ShbHvzX39gUQLGWBc2Cvx2Z1uV+CPK3xdzzdJKByOwijtOaisT+BA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@commercetools/connect-payments-sdk/-/connect-payments-sdk-0.4.3.tgz", + "integrity": "sha512-tMBfpRr9J+ScjXJ0iKFj5+PDpVelGY4sd9S/GP1mUQwPfRwQDt9KO58nw3VAOQr3p0eiJMac/z8Qlbh1ngoV6Q==", "dependencies": { - "@commercetools/platform-sdk": "7.6.0", - "@commercetools/sdk-client-v2": "2.4.0", + "@commercetools/platform-sdk": "7.7.0", + "@commercetools/sdk-client-v2": "2.4.1", "jsonwebtoken": "9.0.2", "jwks-rsa": "3.1.0" } }, "node_modules/@commercetools/platform-sdk": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@commercetools/platform-sdk/-/platform-sdk-7.6.0.tgz", - "integrity": "sha512-YPxrziC7ZsAG7IVcbzN1u2Zgd2WdWBdWYNlubsnvkaZgf/F45Fv47JvPpZbOfCxssNb+5mags2FskfCGaJCYNw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@commercetools/platform-sdk/-/platform-sdk-7.7.0.tgz", + "integrity": "sha512-9RpgjwYOAFhKKWLKaefXfWoz8siC3gH4inOhHYVVcIhQm8pkRX5dLbNLOE/AX7FpatcTHX65ws9OHuifHh+Quw==", "dependencies": { - "@commercetools/sdk-client-v2": "^2.4.0", + "@commercetools/sdk-client-v2": "^2.4.1", "@commercetools/sdk-middleware-auth": "^7.0.0", "@commercetools/sdk-middleware-http": "^7.0.0", "@commercetools/sdk-middleware-logger": "^3.0.0", @@ -839,9 +839,9 @@ } }, "node_modules/@commercetools/sdk-client-v2": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@commercetools/sdk-client-v2/-/sdk-client-v2-2.4.0.tgz", - "integrity": "sha512-EEp8lPcBSPOsozGydWtF3llLmb83G2ILtep7UQ+uvAztfMYgjYLUI2MfYlVfjbVoZKbWTfmW2Ed69UQ6lwYCng==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@commercetools/sdk-client-v2/-/sdk-client-v2-2.4.1.tgz", + "integrity": "sha512-zhsQz8dN/6D+kLyO8xX2SLppf3VcP0AWc80abmGwY2k1c+psb7s9xCCRZC553X+CZP8Z+2ajZ5PjTHnZxVMSjQ==", "dependencies": { "buffer": "^6.0.3", "node-fetch": "^2.6.1" @@ -2109,9 +2109,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -2215,9 +2215,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.12", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", - "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==" + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" }, "node_modules/@types/range-parser": { "version": "1.2.7", @@ -2240,13 +2240,13 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/stack-utils": { @@ -9870,22 +9870,22 @@ } }, "@commercetools/connect-payments-sdk": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@commercetools/connect-payments-sdk/-/connect-payments-sdk-0.4.2.tgz", - "integrity": "sha512-l9+Wzx2BBYrsemHq51OAb7Xdg/OZUU7t3ShbHvzX39gUQLGWBc2Cvx2Z1uV+CPK3xdzzdJKByOwijtOaisT+BA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@commercetools/connect-payments-sdk/-/connect-payments-sdk-0.4.3.tgz", + "integrity": "sha512-tMBfpRr9J+ScjXJ0iKFj5+PDpVelGY4sd9S/GP1mUQwPfRwQDt9KO58nw3VAOQr3p0eiJMac/z8Qlbh1ngoV6Q==", "requires": { - "@commercetools/platform-sdk": "7.6.0", - "@commercetools/sdk-client-v2": "2.4.0", + "@commercetools/platform-sdk": "7.7.0", + "@commercetools/sdk-client-v2": "2.4.1", "jsonwebtoken": "9.0.2", "jwks-rsa": "3.1.0" } }, "@commercetools/platform-sdk": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@commercetools/platform-sdk/-/platform-sdk-7.6.0.tgz", - "integrity": "sha512-YPxrziC7ZsAG7IVcbzN1u2Zgd2WdWBdWYNlubsnvkaZgf/F45Fv47JvPpZbOfCxssNb+5mags2FskfCGaJCYNw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@commercetools/platform-sdk/-/platform-sdk-7.7.0.tgz", + "integrity": "sha512-9RpgjwYOAFhKKWLKaefXfWoz8siC3gH4inOhHYVVcIhQm8pkRX5dLbNLOE/AX7FpatcTHX65ws9OHuifHh+Quw==", "requires": { - "@commercetools/sdk-client-v2": "^2.4.0", + "@commercetools/sdk-client-v2": "^2.4.1", "@commercetools/sdk-middleware-auth": "^7.0.0", "@commercetools/sdk-middleware-http": "^7.0.0", "@commercetools/sdk-middleware-logger": "^3.0.0", @@ -9893,9 +9893,9 @@ } }, "@commercetools/sdk-client-v2": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@commercetools/sdk-client-v2/-/sdk-client-v2-2.4.0.tgz", - "integrity": "sha512-EEp8lPcBSPOsozGydWtF3llLmb83G2ILtep7UQ+uvAztfMYgjYLUI2MfYlVfjbVoZKbWTfmW2Ed69UQ6lwYCng==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@commercetools/sdk-client-v2/-/sdk-client-v2-2.4.1.tgz", + "integrity": "sha512-zhsQz8dN/6D+kLyO8xX2SLppf3VcP0AWc80abmGwY2k1c+psb7s9xCCRZC553X+CZP8Z+2ajZ5PjTHnZxVMSjQ==", "requires": { "buffer": "^6.0.3", "node-fetch": "^2.6.1" @@ -10930,9 +10930,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", "requires": { "@types/node": "*", "@types/qs": "*", @@ -11036,9 +11036,9 @@ } }, "@types/qs": { - "version": "6.9.12", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", - "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==" + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" }, "@types/range-parser": { "version": "1.2.7", @@ -11061,13 +11061,13 @@ } }, "@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "requires": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "@types/stack-utils": { diff --git a/processor/package.json b/processor/package.json index aeeb83f..0d39972 100644 --- a/processor/package.json +++ b/processor/package.json @@ -1,6 +1,6 @@ { "name": "payment-integration-adyen", - "version": "3.0.2", + "version": "3.0.3", "description": "Payment integration with Adyen", "main": "dist/server.js", "scripts": { @@ -21,7 +21,7 @@ "dependencies": { "@adyen/api-library": "16.2.0", "@commercetools-backend/loggers": "22.23.2", - "@commercetools/connect-payments-sdk": "0.4.2", + "@commercetools/connect-payments-sdk": "0.4.3", "@fastify/autoload": "5.8.0", "@fastify/cors": "9.0.1", "@fastify/formbody": "7.4.0", diff --git a/processor/src/errors/adyen-api.error.ts b/processor/src/errors/adyen-api.error.ts index cc9a849..c53c367 100644 --- a/processor/src/errors/adyen-api.error.ts +++ b/processor/src/errors/adyen-api.error.ts @@ -17,3 +17,19 @@ export class AdyenApiError extends Errorx { }); } } + +export type UnsupportedNotificationErrorData = { + notificationEvent: string; +}; + +export class UnsupportedNotificationError extends Errorx { + constructor(errorData: UnsupportedNotificationErrorData, additionalOpts?: ErrorxAdditionalOpts) { + super({ + code: 'UnsupportedNotification', + httpErrorStatus: 400, + message: `Unsupported notification event: ${errorData.notificationEvent}`, + skipLog: true, + ...additionalOpts, + }); + } +} diff --git a/processor/src/services/adyen-payment.service.ts b/processor/src/services/adyen-payment.service.ts index c8df0fe..a7c8a2c 100644 --- a/processor/src/services/adyen-payment.service.ts +++ b/processor/src/services/adyen-payment.service.ts @@ -6,6 +6,7 @@ import { statusHandler, Cart, Payment, + UpdatePayment, } from '@commercetools/connect-payments-sdk'; import { ConfirmPaymentRequestDTO, @@ -49,6 +50,7 @@ import { PaymentDetailsResponse } from '@adyen/api-library/lib/src/typings/check import { CancelPaymentConverter } from './converters/cancel-payment.converter'; import { RefundPaymentConverter } from './converters/refund-payment.converter'; import { log } from '../libs/logger'; +import { UnsupportedNotificationError } from '../errors/adyen-api.error'; const packageJSON = require('../../package.json'); export type AdyenPaymentServiceOptions = { @@ -336,7 +338,19 @@ export class AdyenPaymentService extends AbstractPaymentService { public async processNotification(opts: { data: NotificationRequestDTO }): Promise { log.info('Processing notification', { notification: JSON.stringify(opts.data) }); - const updateData = await this.notificationConverter.convert(opts); + let updateData!: UpdatePayment; + + try { + updateData = await this.notificationConverter.convert(opts); + } catch (e) { + if (e instanceof UnsupportedNotificationError) { + log.info('Unsupported notification received', { notification: JSON.stringify(opts.data) }); + return; + } + log.error('Error processing notification', { error: e }); + throw e; + } + const updatedPayment = await this.ctPaymentService.updatePayment(updateData); log.info('Payment updated after processing the notification', { paymentId: updatedPayment.id, diff --git a/processor/src/services/converters/notification.converter.ts b/processor/src/services/converters/notification.converter.ts index 4bb63b4..84ffba3 100644 --- a/processor/src/services/converters/notification.converter.ts +++ b/processor/src/services/converters/notification.converter.ts @@ -1,6 +1,7 @@ import { NotificationRequestItem } from '@adyen/api-library/lib/src/typings/notification/notificationRequestItem'; import { NotificationRequestDTO } from '../../dtos/adyen-payment.dto'; import { TransactionData, UpdatePayment, Money } from '@commercetools/connect-payments-sdk'; +import { UnsupportedNotificationError } from '../../errors/adyen-api.error'; export class NotificationConverter { constructor() {} @@ -10,7 +11,7 @@ export class NotificationConverter { return { id: item.merchantReference, - pspReference: item.pspReference, + pspReference: item.originalReference || item.pspReference, transaction: this.populateTransaction(item), }; } @@ -67,8 +68,7 @@ export class NotificationConverter { interactionId: item.pspReference, }; default: - //TODO: throw unsupported notification error - throw new Error('Unsupported notification'); + throw new UnsupportedNotificationError({ notificationEvent: item.eventCode.toString() }); } }