mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-06-04 06:39:02 +02:00
Merge pull request #29043 from overleaf/oa-odc-to-cio
[web] Send onboarding data to Customer IO GitOrigin-RevId: b45d1b66d36c3bba36e9c777fb66699c6bb56d33
This commit is contained in:
@@ -29,6 +29,7 @@ import TutorialHandler from '../Tutorial/TutorialHandler.mjs'
|
||||
import SubscriptionHelper from '../Subscription/SubscriptionHelper.js'
|
||||
import PermissionsManager from '../Authorization/PermissionsManager.mjs'
|
||||
import AnalyticsManager from '../Analytics/AnalyticsManager.js'
|
||||
import { OnboardingDataCollection } from '../../models/OnboardingDataCollection.js'
|
||||
|
||||
/**
|
||||
* @import { GetProjectsRequest, GetProjectsResponse, AllUsersProjects, MongoProject, FormattedProject, MongoTag } from "./types"
|
||||
@@ -463,6 +464,12 @@ async function projectListPage(req, res, next) {
|
||||
affiliation => affiliation.institution?.enterpriseCommons
|
||||
)
|
||||
|
||||
let onboardingDataCollection
|
||||
let subjectArea
|
||||
let usedLatex
|
||||
let primaryOccupation
|
||||
let role
|
||||
|
||||
// customer.io: Premium nudge experiment
|
||||
// Only do customer-io-trial-conversion assignment for users not in India/China and not in group/commons
|
||||
let customerIoEnabled = false
|
||||
@@ -482,6 +489,18 @@ async function projectListPage(req, res, next) {
|
||||
)
|
||||
if (cioAssignment.variant === 'enabled') {
|
||||
customerIoEnabled = true
|
||||
onboardingDataCollection = await OnboardingDataCollection.findById(
|
||||
userId,
|
||||
'subjectArea usedLatex primaryOccupation role'
|
||||
)
|
||||
|
||||
if (onboardingDataCollection) {
|
||||
subjectArea = onboardingDataCollection.subjectArea
|
||||
usedLatex = onboardingDataCollection.usedLatex
|
||||
primaryOccupation = onboardingDataCollection.primaryOccupation
|
||||
role = onboardingDataCollection.role
|
||||
}
|
||||
|
||||
AnalyticsManager.setUserPropertyForUserInBackground(
|
||||
userId,
|
||||
'customer-io-integration',
|
||||
@@ -541,6 +560,10 @@ async function projectListPage(req, res, next) {
|
||||
signUpDate: user.signUpDate
|
||||
? Math.floor(user.signUpDate.getTime() / 1000)
|
||||
: null,
|
||||
subjectArea,
|
||||
primaryOccupation,
|
||||
role,
|
||||
usedLatex,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ if(customerIoEnabled && ExposedSettings.cioWriteKey && ExposedSettings.cioSiteId
|
||||
function boolAttr(value) {
|
||||
return value !== undefined ? String(value) : null;
|
||||
}
|
||||
script(type="text/javascript", id="cio-loader", nonce=scriptNonce, data-best-subscription=(usersBestSubscription && usersBestSubscription.type), data-ai-blocked=boolAttr(aiBlocked), data-has-ai-assist=boolAttr(hasAiAssist), data-cio-write-key=ExposedSettings.cioWriteKey, data-cio-site-id=ExposedSettings.cioSiteId, data-session-analytics-id=getSessionAnalyticsId(), data-user-id=getLoggedInUserId(), data-last-active=lastActive, data-sign-up-date=signUpDate).
|
||||
script(type="text/javascript", id="cio-loader", nonce=scriptNonce, data-best-subscription=(usersBestSubscription && usersBestSubscription.type), data-ai-blocked=boolAttr(aiBlocked), data-has-ai-assist=boolAttr(hasAiAssist), data-cio-write-key=ExposedSettings.cioWriteKey, data-cio-site-id=ExposedSettings.cioSiteId, data-session-analytics-id=getSessionAnalyticsId(), data-user-id=getLoggedInUserId(), data-last-active=lastActive, data-sign-up-date=signUpDate, data-subject-area=subjectArea, data-role=role, data-used-latex=usedLatex, data-primary-occupation=primaryOccupation).
|
||||
|
||||
function parseBool(value) {
|
||||
return value === 'true' ? true : value === 'false' ? false : undefined;
|
||||
@@ -19,6 +19,10 @@ if(customerIoEnabled && ExposedSettings.cioWriteKey && ExposedSettings.cioSiteId
|
||||
var hasAiAssist = parseBool(cioSettings.hasAiAssist);
|
||||
var lastActive = cioSettings.lastActive;
|
||||
var signUpDate = cioSettings.signUpDate;
|
||||
var subjectArea = cioSettings.subjectArea;
|
||||
var role = cioSettings.role;
|
||||
var primaryOccupation = cioSettings.primaryOccupation;
|
||||
var usedLatex = cioSettings.usedLatex;
|
||||
|
||||
|
||||
!function(){var i="cioanalytics", analytics=(window[i]=window[i]||[]);if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"];analytics.factory=function(e){return function(){var t=Array.prototype.slice.call(arguments);t.unshift(e);analytics.push(t);return analytics}};for(var e=0;e<analytics.methods.length;e++){var key=analytics.methods[e];analytics[key]=analytics.factory(key)}analytics.load=function(key,e){var t=document.createElement("script");t.type="text/javascript";t.async=!0;t.setAttribute('data-global-customerio-analytics-key', i);t.src="https://cdp.customer.io/v1/analytics-js/snippet/" + key + "/analytics.min.js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(t,n);analytics._writeKey=key;analytics._loadOptions=e};analytics.SNIPPET_VERSION="4.15.3";
|
||||
@@ -45,6 +49,10 @@ if(customerIoEnabled && ExposedSettings.cioWriteKey && ExposedSettings.cioSiteId
|
||||
addIfDefined(identifyData, 'best-subscription-type', usersBestSubscription);
|
||||
addIfDefined(identifyData, 'aiBlocked', aiBlocked);
|
||||
addIfDefined(identifyData, 'hasAiAssist', hasAiAssist);
|
||||
addIfDefined(identifyData, 'subjectArea', subjectArea);
|
||||
addIfDefined(identifyData, 'role', role);
|
||||
addIfDefined(identifyData, 'primaryOccupation', primaryOccupation);
|
||||
addIfDefined(identifyData, 'usedLatex', usedLatex);
|
||||
|
||||
analytics.identify(analyticsId, identifyData);
|
||||
}}();
|
||||
|
||||
@@ -54,6 +54,22 @@ describe('ProjectListController', function () {
|
||||
ctx.settings = {
|
||||
siteUrl: 'https://overleaf.com',
|
||||
}
|
||||
ctx.onboardingDataCollection = {
|
||||
companyDivisionDepartment: '',
|
||||
companyJobTitle: '',
|
||||
firstName: 'Dos',
|
||||
governmentJobTitle: '',
|
||||
institutionName: '',
|
||||
lastName: 'Mukasan',
|
||||
nonprofitDivisionDepartment: '',
|
||||
nonprofitJobTitle: '',
|
||||
otherJobTitle: '',
|
||||
primaryOccupation: 'company',
|
||||
role: 'conductor',
|
||||
subjectArea: 'music',
|
||||
updatedAt: '2025-09-04T12:12:21.628Z',
|
||||
usedLatex: 'occasionally',
|
||||
}
|
||||
ctx.TagsHandler = {
|
||||
promises: {
|
||||
getAllTags: sinon.stub().resolves(ctx.tags),
|
||||
@@ -67,6 +83,9 @@ describe('ProjectListController', function () {
|
||||
ctx.UserModel = {
|
||||
findById: sinon.stub().resolves(ctx.user),
|
||||
}
|
||||
ctx.OnboardingDataCollectionModel = {
|
||||
findById: sinon.stub().resolves(ctx.onboardingDataCollection),
|
||||
}
|
||||
ctx.UserPrimaryEmailCheckHandler = {
|
||||
requiresPrimaryEmailCheck: sinon.stub().returns(false),
|
||||
}
|
||||
@@ -209,6 +228,10 @@ describe('ProjectListController', function () {
|
||||
User: ctx.UserModel,
|
||||
}))
|
||||
|
||||
vi.doMock('../../../../app/src/models/OnboardingDataCollection', () => ({
|
||||
OnboardingDataCollection: ctx.OnboardingDataCollectionModel,
|
||||
}))
|
||||
|
||||
vi.doMock('../../../../app/src/Features/Project/ProjectGetter', () => ({
|
||||
default: ctx.ProjectGetter,
|
||||
}))
|
||||
|
||||
Reference in New Issue
Block a user