Skip to content

Commit

Permalink
feat(braze): nested array ops (#1753)
Browse files Browse the repository at this point in the history
* feat(braze) : nested array ops

* feat(braze) : nested array ops

* feat(braze) : updated user input for update and remove calls

* feat(braze) : updated user input for update and remove calls

* feat(braze) : comments addressed

* feat(braze) : comments addressed

* Update config.js
  • Loading branch information
aashishmalik committed Jan 6, 2023
1 parent 786cfe0 commit 0658a5f
Show file tree
Hide file tree
Showing 4 changed files with 549 additions and 3 deletions.
15 changes: 15 additions & 0 deletions src/v0/destinations/braze/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,19 @@ const IDENTIFY_BRAZE_MAX_REQ_COUNT = 50;
const DEL_MAX_BATCH_SIZE = 50;
const DESTINATION = "braze";

const nestedOperationTypes = {
REMOVE: "remove",
UPDATE: "update",
ADD: "add",
CREATE: "create"
};

const supportedOperationTypes = [
nestedOperationTypes.ADD,
nestedOperationTypes.REMOVE,
nestedOperationTypes.UPDATE
];

module.exports = {
ConfigCategory,
mappingConfig,
Expand All @@ -44,5 +57,7 @@ module.exports = {
TRACK_BRAZE_MAX_REQ_COUNT,
IDENTIFY_BRAZE_MAX_REQ_COUNT,
DESTINATION,
nestedOperationTypes,
supportedOperationTypes,
DEL_MAX_BATCH_SIZE
};
78 changes: 77 additions & 1 deletion src/v0/destinations/braze/transform.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,13 @@ const {
getSubscriptionGroupEndPoint,
BRAZE_PARTNER_NAME,
TRACK_BRAZE_MAX_REQ_COUNT,
IDENTIFY_BRAZE_MAX_REQ_COUNT
IDENTIFY_BRAZE_MAX_REQ_COUNT,
supportedOperationTypes,
nestedOperationTypes
} = require("./config");

const logger = require("../../../logger");

function formatGender(gender) {
// few possible cases of woman
if (["woman", "female", "w", "f"].indexOf(gender.toLowerCase()) > -1) {
Expand Down Expand Up @@ -308,10 +312,82 @@ function processTrackEvent(messageType, message, destination, mappingJson) {
payload = addMandatoryEventProperties(payload, message);
payload.properties = properties;

try {
// add,update,remove
if (destination.Config.enableNestedArrayOperations) {
Object.keys(properties)
.filter(key => Array.isArray(properties[`${key}`]))
.forEach(key => {
// if not specified, send as create attribute
if (properties.nestedOperationType === nestedOperationTypes.CREATE) {
attributePayload[key] = properties[key];
} else if (
supportedOperationTypes.includes(properties.nestedOperationType)
) {
attributePayload[key] = {};
const opsResultArray = [];
if (
properties.nestedOperationType === nestedOperationTypes.UPDATE
) {
for (let i = 0; i < properties[key].length; i += 1) {
const myObj = {};
Object.keys(properties[key][i]).forEach(subKey => {
myObj[`$${subKey}`] = properties[key][i][subKey];
});
opsResultArray.push(myObj);
}

// eslint-disable-next-line no-underscore-dangle
attributePayload._merge_objects = isDefinedAndNotNull(
properties.mergeObjectsUpdateOperation
)
? properties.mergeObjectsUpdateOperation
: false;
attributePayload[key][
`$${properties.nestedOperationType}`
] = opsResultArray;
} else if (
properties.nestedOperationType === nestedOperationTypes.REMOVE
) {
for (let i = 0; i < properties[key].length; i += 1) {
const myObj = {};
Object.keys(properties[key][i]).forEach(subKey => {
myObj[`$${subKey}`] = properties[key][i][subKey];
});
opsResultArray.push(myObj);
}
attributePayload[key][
`$${properties.nestedOperationType}`
] = opsResultArray;
} else {
// add case
attributePayload[key][`$${properties.nestedOperationType}`] =
properties[key];
}
}
});
}
} catch (exp) {
logger.info("Failure occured during nested array operations", exp);
}

payload = setExternalIdOrAliasObject(payload, message);
if (payload) {
requestJson.events = [payload];
}

// update payload as per https://www.braze.com/docs/user_guide/data_and_analytics/custom_data/custom_attributes/array_of_objects/#api-request-body
if (
destination.Config.enableNestedArrayOperations &&
isDefinedAndNotNull(properties.nestedOperationType)
) {
delete requestJson.events;
delete properties.nestedOperationType;
attributePayload.external_id = payload.external_id;
if (!requestJson.attributes) {
requestJson.attributes = [attributePayload];
}
}
return buildResponse(
message,
destination,
Expand Down
Loading

0 comments on commit 0658a5f

Please sign in to comment.