Преглед изворни кода

Add user language segmentation to the home-page-view event (#28910)

* adding server side events language accept information for the events and domain in event segmentation

* only sending the first language

* adding fixes for tests

* adding domain for plans-page-view and paywall-plans-page-view

* adding domain for gallery-page-view

* adding it for payment-page-view

* rename variable

* removing language from login-page-view

* adding a fallback value

* removing domain from test

* removing extra comment

* adding test host

* removing extra console added by mistake

* format:fix

GitOrigin-RevId: d1a1a30e4635abdc2b93f88de14a1d8937f974c8
Davinder Singh пре 1 година
родитељ
комит
ac758f36ab

+ 4 - 0
services/web/app/src/Features/Analytics/AnalyticsUTMTrackingMiddleware.mjs

@@ -17,9 +17,13 @@ function recordUTMTags() {
       if (utmValues) {
       if (utmValues) {
         const path = new URL(req.url, Settings.siteUrl).pathname
         const path = new URL(req.url, Settings.siteUrl).pathname
 
 
+        const host = req.headers.host
+        const domain = host?.split('.')[0]
+
         AnalyticsManager.recordEventForSession(req.session, 'page-view', {
         AnalyticsManager.recordEventForSession(req.session, 'page-view', {
           path,
           path,
           ...utmValues,
           ...utmValues,
+          domain,
         })
         })
 
 
         const propertyValue = `${utmValues.utm_source || 'N/A'};${
         const propertyValue = `${utmValues.utm_source || 'N/A'};${

+ 7 - 0
services/web/app/src/Features/StaticPages/HomeController.mjs

@@ -28,8 +28,15 @@ async function index(req, res) {
 
 
 async function home(req, res) {
 async function home(req, res) {
   if (Features.hasFeature('homepage') && homepageExists) {
   if (Features.hasFeature('homepage') && homepageExists) {
+    const acceptLanguage = req.headers['accept-language'] || 'en' // returns in format => en-GB,en-US;q=0.9,en;q=0.8
+    const language = acceptLanguage.split(',')[0].split(';')[0].trim() // filters the first language
+    const host = req.headers.host
+    const domain = host?.split('.')[0]
+
     AnalyticsManager.recordEventForSession(req.session, 'home-page-view', {
     AnalyticsManager.recordEventForSession(req.session, 'home-page-view', {
       page: req.path,
       page: req.path,
+      language,
+      domain,
     })
     })
 
 
     const hotjarAssignment = await SplitTestHandler.promises.getAssignment(
     const hotjarAssignment = await SplitTestHandler.promises.getAssignment(

+ 10 - 1
services/web/app/src/Features/Subscription/SubscriptionController.mjs

@@ -213,7 +213,16 @@ async function userSubscriptionPage(req, res) {
       isInTrial
       isInTrial
     )
     )
 
 
-  AnalyticsManager.recordEventForSession(req.session, 'subscription-page-view')
+  const host = req.headers.host
+  const domain = host?.split('.')[0]
+
+  AnalyticsManager.recordEventForSession(
+    req.session,
+    'subscription-page-view',
+    {
+      domain,
+    }
+  )
 
 
   const groupPlansDataForDash = formatGroupPlansDataForDash()
   const groupPlansDataForDash = formatGroupPlansDataForDash()
 
 

+ 13 - 0
services/web/test/unit/src/Analytics/AnalyticsUTMTrackingMiddleware.test.mjs

@@ -77,6 +77,10 @@ describe('AnalyticsUTMTrackingMiddleware', function () {
         utm_content: 'foo-bar',
         utm_content: 'foo-bar',
         utm_term: 'overridden',
         utm_term: 'overridden',
       }
       }
+
+      ctx.req.headers = {
+        host: 'test-domain.overleaf.com',
+      }
       ctx.middleware(ctx.req, ctx.res, ctx.next)
       ctx.middleware(ctx.req, ctx.res, ctx.next)
     })
     })
 
 
@@ -101,6 +105,7 @@ describe('AnalyticsUTMTrackingMiddleware', function () {
           utm_campaign: 'Some Campaign',
           utm_campaign: 'Some Campaign',
           utm_content: 'foo-bar',
           utm_content: 'foo-bar',
           utm_term: 'overridden',
           utm_term: 'overridden',
+          domain: 'test-domain',
         }
         }
       )
       )
     })
     })
@@ -124,6 +129,9 @@ describe('AnalyticsUTMTrackingMiddleware', function () {
         utm_campaign: 'Some Campaign',
         utm_campaign: 'Some Campaign',
         utm_term: 'foo',
         utm_term: 'foo',
       }
       }
+      ctx.req.headers = {
+        host: 'test-domain.overleaf.com',
+      }
       ctx.middleware(ctx.req, ctx.res, ctx.next)
       ctx.middleware(ctx.req, ctx.res, ctx.next)
     })
     })
 
 
@@ -146,6 +154,7 @@ describe('AnalyticsUTMTrackingMiddleware', function () {
           utm_medium: 'Facebook',
           utm_medium: 'Facebook',
           utm_campaign: 'Some Campaign',
           utm_campaign: 'Some Campaign',
           utm_term: 'foo',
           utm_term: 'foo',
+          domain: 'test-domain',
         }
         }
       )
       )
     })
     })
@@ -169,6 +178,9 @@ describe('AnalyticsUTMTrackingMiddleware', function () {
         utm_campaign: 'Some Campaign',
         utm_campaign: 'Some Campaign',
         other_param: 'some-value',
         other_param: 'some-value',
       }
       }
+      ctx.req.headers = {
+        host: 'test-domain.overleaf.com',
+      }
       ctx.middleware(ctx.req, ctx.res, ctx.next)
       ctx.middleware(ctx.req, ctx.res, ctx.next)
     })
     })
 
 
@@ -190,6 +202,7 @@ describe('AnalyticsUTMTrackingMiddleware', function () {
           path: '/project',
           path: '/project',
           utm_medium: 'Facebook',
           utm_medium: 'Facebook',
           utm_campaign: 'Some Campaign',
           utm_campaign: 'Some Campaign',
+          domain: 'test-domain',
         }
         }
       )
       )
     })
     })