Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Migrate Persistence Setters and Getters to Store #874

Draft
wants to merge 8 commits into
base: development
Choose a base branch
from
37 changes: 12 additions & 25 deletions src/cookieSyncManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export default function cookieSyncManager(mpInstance) {
var self = this;

// Public
// https://go.mparticle.com/work/SQDSDKS-6375
this.attemptCookieSync = function(previousMPID, mpid, mpidIsNotInCookies) {
// TODO: These should move inside the for loop
var pixelConfig,
Expand All @@ -17,6 +18,8 @@ export default function cookieSyncManager(mpInstance) {

// TODO: Make this exit quicker instead of nested
if (mpid && !mpInstance._Store.webviewBridgeEnabled) {
const cookieSyncDates = mpInstance._Store.getCookieSyncDates(mpid);

mpInstance._Store.pixelConfigurations.forEach(function(
pixelSettings
) {
Expand Down Expand Up @@ -60,22 +63,15 @@ export default function cookieSyncManager(mpInstance) {
: '';
urlWithRedirect = url + encodeURIComponent(redirect);

// TODO: Refactor so that Persistence is only called once
// outside of the loop
var persistence = mpInstance._Persistence.getPersistence();

// TODO: Is there a historic reason for checking for previousMPID?
// it does not appear to be passed in anywhere
if (previousMPID && previousMPID !== mpid) {
if (persistence && persistence[mpid]) {
if (!persistence[mpid].csd) {
persistence[mpid].csd = {};
}
if (cookieSyncDates) {
self.performCookieSync(
urlWithRedirect,
pixelConfig.moduleId,
mpid,
persistence[mpid].csd,
cookieSyncDates,
pixelConfig.filteringConsentRuleValues,
mpidIsNotInCookies,
requiresConsent
Expand All @@ -85,16 +81,10 @@ export default function cookieSyncManager(mpInstance) {
} else {
// TODO: Refactor to check for the inverse and exit early
// rather than nesting
if (persistence[mpid]) {
if (!persistence[mpid].csd) {
persistence[mpid].csd = {};
}
lastSyncDateForModule = persistence[mpid].csd[
pixelConfig.moduleId.toString()
]
? persistence[mpid].csd[
pixelConfig.moduleId.toString()
]
if (cookieSyncDates) {
const moduleId = pixelConfig.moduleId.toString();
lastSyncDateForModule = cookieSyncDates[moduleId]
? cookieSyncDates[moduleId]
: null;

if (lastSyncDateForModule) {
Expand All @@ -117,7 +107,7 @@ export default function cookieSyncManager(mpInstance) {
urlWithRedirect,
pixelConfig.moduleId,
mpid,
persistence[mpid].csd,
cookieSyncDates,
pixelConfig.filteringConsentRuleValues,
mpidIsNotInCookies,
requiresConsent
Expand All @@ -128,7 +118,7 @@ export default function cookieSyncManager(mpInstance) {
urlWithRedirect,
pixelConfig.moduleId,
mpid,
persistence[mpid].csd,
cookieSyncDates,
pixelConfig.filteringConsentRuleValues,
mpidIsNotInCookies,
requiresConsent
Expand Down Expand Up @@ -186,10 +176,7 @@ export default function cookieSyncManager(mpInstance) {
img.onload = function() {
// TODO: Break this out into a convenience method so we can unit test
cookieSyncDates[moduleId.toString()] = new Date().getTime();
mpInstance._Persistence.saveUserCookieSyncDatesToPersistence(
mpid,
cookieSyncDates
);
mpInstance._Store.setCookieSyncDates(mpid, cookieSyncDates);
};
img.src = url;
}
Expand Down
6 changes: 2 additions & 4 deletions src/filteredMparticleUser.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default function filteredMparticleUser(
return {
getUserIdentities: function() {
var currentUserIdentities = {};
var identities = mpInstance._Persistence.getUserIdentities(mpid);
var identities = mpInstance._Store.getUserIdentities(mpid);

for (var identityType in identities) {
if (identities.hasOwnProperty(identityType)) {
Expand Down Expand Up @@ -68,9 +68,7 @@ export default function filteredMparticleUser(
},
getAllUserAttributes: function() {
var userAttributesCopy = {};
var userAttributes = mpInstance._Persistence.getAllUserAttributes(
mpid
);
var userAttributes = mpInstance._Store.getUserAttributes(mpid);

if (userAttributes) {
for (var prop in userAttributes) {
Expand Down
74 changes: 27 additions & 47 deletions src/identity.js
Original file line number Diff line number Diff line change
Expand Up @@ -806,11 +806,8 @@ export default function Identity(mpInstance) {
* @return {Object} an object with userIdentities as its key
*/
getUserIdentities: function() {
var currentUserIdentities = {};

var identities = mpInstance._Persistence.getUserIdentities(
mpid
);
const currentUserIdentities = {};
const identities = mpInstance._Store.getUserIdentities(mpid);

for (var identityType in identities) {
if (identities.hasOwnProperty(identityType)) {
Expand Down Expand Up @@ -866,12 +863,9 @@ export default function Identity(mpInstance) {
* @param {String} key
* @param {String} value
*/
// https://go.mparticle.com/work/SQDSDKS-4576
// https://go.mparticle.com/work/SQDSDKS-6373
setUserAttribute: function(key, newValue) {
var cookies,
userAttributes,
previousUserAttributeValue,
isNewAttribute;

mpInstance._SessionManager.resetSessionTimer();

if (mpInstance._Helpers.canLog()) {
Expand All @@ -896,11 +890,11 @@ export default function Identity(mpInstance) {
JSON.stringify({ key: key, value: newValue })
);
} else {
cookies = mpInstance._Persistence.getPersistence();

userAttributes = this.getAllUserAttributes();
const userAttributes = this.getAllUserAttributes();
let previousUserAttributeValue;
let isNewAttribute;

var existingProp = mpInstance._Helpers.findKeyInObject(
const existingProp = mpInstance._Helpers.findKeyInObject(
userAttributes,
key
);
Expand All @@ -915,13 +909,10 @@ export default function Identity(mpInstance) {
}

userAttributes[key] = newValue;
if (cookies && cookies[mpid]) {
cookies[mpid].ua = userAttributes;
mpInstance._Persistence.savePersistence(
cookies,
mpid
);
}
mpInstance._Store.setUserAttributes(
mpid,
userAttributes
);

self.sendUserAttributeChangeEvent(
key,
Expand Down Expand Up @@ -949,6 +940,7 @@ export default function Identity(mpInstance) {
* @method setUserAttributes
* @param {Object} user attribute object with keys of the attribute type, and value of the attribute value
*/
// https://go.mparticle.com/work/SQDSDKS-6373
setUserAttributes: function(userAttributes) {
mpInstance._SessionManager.resetSessionTimer();
if (isObject(userAttributes)) {
Expand Down Expand Up @@ -1036,13 +1028,8 @@ export default function Identity(mpInstance) {
* @param {String} key
* @param {Array} value an array of values
*/
// https://go.mparticle.com/work/SQDSDKS-6373
setUserAttributeList: function(key, newValue) {
var cookies,
userAttributes,
previousUserAttributeValue,
isNewAttribute,
userAttributeChange;

mpInstance._SessionManager.resetSessionTimer();

if (!mpInstance._Helpers.Validators.isValidKeyValue(key)) {
Expand All @@ -1058,19 +1045,20 @@ export default function Identity(mpInstance) {
return;
}

var arrayCopy = newValue.slice();
const arrayCopy = newValue.slice();

if (mpInstance._Store.webviewBridgeEnabled) {
mpInstance._NativeSdkHelpers.sendToNative(
Constants.NativeSdkPaths.SetUserAttributeList,
JSON.stringify({ key: key, value: arrayCopy })
);
} else {
cookies = mpInstance._Persistence.getPersistence();
const userAttributes = this.getAllUserAttributes();
let previousUserAttributeValue;
let isNewAttribute;
let userAttributeChange;

userAttributes = this.getAllUserAttributes();

var existingProp = mpInstance._Helpers.findKeyInObject(
const existingProp = mpInstance._Helpers.findKeyInObject(
userAttributes,
key
);
Expand All @@ -1085,12 +1073,9 @@ export default function Identity(mpInstance) {
}

userAttributes[key] = arrayCopy;
if (cookies && cookies[mpid]) {
cookies[mpid].ua = userAttributes;
mpInstance._Persistence.savePersistence(cookies, mpid);
}
mpInstance._Store.setUserAttributes(mpid, userAttributes);

// If the new attributeList length is different previous, then there is a change event.
// If the new attributeList length is different than the previous, then there is a change event.
// Loop through new attributes list, see if they are all in the same index as previous user attributes list
// If there are any changes, break, and immediately send a userAttributeChangeEvent with full array as a value
if (
Expand Down Expand Up @@ -1195,9 +1180,7 @@ export default function Identity(mpInstance) {
*/
getAllUserAttributes: function() {
var userAttributesCopy = {};
var userAttributes = mpInstance._Persistence.getAllUserAttributes(
mpid
);
var userAttributes = mpInstance._Store.getUserAttributes(mpid);

if (userAttributes) {
for (var prop in userAttributes) {
Expand Down Expand Up @@ -1233,18 +1216,15 @@ export default function Identity(mpInstance) {
* @return a ConsentState object
*/
getConsentState: function() {
return mpInstance._Persistence.getConsentState(mpid);
return mpInstance._Store.getConsentState(mpid);
},
/**
* Sets the Consent State stored locally for this user.
* @method setConsentState
* @param {Object} consent state
*/
setConsentState: function(state) {
mpInstance._Persistence.saveUserConsentStateToCookies(
mpid,
state
);
mpInstance._Store.setConsentState(mpid, state);
mpInstance._Forwarders.initForwarders(
this.getUserIdentities().userIdentities,
mpInstance._APIClient.prepareForwardingStats
Expand Down Expand Up @@ -1549,7 +1529,7 @@ export default function Identity(mpInstance) {
identityApiData.userIdentities
);

mpInstance._Persistence.saveUserIdentitiesToPersistence(
mpInstance._Store.setUserIdentities(
previousMPID,
newIdentitiesByType
);
Expand Down Expand Up @@ -1596,7 +1576,7 @@ export default function Identity(mpInstance) {
}

// https://go.mparticle.com/work/SQDSDKS-6041
mpInstance._Persistence.saveUserIdentitiesToPersistence(
mpInstance._Store.setUserIdentities(
identityApiResult.mpid,
newIdentitiesByType
);
Expand Down
1 change: 1 addition & 0 deletions src/mp-instance.js
Original file line number Diff line number Diff line change
Expand Up @@ -1310,6 +1310,7 @@ function completeSDKInitialization(apiKey, config, mpInstance) {

// Load any settings/identities/attributes from cookie or localStorage
mpInstance._Persistence.initializeStorage();
mpInstance._Store.syncPersistenceData();

// Set up user identitiy variables for later use
const currentUser = mpInstance.Identity.getCurrentUser();
Expand Down
45 changes: 28 additions & 17 deletions src/persistence.interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import {
SessionAttributes,
} from './store';
import { Dictionary } from './utils';
import { IMinifiedConsentJSONObject } from './consent';

export type CookieSyncDate = Dictionary<string>;
export type UploadsTable = Dictionary<any>;
export interface iForwardingStatsBatches {
uploadsTable: UploadsTable;
Expand All @@ -36,19 +36,23 @@ export interface IGlobalStoreV2MinifiedKeys {
das: string; // Device ID/ Device Application String
ia: IntegrationAttributes;
c: Context;
csm: MPID[]; // Current Session MPIDs
csm?: MPID[]; // Current Session MPIDs
les: number; // Last Event Sent Timestamp
ssd: number; // Session Start Date
}

export interface IPersistenceMinified extends Dictionary {
cu: MPID; // Current User MPID
gs: IGlobalStoreV2MinifiedKeys;

// Stored as 0 or 1 in device persistence but returned as a
// boolean when decoding from device persistence via
// _Persistence.getPersistence and _Persistence.decodePersistence
l: boolean; // IsLoggedIn

// Persistence Minified can also store optional dictionaries with
// an idex of MPID
// [mpid: MPID]: Dictionary<any>;
// [mpid: MPID]: Dictionary<IUserPersistenceMinified>;

// For Example:
// {
Expand All @@ -70,14 +74,34 @@ export interface IPersistenceMinified extends Dictionary {
// },
// l: false,
// MPID1: {
// csd: [],
// csd: {
// [moduleid]: 1234567890,
// },
// ui: {
// customerid: '12346',
// },
// ua: {
// age '42',
// },
// },
// };
}

export type CookieSyncDates = Dictionary<number>;

export interface IUserPersistenceMinified extends Dictionary {
csd: CookieSyncDates; // Cookie Sync Dates // list of timestamps for last cookie sync
con: IMinifiedConsentJSONObject; // Consent State
ui: UserIdentities; // User Identities
ua: UserAttributes; // User Attributes

// https://go.mparticle.com/work/SQDSDKS-6048
cp: Product[]; // Cart Products

fst: number; // First Seen Time
lst: number; // Last Seen Time
}

export interface IPersistence {
useLocalStorage(): boolean;
initializeStorage(): void;
Expand All @@ -103,23 +127,10 @@ export interface IPersistence {
decodePersistence(persistenceString: string): string;
getCookieDomain(): string;
getDomain(doc: string, locationHostname: string): string;
getUserIdentities(mpid: MPID): UserIdentities;
getAllUserAttributes(mpid: MPID): AllUserAttributes;
getCartProducts(mpid: MPID): Product[];
setCartProducts(allProducts: Product[]): void;
saveUserIdentitiesToPersistence(
mpid: MPID,
userIdentities: UserIdentities
): void;
saveUserAttributesToPersistence(
mpid: MPID,
userAttributes: UserAttributes
): void;
saveUserCookieSyncDatesToPersistence(mpid: MPID, csd: CookieSyncDate): void;
saveUserConsentStateToCookies(mpid, consentState: ConsentState): void;
savePersistence(persistance: IPersistenceMinified): void;
getPersistence(): IPersistenceMinified;
getConsentState(mpid: MPID): ConsentState | null;
getFirstSeenTime(mpid: MPID): string | null;
setFirstSeenTime(mpid: MPID, time: number): void;
getLastSeenTime(mpid: MPID): number | null;
Expand Down
Loading
Loading