From 8692c00568121fe26cbe086656556f8f9fc9a785 Mon Sep 17 00:00:00 2001 From: shani Date: Mon, 28 Oct 2024 14:37:20 +0100 Subject: [PATCH] feat(SFI-958): create analytics event for all adyen routes --- .../adyen_checkout/checkoutConfiguration.js | 10 +- .../adyen_checkout/renderGiftcardComponent.js | 5 +- .../adyen/analytics/analyticsHook.js | 101 ++++++++++++++++++ .../cartridge/adyen/scripts/hooks.json | 4 + .../payments/adyenGetPaymentMethods.js | 16 --- .../cartridge/adyen/utils/adyenConfigs.js | 2 +- .../cartridge/adyen/utils/adyenHelper.js | 3 - 7 files changed, 112 insertions(+), 29 deletions(-) create mode 100644 src/cartridges/int_adyen_SFRA/cartridge/adyen/analytics/analyticsHook.js diff --git a/src/cartridges/app_adyen_SFRA/cartridge/client/default/js/adyen_checkout/checkoutConfiguration.js b/src/cartridges/app_adyen_SFRA/cartridge/client/default/js/adyen_checkout/checkoutConfiguration.js index 0f428d3950..d2c968fcf8 100644 --- a/src/cartridges/app_adyen_SFRA/cartridge/client/default/js/adyen_checkout/checkoutConfiguration.js +++ b/src/cartridges/app_adyen_SFRA/cartridge/client/default/js/adyen_checkout/checkoutConfiguration.js @@ -192,9 +192,8 @@ function getGiftCardConfig() { async: false, success: (data) => { giftcardBalance = data.balance; - document.querySelector( - 'button[value="submit-payment"]', - ).disabled = false; + document.querySelector('button[value="submit-payment"]').disabled = + false; if (data.resultCode === constants.SUCCESS) { const { giftCardsInfoMessageContainer, @@ -220,9 +219,8 @@ function getGiftCardConfig() { initialPartialObject.totalDiscountedAmount; }); - document.querySelector( - 'button[value="submit-payment"]', - ).disabled = true; + document.querySelector('button[value="submit-payment"]').disabled = + true; giftCardsInfoMessageContainer.innerHTML = ''; giftCardsInfoMessageContainer.classList.remove( 'gift-cards-info-message-container', diff --git a/src/cartridges/app_adyen_SFRA/cartridge/client/default/js/adyen_checkout/renderGiftcardComponent.js b/src/cartridges/app_adyen_SFRA/cartridge/client/default/js/adyen_checkout/renderGiftcardComponent.js index dc16d61395..e2f73a19b0 100644 --- a/src/cartridges/app_adyen_SFRA/cartridge/client/default/js/adyen_checkout/renderGiftcardComponent.js +++ b/src/cartridges/app_adyen_SFRA/cartridge/client/default/js/adyen_checkout/renderGiftcardComponent.js @@ -98,9 +98,8 @@ function removeGiftCards() { giftCardsInfoMessageContainer.classList.remove( 'gift-cards-info-message-container', ); - document.querySelector( - 'button[value="submit-payment"]', - ).disabled = false; + document.querySelector('button[value="submit-payment"]').disabled = + false; if (res.resultCode === constants.RECEIVED) { document diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/analytics/analyticsHook.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/analytics/analyticsHook.js new file mode 100644 index 0000000000..d0b8bc659c --- /dev/null +++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/analytics/analyticsHook.js @@ -0,0 +1,101 @@ +const URLRedirectMgr = require('dw/web/URLRedirectMgr'); +const analyticsEvent = require('*/cartridge/adyen/analytics/analyticsEvents'); +const analyticsConstants = require('*/cartridge/adyen/analytics/constants'); +const constants = require('*/cartridge/adyen/config/constants'); +const { + isAdyenAnalyticsEnabled, +} = require('*/cartridge/adyen/utils/adyenConfigs'); + +function getPath(req) { + return req.path.split('/').pop().split('-'); +} + +function redirectUrlStartRule() { + const origin = URLRedirectMgr.redirectOrigin; + return origin.match(constants.APPLE_DOMAIN_URL); +} + +function isUsedByAdyen(req) { + const path = getPath(req); + const allControllers = [ + { name: 'account', routes: [{ name: 'Show' }] }, + { name: 'adyen' }, + { name: 'cart', routes: [{ name: 'MiniCartShow' }] }, + { name: 'checkout', routes: [{ name: 'Begin' }] }, + { name: 'checkoutServices', routes: [{ name: 'PlaceOrder' }] }, + { name: 'order', routes: [{ name: 'Confirm' }] }, + { + name: 'paymentInstruments', + routes: [ + { name: 'AddPayment' }, + { name: 'SavePayment' }, + { name: 'DeletePayment' }, + ], + }, + { + name: 'redirectUrl', + routes: [{ name: 'Start', rule: redirectUrlStartRule }], + }, + ]; + return allControllers.some((controller) => { + if (path[0].toLowerCase() === controller.name.toLowerCase()) { + if (!controller.routes) { + return true; + } + const route = controller.routes.find( + (eachRoute) => path[1].toLowerCase() === eachRoute.name.toLowerCase(), + ); + if (typeof route?.rule === 'function') { + return !!route.rule(); + } + return !!route; + } + return false; + }); +} + +function registerRoute(route) { + route.on('route:Start', (req) => { + const path = getPath(req); + if (isUsedByAdyen(req) && isAdyenAnalyticsEnabled()) { + analyticsEvent.createAnalyticsEvent( + session.sessionID, + path.join('-'), + analyticsConstants.eventType.START, + analyticsConstants.eventStatus.EXPECTED, + analyticsConstants.eventCode.INFO, + ); + } + }); + + route.on('route:Complete', (req, res) => { + const path = getPath(req); + if (isUsedByAdyen(req) && isAdyenAnalyticsEnabled()) { + if (res.viewData.error) { + analyticsEvent.createAnalyticsEvent( + session.sessionID, + path.join('-'), + analyticsConstants.eventType.END, + analyticsConstants.eventStatus.UNEXPECTED, + analyticsConstants.eventCode.INFO, + ); + } else { + analyticsEvent.createAnalyticsEvent( + session.sessionID, + path.join('-'), + analyticsConstants.eventType.END, + analyticsConstants.eventStatus.EXPECTED, + analyticsConstants.eventCode.INFO, + ); + } + } + }); +} + +/* Module Exports */ +module.exports = { + registerRoute, + getPath, + redirectUrlStartRule, + isUsedByAdyen, +}; diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/hooks.json b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/hooks.json index b7f90c4eb8..2450d3344e 100644 --- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/hooks.json +++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/hooks.json @@ -15,6 +15,10 @@ { "name": "app.payment.form.processor.adyen_component", "script": "./hooks/payment/processor/adyen_component_form_processor" + }, + { + "name": "app.server.registerRoute", + "script": "../analytics/analyticsHook" } ] } diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenGetPaymentMethods.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenGetPaymentMethods.js index 17cbf7cd5b..829df9946b 100644 --- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenGetPaymentMethods.js +++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenGetPaymentMethods.js @@ -25,21 +25,12 @@ const AdyenConfigs = require('*/cartridge/adyen/utils/adyenConfigs'); const constants = require('*/cartridge/adyen/config/constants'); const blockedPayments = require('*/cartridge/adyen/config/blockedPaymentMethods.json'); const AdyenLogs = require('*/cartridge/adyen/logs/adyenCustomLogs'); -const analyticsEvent = require('*/cartridge/adyen/analytics/analyticsEvents'); -const analyticsConstants = require('*/cartridge/adyen/analytics/constants'); // eslint-disable-next-line complexity function getMethods(basket, customer, countryCode) { try { let paymentAmount; let currencyCode; - analyticsEvent.createAnalyticsEvent( - session.sessionID, - constants.SERVICE.CHECKOUTPAYMENTMETHODS, - analyticsConstants.eventType.START, - analyticsConstants.eventStatus.EXPECTED, - analyticsConstants.eventCode.INFO, - ); // paymentMethods call from checkout if (basket) { currencyCode = basket.currencyCode; @@ -89,13 +80,6 @@ function getMethods(basket, customer, countryCode) { paymentMethodsRequest, ); } catch (error) { - analyticsEvent.createAnalyticsEvent( - session.sessionID, - constants.SERVICE.CHECKOUTPAYMENTMETHODS, - analyticsConstants.eventType.END, - analyticsConstants.eventStatus.UNEXPECTED, - analyticsConstants.eventCode.INFO, - ); AdyenLogs.fatal_log('/paymentMethods call failed', error); return { error: true }; } diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenConfigs.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenConfigs.js index b36f78499d..c021c69d98 100644 --- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenConfigs.js +++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenConfigs.js @@ -183,7 +183,7 @@ const adyenConfigsObj = { return getCustomPreference('AdyenGiving_logoUrl')?.getAbsURL(); }, - getAdyenAnalyticsEnabled() { + isAdyenAnalyticsEnabled() { return getCustomPreference('AdyenAnalytics_Enabled'); }, }; diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js index 790a75bf93..63cce1325e 100644 --- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js +++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js @@ -38,8 +38,6 @@ const collections = require('*/cartridge/scripts/util/collections'); const constants = require('*/cartridge/adyen/config/constants'); const AdyenConfigs = require('*/cartridge/adyen/utils/adyenConfigs'); const AdyenLogs = require('*/cartridge/adyen/logs/adyenCustomLogs'); -const analyticsEvent = require('*/cartridge/adyen/analytics/analyticsEvents'); -const analyticsConstants = require('*/cartridge/adyen/analytics/constants'); /* eslint no-var: off */ let adyenHelperObj = { @@ -975,7 +973,6 @@ let adyenHelperObj = { if (!resultObject || !resultObject.getText()) { throw new Error(`No correct response from ${serviceType} service call`); } - analyticsEvent.createAnalyticsEvent(session.sessionID, serviceType, analyticsConstants.eventType.END, analyticsConstants.eventStatus.EXPECTED, analyticsConstants.eventCode.INFO); return JSON.parse(resultObject.getText()); }, };