-
-
Save SMK1085/1154cedc8020e7bcc405723b08f05899 to your computer and use it in GitHub Desktop.
Hull Code Hacks: Unified Exclusion Lists for Growth and Marketing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* --------------------------------------------------------------------------------- | |
* Temporary objects to diff against, no need to check if something has | |
* changed, it will be done at the bottom automatically. | |
* | |
* Usage: | |
* `_.set(attribs, <NAME>, <VALUE>);` to set a new attribute value. | |
* | |
* Examples: | |
* `_.set(attribs, 'first_name', user.hubspot.first_name);` to set a top-level attribute | |
* `_.set(attribs, 'unified/first_name', user.hubspot.first_name);` to set an attribute in a group` | |
* `_.set(attribs, 'first_name', { | |
* value: user.hubspot.first_name, | |
* operation: 'setIfNull' | |
* });` to set a top-level attribute, but only if it is not set | |
* | |
* --------------------------------------------------------------------------------- | |
*/ | |
let attribs = {}; | |
/* | |
* --------------------------------------------------------------------------------- | |
* START YOUR LOGIC | |
* --------------------------------------------------------------------------------- | |
*/ | |
// Handle exclusion list attributes | |
const exclusionAttribs = determineExlusionLists(user, segments); | |
attribs = _.merge(attribs, exclusionAttribs); | |
/* | |
* --------------------------------------------------------------------------------- | |
* END YOUR LOGIC | |
* --------------------------------------------------------------------------------- | |
*/ | |
/* | |
* --------------------------------------------------------------------------------- | |
* START UTILITY FUNCTIONS | |
* --------------------------------------------------------------------------------- | |
*/ | |
// If you have any utility functions, add them in this block, this helps your | |
// code staying tidy and everything is in a separate section. | |
// NOTE: Do not use const myFunction = (foo) => { ... }; | |
// but use function myFunction(foo) { ... } | |
function determineExlusionLists(usr, segs) { | |
const grpName = _.get(variables, "unifiedgrp__name", "unified"); | |
const changedAttribs = {}; | |
let isExcludedInAnyCategory = false; | |
let isAnyExclusionDefined = false; | |
_.forIn(variables, (v, k) => { | |
if(_.startsWith(k, "unified_el_segments__")) { | |
const cat = k.replace("unified_el_segments__", ""); | |
const exclusionSegments = splitVariableToList(v, ";"); | |
const isExcludedInCat = _.some(segs, s => exclusionSegments.includes(s.name)); | |
_.set(changedAttribs, `${grpName}/exclusion_list_${cat}`, isExcludedInCat); | |
if (isExcludedInCat === true) { | |
isExcludedInAnyCategory = true; | |
} | |
isAnyExclusionDefined = true; | |
} | |
}); | |
if (isAnyExclusionDefined === true) { | |
_.set(changedAttribs, `${grpName}/exclusion_list_combined`, isExcludedInAnyCategory); | |
} | |
return changedAttribs; | |
} | |
function splitVariableToList(stringVal, separator) { | |
return _.compact(stringVal.split(separator)); | |
} | |
/* | |
* --------------------------------------------------------------------------------- | |
* END UTILITY FUNCTIONS | |
* --------------------------------------------------------------------------------- | |
*/ | |
/* | |
* --------------------------------------------------------------------------------- | |
* Hull API calls | |
* | |
* Diffs automatically attribs against all attributes of the user | |
* and only performs calls to the API if needed. This helps you reduce billable | |
* incoming requests and prevents loops. | |
* | |
* A friendly reminder: Unless you know what you are doing, you should NOT | |
* change the code below. ;-) | |
* | |
* _.omitBy() == [].filter() | |
* --------------------------------------------------------------------------------- | |
*/ | |
const diffedAttribs = _.omitBy( attribs, ( value, index ) => { | |
// `folder_name/attribute_name` > `user.folder_name.attribute_name` | |
const path = _.replace( index, '/', '.' ); | |
if (path.endsWith("_date") || path.endsWith("_at")) { | |
return !_.isNil(_.get( user, path )) && moment(_.get( user, path )).isSame(moment(value), "second"); | |
} else { | |
return _.isEqual( _.get( user, path ), value ); | |
} | |
}); | |
if ( Object.keys( diffedAttribs ).length !== 0 ) { | |
hull.traits( diffedAttribs ); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment