Browse Source

Merge pull request #4149 from overleaf/ab-user-registration-properties

Track registration sources as user properties

GitOrigin-RevId: 1c1346d092808aff49c89c1659f42674506a919d
Alexandre Bourdin 5 years ago
parent
commit
e2d116e8be

+ 27 - 0
services/web/app/src/Features/Analytics/AnalyticsRegistrationSourceMiddleware.js

@@ -0,0 +1,27 @@
+function setSource(source) {
+  return function (req, res, next) {
+    if (req.session) {
+      req.session.required_login_for = source
+    }
+    next()
+  }
+}
+
+function clearSource() {
+  return function (req, res, next) {
+    doClearSource(req.session)
+    next()
+  }
+}
+
+function doClearSource(session) {
+  if (session) {
+    delete session.required_login_for
+  }
+}
+
+module.exports = {
+  setSource,
+  clearSource,
+  doClearSource,
+}

+ 2 - 0
services/web/app/src/Features/Authentication/AuthenticationController.js

@@ -18,6 +18,7 @@ const UrlHelper = require('../Helpers/UrlHelper')
 const AsyncFormHelper = require('../Helpers/AsyncFormHelper')
 const _ = require('lodash')
 const UserAuditLogHandler = require('../User/UserAuditLogHandler')
+const AnalyticsRegistrationSourceMiddleware = require('../Analytics/AnalyticsRegistrationSourceMiddleware')
 const {
   acceptsJson,
 } = require('../../infrastructure/RequestContentTypeDetection')
@@ -115,6 +116,7 @@ const AuthenticationController = {
               return next(err)
             }
             AuthenticationController._clearRedirectFromSession(req)
+            AnalyticsRegistrationSourceMiddleware.doClearSource(req.session)
             AsyncFormHelper.redirect(req, res, redir)
           })
         })

+ 7 - 2
services/web/app/src/Features/Collaborators/CollaboratorsRouter.js

@@ -5,6 +5,7 @@ const PrivilegeLevels = require('../Authorization/PrivilegeLevels')
 const CollaboratorsInviteController = require('./CollaboratorsInviteController')
 const RateLimiterMiddleware = require('../Security/RateLimiterMiddleware')
 const CaptchaMiddleware = require('../Captcha/CaptchaMiddleware')
+const AnalyticsRegistrationSourceMiddleware = require('../Analytics/AnalyticsRegistrationSourceMiddleware')
 const { Joi, validate } = require('../../infrastructure/Validation')
 
 module.exports = {
@@ -112,14 +113,18 @@ module.exports = {
 
     webRouter.get(
       '/project/:Project_id/invite/token/:token',
+      AnalyticsRegistrationSourceMiddleware.setSource('project-invite'),
       AuthenticationController.requireLogin(),
-      CollaboratorsInviteController.viewInvite
+      CollaboratorsInviteController.viewInvite,
+      AnalyticsRegistrationSourceMiddleware.clearSource()
     )
 
     webRouter.post(
       '/project/:Project_id/invite/token/:token/accept',
+      AnalyticsRegistrationSourceMiddleware.setSource('project-invite'),
       AuthenticationController.requireLogin(),
-      CollaboratorsInviteController.acceptInvite
+      CollaboratorsInviteController.acceptInvite,
+      AnalyticsRegistrationSourceMiddleware.clearSource()
     )
   },
 }

+ 5 - 12
services/web/app/src/Features/Templates/TemplatesRouter.js

@@ -1,17 +1,8 @@
-/* eslint-disable
-    max-len,
-*/
-// TODO: This file was created by bulk-decaffeinate.
-// Fix any style issues and re-enable lint.
-/*
- * decaffeinate suggestions:
- * DS102: Remove unnecessary code created because of implicit returns
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
- */
 const AuthenticationController = require('../Authentication/AuthenticationController')
 const TemplatesController = require('./TemplatesController')
 const TemplatesMiddleware = require('./TemplatesMiddleware')
 const RateLimiterMiddleware = require('../Security/RateLimiterMiddleware')
+const AnalyticsRegistrationSourceMiddleware = require('../Analytics/AnalyticsRegistrationSourceMiddleware')
 
 module.exports = {
   apply(app) {
@@ -22,15 +13,17 @@ module.exports = {
       TemplatesController.getV1Template
     )
 
-    return app.post(
+    app.post(
       '/project/new/template',
+      AnalyticsRegistrationSourceMiddleware.setSource('template'),
       AuthenticationController.requireLogin(),
       RateLimiterMiddleware.rateLimit({
         endpointName: 'create-project-from-template',
         maxRequests: 20,
         timeInterval: 60,
       }),
-      TemplatesController.createProjectFromV1Template
+      TemplatesController.createProjectFromV1Template,
+      AnalyticsRegistrationSourceMiddleware.clearSource()
     )
   },
 }

+ 7 - 2
services/web/app/src/router.js

@@ -48,6 +48,7 @@ const TemplatesRouter = require('./Features/Templates/TemplatesRouter')
 const InstitutionsController = require('./Features/Institutions/InstitutionsController')
 const UserMembershipRouter = require('./Features/UserMembership/UserMembershipRouter')
 const SystemMessageController = require('./Features/SystemMessages/SystemMessageController')
+const AnalyticsRegistrationSourceMiddleware = require('./Features/Analytics/AnalyticsRegistrationSourceMiddleware')
 const { Joi, validate } = require('./infrastructure/Validation')
 const {
   renderUnsupportedBrowserPage,
@@ -1121,7 +1122,9 @@ function initialize(webRouter, privateApiRouter, publicApiRouter) {
       maxRequests: 15,
       timeInterval: 60,
     }),
-    TokenAccessController.tokenAccessPage
+    AnalyticsRegistrationSourceMiddleware.setSource('link-sharing'),
+    TokenAccessController.tokenAccessPage,
+    AnalyticsRegistrationSourceMiddleware.clearSource()
   )
 
   webRouter.get(
@@ -1131,7 +1134,9 @@ function initialize(webRouter, privateApiRouter, publicApiRouter) {
       maxRequests: 15,
       timeInterval: 60,
     }),
-    TokenAccessController.tokenAccessPage
+    AnalyticsRegistrationSourceMiddleware.setSource('link-sharing'),
+    TokenAccessController.tokenAccessPage,
+    AnalyticsRegistrationSourceMiddleware.clearSource()
   )
 
   webRouter.post(