Skip to content

Commit 7f58464

Browse files
authored
[MOB-11679]: consent logging implementation (#521)
* consent loggimg impl draft * remove consent check and cleanup some * test fixes and additional cleanup * rework a bit * fix specs
1 parent 1f6abe1 commit 7f58464

12 files changed

Lines changed: 1008 additions & 68 deletions

react-example/src/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ const HomeLink = styled(Link)`
4747
configOptions: {
4848
isEuIterableService: false,
4949
dangerouslyAllowJsPopups: true,
50-
enableUnknownActivation: true
50+
enableUnknownActivation: true,
51+
identityResolution: {
52+
replayOnVisitorToKnown: true,
53+
mergeOnUnknownToKnown: true
54+
}
5155
},
5256
generateJWT: ({ email, userID }) =>
5357
axios

src/authorization/authorization.ts

Lines changed: 56 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import {
99
ENDPOINTS,
1010
RouteConfig,
1111
SHARED_PREF_UNKNOWN_USAGE_TRACKED,
12-
SHARED_PREFS_CRITERIA
12+
SHARED_PREFS_CRITERIA,
13+
SHARED_PREF_CONSENT_TIMESTAMP,
14+
SHARED_PREF_EMAIL,
15+
SHARED_PREF_USER_ID
1316
} from 'src/constants';
1417
import {
1518
cancelAxiosRequestAndMakeFetch,
@@ -116,6 +119,7 @@ const initializeUserId = (userId: string) => {
116119
const addUserIdToRequest = (userId: string) => {
117120
setTypeOfAuth('userID');
118121
authIdentifier = userId;
122+
localStorage.setItem(SHARED_PREF_USER_ID, userId);
119123

120124
if (typeof userInterceptor === 'number') {
121125
baseAxiosRequest.interceptors.request.eject(userInterceptor);
@@ -213,15 +217,30 @@ const initializeEmailUser = (email: string) => {
213217
clearUnknownUser();
214218
};
215219

216-
const syncEvents = () => {
217-
if (config.getConfig('enableUnknownActivation')) {
218-
unknownUserManager.syncEvents();
219-
}
220-
};
220+
const syncEvents = () => {
221+
if (config.getConfig('enableUnknownActivation')) {
222+
unknownUserManager.syncEvents();
223+
}
224+
};
225+
226+
const handleConsentTracking = (isUserKnown = false, isMergeOperation = false) => {
227+
if (config.getConfig('enableUnknownActivation')) {
228+
unknownUserManager.handleConsentTracking(isUserKnown, isMergeOperation);
229+
}
230+
};
231+
232+
const getIdentityResolutionBehavior = (identityResolution?: IdentityResolution) => {
233+
const identityResolutionConfig = config.getConfig('identityResolution');
234+
return {
235+
merge: identityResolution?.mergeOnUnknownToKnown ?? identityResolutionConfig?.mergeOnUnknownToKnown,
236+
replay: identityResolution?.replayOnVisitorToKnown ?? identityResolutionConfig?.replayOnVisitorToKnown
237+
};
238+
};
221239

222240
const addEmailToRequest = (email: string) => {
223241
setTypeOfAuth('email');
224242
authIdentifier = email;
243+
localStorage.setItem(SHARED_PREF_EMAIL, email);
225244

226245
if (typeof userInterceptor === 'number') {
227246
baseAxiosRequest.interceptors.request.eject(userInterceptor);
@@ -415,7 +434,7 @@ export function initialize(
415434
emailOrUserId: string,
416435
isEmail: boolean,
417436
merge?: boolean
418-
): Promise<boolean> => {
437+
): Promise<{ success: boolean; mergePerformed: boolean }> => {
419438
const typeOfAuth = getTypeOfAuth();
420439
const enableUnknownActivation = config.getConfig('enableUnknownActivation');
421440
const sourceUserIdOrEmail =
@@ -438,11 +457,12 @@ export function initialize(
438457
destinationUserId,
439458
destinationEmail
440459
);
460+
return Promise.resolve({ success: true, mergePerformed: true });
441461
} catch (error) {
442462
return Promise.reject(`merging failed: ${error}`);
443463
}
444464
}
445-
return Promise.resolve(true); // promise resolves here because merging is not needed so we setUserID passed via dev
465+
return Promise.resolve({ success: true, mergePerformed: false }); // promise resolves here because merging is not needed so we setUserID passed via dev
446466
};
447467

448468
if (!generateJWT) {
@@ -474,19 +494,13 @@ export function initialize(
474494
) => {
475495
clearMessages();
476496
try {
477-
const identityResolutionConfig =
478-
config.getConfig('identityResolution');
479-
const merge =
480-
identityResolution?.mergeOnUnknownToKnown ||
481-
identityResolutionConfig?.mergeOnUnknownToKnown;
482-
const replay =
483-
identityResolution?.replayOnVisitorToKnown ||
484-
identityResolutionConfig?.replayOnVisitorToKnown;
497+
const { merge, replay } = getIdentityResolutionBehavior(identityResolution);
485498

486499
const result = await tryMergeUser(email, true, merge);
487-
if (result) {
500+
if (result.success) {
488501
initializeEmailUser(email);
489502
if (replay) {
503+
await handleConsentTracking(true, result.mergePerformed);
490504
syncEvents();
491505
} else {
492506
unknownUserManager.removeUnknownSessionCriteriaData();
@@ -504,19 +518,13 @@ export function initialize(
504518
) => {
505519
clearMessages();
506520
try {
507-
const identityResolutionConfig =
508-
config.getConfig('identityResolution');
509-
const merge =
510-
identityResolution?.mergeOnUnknownToKnown ||
511-
identityResolutionConfig?.mergeOnUnknownToKnown;
512-
const replay =
513-
identityResolution?.replayOnVisitorToKnown ||
514-
identityResolutionConfig?.replayOnVisitorToKnown;
521+
const { merge, replay } = getIdentityResolutionBehavior(identityResolution);
515522

516523
const result = await tryMergeUser(userId, false, merge);
517-
if (result) {
524+
if (result.success) {
518525
initializeUserId(userId);
519526
if (replay) {
527+
await handleConsentTracking(true, result.mergePerformed);
520528
syncEvents();
521529
} else {
522530
unknownUserManager.removeUnknownSessionCriteriaData();
@@ -532,6 +540,8 @@ export function initialize(
532540
unknownUserManager.removeUnknownSessionCriteriaData();
533541
setTypeOfAuth(null);
534542
authIdentifier = null;
543+
localStorage.removeItem(SHARED_PREF_EMAIL);
544+
localStorage.removeItem(SHARED_PREF_USER_ID);
535545
/* clear fetched in-app messages */
536546
clearMessages();
537547

@@ -555,6 +565,11 @@ export function initialize(
555565
localStorage.removeItem(SHARED_PREFS_CRITERIA);
556566

557567
localStorage.setItem(SHARED_PREF_UNKNOWN_USAGE_TRACKED, 'true');
568+
// Store consent timestamp when user grants consent
569+
const existingConsent = localStorage.getItem(SHARED_PREF_CONSENT_TIMESTAMP);
570+
if (!existingConsent) {
571+
localStorage.setItem(SHARED_PREF_CONSENT_TIMESTAMP, Date.now().toString());
572+
}
558573
enableUnknownTracking();
559574
} else {
560575
/* if consent is false, we want to stop tracking and clear unknown user data */
@@ -565,6 +580,7 @@ export function initialize(
565580
localStorage.removeItem(SHARED_PREFS_CRITERIA);
566581
localStorage.removeItem(SHARED_PREF_UNKNOWN_USER_ID);
567582
localStorage.removeItem(SHARED_PREF_UNKNOWN_USAGE_TRACKED);
583+
localStorage.removeItem(SHARED_PREF_CONSENT_TIMESTAMP);
568584

569585
setTypeOfAuth(null);
570586
authIdentifier = null;
@@ -858,21 +874,16 @@ export function initialize(
858874
/* clear previous user */
859875
clearMessages();
860876
try {
861-
const identityResolutionConfig = config.getConfig('identityResolution');
862-
const merge =
863-
identityResolution?.mergeOnUnknownToKnown ||
864-
identityResolutionConfig?.mergeOnUnknownToKnown;
865-
const replay =
866-
identityResolution?.replayOnVisitorToKnown ||
867-
identityResolutionConfig?.replayOnVisitorToKnown;
877+
const { merge, replay } = getIdentityResolutionBehavior(identityResolution);
868878

869879
try {
870880
return doRequest({ email })
871881
.then(async (token) => {
872882
const result = await tryMergeUser(email, true, merge);
873-
if (result) {
883+
if (result.success) {
874884
initializeEmailUser(email);
875885
if (replay) {
886+
await handleConsentTracking(true, result.mergePerformed);
876887
syncEvents();
877888
} else {
878889
unknownUserManager.removeUnknownSessionCriteriaData();
@@ -903,21 +914,16 @@ export function initialize(
903914
) => {
904915
clearMessages();
905916
try {
906-
const identityResolutionConfig = config.getConfig('identityResolution');
907-
const merge =
908-
identityResolution?.mergeOnUnknownToKnown ||
909-
identityResolutionConfig?.mergeOnUnknownToKnown;
910-
const replay =
911-
identityResolution?.replayOnVisitorToKnown ||
912-
identityResolutionConfig?.replayOnVisitorToKnown;
917+
const { merge, replay } = getIdentityResolutionBehavior(identityResolution);
913918

914919
try {
915920
return doRequest({ userID: userId })
916921
.then(async (token) => {
917922
const result = await tryMergeUser(userId, false, merge);
918-
if (result) {
923+
if (result.success) {
919924
initializeUserId(userId);
920925
if (replay) {
926+
await handleConsentTracking(true, result.mergePerformed);
921927
syncEvents();
922928
} else {
923929
unknownUserManager.removeUnknownSessionCriteriaData();
@@ -946,6 +952,8 @@ export function initialize(
946952
unknownUserManager.removeUnknownSessionCriteriaData();
947953
setTypeOfAuth(null);
948954
authIdentifier = null;
955+
localStorage.removeItem(SHARED_PREF_EMAIL);
956+
localStorage.removeItem(SHARED_PREF_USER_ID);
949957
/* clear fetched in-app messages */
950958
clearMessages();
951959

@@ -983,6 +991,11 @@ export function initialize(
983991
localStorage.removeItem(SHARED_PREFS_CRITERIA);
984992

985993
localStorage.setItem(SHARED_PREF_UNKNOWN_USAGE_TRACKED, 'true');
994+
// Store consent timestamp when user grants consent
995+
const existingConsent = localStorage.getItem(SHARED_PREF_CONSENT_TIMESTAMP);
996+
if (!existingConsent) {
997+
localStorage.setItem(SHARED_PREF_CONSENT_TIMESTAMP, Date.now().toString());
998+
}
986999
enableUnknownTracking();
9871000
} else {
9881001
/* if consent is false, we want to stop tracking and clear unknown user data */
@@ -993,6 +1006,7 @@ export function initialize(
9931006
localStorage.removeItem(SHARED_PREFS_CRITERIA);
9941007
localStorage.removeItem(SHARED_PREF_UNKNOWN_USER_ID);
9951008
localStorage.removeItem(SHARED_PREF_UNKNOWN_USAGE_TRACKED);
1009+
localStorage.removeItem(SHARED_PREF_CONSENT_TIMESTAMP);
9961010

9971011
setTypeOfAuth(null);
9981012
authIdentifier = null;

0 commit comments

Comments
 (0)