Skip to content

Commit

Permalink
feat(destination): onboard discord (#1725)
Browse files Browse the repository at this point in the history
* feat: introduce new tags and error classes

* refactor: rename function as per latest implementation

* refactor: replace ErrorBuilder with error type

* fix: removed the ability to set stat tags externally in specific error types

* feat: add destination and source ID tags

* refactor: rename DefaultError to BaseError

* fix: allow only error type and meta tags to be set in NetworkError class

* fix: typo

* refactor: replace with new error classes in GAOC destination

* fix: remove error handling in proxy.test.js

* fix: remove older stats and error types

* chore(core): add internal code documentation

Co-authored-by: Krishna Chaitanya <[email protected]>

* feat: revamp cdk V2 error handling (#1647)

* feat: revamp cdk V2 error handling

* fix: revert previously committed unwanted files

* refactor: replace all references of CustomError in core (#1644)

* fix: do not export CustomError

* refactor: remove deprecated modules

* refactor: replace all instances of CustomError in the core module

* test: fix generic proxy test suite failures (#1656)

* refactor: use new error types (#1658)

* refactor: use new error types

* fix: use the right error type

* Revert "fix: use the right error type"

This reverts commit 2887f3a.

* feat: refactor new error types (ga360, gainsight, gainsight_px, google_cloud_function, googlepubsnub) (#1665)

* feat:[ga360] add new errorTypes

* feat:[google_cloud_function] add new errorTypes

* feat:[googlepubsnub] add new errorTypes

* feat:[gainsight_px] add new errorTypes

* feat:[gainsight] add new errorTypes

* feat: refactor new error types (awin, blueshift, bqstream, branch, braze) (#1649)

* feat:[awin] add new error types

* feat:[blueshift] add new error types

* feat:[bqstream] add new error types

* feat:[branch] add new error types

* feat:[braze] add new error types

* feat: refactor new error types (facebook_offline_conversions, facebook_pixel, factorsai, fb, fb_custom_audience) (#1652)

* feat:[facebook_offline_conversions] add new errorTypes

* feat:[facebook_pixel] add new errorTypes

* feat:[factorsai] add new errorTypes

* feat:[factorsai] add new errorTypes

* feat:[fb] add new errorTypes

* feat:[fb_custom_audience] add new errorTypes

* fix: refactor error  message and unit tests

* feat: update error message

* feat: refactor new error types (custify, customerio, delighted, engage, eventbridge) (#1651)

* feat:[custify] add new error types

* feat:[customerio] add new error types

* feat:[customerio] add statTags in processRouterDest

* feat:[delighted] add new errorTypes

* feat:[engage] add new errorTypes

* feat:[eventbridge] add new errorTypes

* feat: new error types for destinations(mailmodo, mailchimp, lytics, leanplum, lambda) (#1669)

* feat: new error types for destinations

* feat: code review changes

* feat: update new error types (#1673)

* feat: new error types for user.com destination (#1638)

* feat: new error types for user.com destination

* feat: code review changes

* feat: new error types for sources (appcenter, appsflyer, braze, canny) (#1641)

* feat: new error types for sources

* feat: code review changes

* feat: new error types for destinations (trengo, userlist, variance, vero, webengage) (#1653)

* feat: new error types for destinations

* feat: code review changes

* feat: code review changes

* feat: new error types for destinations (#1661)

* feat: new error types for destinations(persistiq, pardot, one_signal, ometria, mssql) (#1666)

* feat: code review changes

* feat: code review changes

* feat: code review changes

* feat: new error types for destinations(mixpanel, monetate, monday, moengage, minio) (#1667)

* feat: new error types for destinations

* feat: code review changes

* feat: new error types for destinations(kustomer, kochava, klaviyo, kissmetrics, keen) (#1671)

* feat: new error types for destinations

* feat: code review changes

* feat: new error types for destinations (rockerbox, revenue_cat, redis, refiner) (#1659)

* feat: new error types for destinations

* feat: code review changes

* feat: new error types for destinations (tiktok_ads, statsig, splitio, snowflake)  (#1654)

* feat: new error types for destinations

* feat: code review changes

* feat: new error types for destinations (snapchat_custom_audience, snapchat_conversion, slack, singular, signl4) (#1655)

* feat: new error types for destinations

* feat: code review changes

* feat: code review changes

* feat: code review changes

* feat: code review changes

* feat: refactor new error types (google_adwords_enhanced_conversion, google_adwords_offline_conversion, google_adwords_remarketing_lists, heap, googlesheets (#1670)

* feat:[google_adwords_enhanced_conversions] update new error types

* feat:[google_adwords_remarketing_lists] update new error types

* feat:[googlesheets] update new error types

* feat:[google_adwords_offline_conversion] update new error types

* feat:[heap] update new error types

* feat: update new error types

* feat: new error types for destinations(shynet, sfmc, serenytics, sendgrid, segment) (#1657)

* feat: new error types for destinationss

* feat: code review changes

* feat: code review changes

* feat: refactor new error types (hs, indicative, itercom, iterable, drip) (#1672)

* feat:[HS] update new error types

* feat:[indicative] update new error types

* feat:[indicative] update new error types

* feat:[intercom] update new error types

* feat:[iterable] update new error types

* feat:update new error types

* feat:[drip] update new error types

* feat: update new error types

* feat: update new error types

* feat: new error types for sources (gainsightpx, iterable, mailmodo, monday, shopify)  (#1642)

* feat: new error types for sources

* feat: code review changes

* feat: new error types for destinations (webhook, wootric, woopra, yahoo_dsp, zendesk) (#1645)

* feat: new error types for destinations

* feat: code review changes

* feat: code review changes

* feat: code review changes

* feat: refactor new error types (campaign_manager, candu, canny, clevertap, confluent_cloud) (#1650)

* feat:[campaign_manager] add new error types

* feat:[candu] add new error types

* feat:[canny] add new error types

* feat:[clevertap] add new error types

* feat:[confluent_cloud] add new error types

* feat: add new errorTypes

* feat: update new error types

* feat: add new error types ( active_campaign, adjust, adobe_analytics, appsflyer, airship) (#1639)

* feat:[active_campaign] add new error types

* feat:[adj] add new error types

* feat:[adobe_analytics] add new error types

* feat:[appsFlyer] add new error types

* feat:[airship] add new error types

* feat:[active_campaign] update new error type for axios calls

* feat: update new error types

* feat: update new error types

* feat: update new error types

* feat: update new error types

* feat: new error types for destinations(marketo, marketo_static_list, marketo_bulk_upload) (#1674)

* feat: new error types for destinations

* feat: code review changes

* feat: code review changes

* feat: code review changes

* feat: code review changes

* feat: code review changes

* feat: add new errorTypes (firehose, freshsales, freshmarketer, ga, ga4) (#1660)

* feat: add new errorTypes

* feat: update new error types

* feat: update new error types

* feat: update new error types

* feat: refactor new error types ( amplitude, algolia, appcues, attentive_tag, attribution, autopilot) (#1648)

* feat:[algolia] add new error types

* feat:[appcues] add new error types

* feat: add new error types

* feat: add new error types

* feat:[autopilot] add new error types

* feat: add new error types

* feat: update new error types

* feat: update new error types

* fix: heap test cases (#1675)

* feat: refactor-dcm_floodlight-cdk-errorTypes (#1677)

* feat: refactor-dcm_floodlight-cdk-errorTypes

* fix: june tests

* fix: proxy test cases (#1678)

* fix: proxy test cases

* fix: code review changes

* fix: code review changes

* feat: refactor router transform implementation (#1676)

* feat: revamped router transform logic

* fix: revert previously committed unwanted files

* fix: replace flowtype with feature

* refactor: use default error message

* fix: return response

* refactor: extract redundant code to a utility method

* chore: refactor all instances of previous error types (#1680)

* refactor: replace final instances of old error types with new error types

* fix: typo

* fix: revert previously committed file

* refactor: remove unwanted comments

* fix: user deletion test cases (#1682)

* fix: pinterest and algolia cdk test cases (#1681)

* fix: pinterest cdk test cases

* fix: code review changes

* fix: code review changes

* fix: code review changes

* feat: router tranform refacor for destinations (batch - 1) (#1684)

* feat: router tranform refacor

* feat: router tranform refacor

* feat: code review changes

* feat: code review changes

* feat: router tranform refacor (#1685)

* feat: router tranform refacor for destinations (batch - 3) (#1686)

* feat: router tranform refacor

* feat: router tranform refactor

* feat: code review changes

* feat: refactor router transformer - 1 (#1687)

* feat: refactor-processRouterDest

* feat: refactor-processRouterDest

* feat: refactor-processRouterDest (#1688)

* feat: refactor-processRouterDest (#1689)

* feat: refactor router transformer - 4 (#1690)

* feat: refactor-processRouterDest

* feat: refactor-processRouterDest

* fix: incorrect usages of error types (#1691)

* fix: remove all usages of TRANSFORMER_METRIC

* fixcorrect usages of error types

* feat: add assertConfig default binding

* chore: remove unwanted arguments from function definition

* chore: remove unwanted null

* chore: simplified the syntax

* fix: set default status code

* chore: use optional chaining syntax

* fix: remove unwanted status code argument

* feat: destType removed (#1692)

* feat: refactor error types - review comments (#1697)

* fix: refactor error types

* fix: rt workflow to send stat tags in pinterest tag

* fix: router transform issues in marketo_static_list

* fix: restore router transform implementation

* fix: issues in router transformation across destinations

Co-authored-by: saikumarrs <[email protected]>

* fix: final review issues (#1699)

* chore: add workspaceId as stat-tag (#1700)

Co-authored-by: Sai Sankeerth <[email protected]>

* feat: add error handling for CDK v1 (#1698)

* fix: add parsed response in network error (#1704)

* fix[gaec]: revert destination response

* fix: authErrorCategory field in the response

Co-authored-by: saikumarrs <[email protected]>

* fix: destinations network error responses (#1705)

* refactor: error handler for user deletion

* feat(destination): onboard discord

* chore: added testcases

* fix: comments addressed

* fix: comments addressed+1

* fix: comments addressed+2

* fix: comments addressed+3

* feat: add embed template with test cases

Co-authored-by: saikumarrs <[email protected]>
Co-authored-by: Sai Kumar Battinoju <[email protected]>
Co-authored-by: Krishna Chaitanya <[email protected]>
Co-authored-by: Ujjwal Abhishek <[email protected]>
Co-authored-by: Mihir Bhalala <[email protected]>
Co-authored-by: Sankeerth <[email protected]>
Co-authored-by: Sai Sankeerth <[email protected]>
Co-authored-by: Anant <[email protected]>
  • Loading branch information
9 people authored Jan 4, 2023
1 parent a947b10 commit 4f6323b
Show file tree
Hide file tree
Showing 6 changed files with 1,465 additions and 99 deletions.
222 changes: 222 additions & 0 deletions src/v0/destinations/discord/transform.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
/* eslint-disable no-nested-ternary */
/* eslint-disable no-prototype-builtins */
const Handlebars = require("handlebars");
const { EventType } = require("../../../constants");

const {
defaultPostRequestConfig,
defaultRequestConfig,
getFieldValueFromMessage,
simpleProcessRouterDest
} = require("../../util");
const { InstrumentationError } = require("../../util/errorTypes");
const {
stringifyJSON,
getName,
getWhiteListedTraits,
buildDefaultTraitTemplate
} = require("../slack/util");

const getEmbed = (templateInput, destination, callType) => {
// building titleTemplate
let embedTitleTemplate = "";
let titleTemplate;
if (
destination.Config?.embedTitleTemplate &&
destination.Config.embedTitleTemplate.trim().length > 0
) {
embedTitleTemplate = destination.Config.embedTitleTemplate.trim();
titleTemplate = Handlebars.compile(embedTitleTemplate);
}
// building desription template
let embedDescriptionTemplate = "";
let descriptionTemplate;
if (
destination.Config?.embedDescriptionTemplate &&
destination.Config.embedDescriptionTemplate.trim().length > 0
) {
embedDescriptionTemplate = destination.Config.embedDescriptionTemplate.trim();
descriptionTemplate = Handlebars.compile(embedDescriptionTemplate);
}
return {
title:
embedTitleTemplate.length > 0
? titleTemplate(templateInput)
: "Message from Rudderstack ",
description:
embedDescriptionTemplate.length > 0
? descriptionTemplate(templateInput)
: `${callType} call made`
};
};

const buildResponse = (responseBody, destination) => {
const endpoint = destination.Config.webhookUrl;
const response = defaultRequestConfig();
response.endpoint = endpoint;
response.method = defaultPostRequestConfig.requestMethod;
response.headers = { "Content-Type": "application/json" };
response.body.JSON = responseBody;
return response;
};
const processIdentify = (message, destination) => {
let identifyTemplateConfig;
const defaultIdentifyTemplate = "Identified {{name}} with ";
if (
destination.Config?.identifyTemplate &&
destination.Config.identifyTemplate.trim().length > 0
) {
identifyTemplateConfig = destination.Config.identifyTemplate.trim();
}

const whiteTraitsList = getWhiteListedTraits(destination);

const uName = getName(message);

// provide a fat input with flattened traits as well as traits object
// helps the user to build additional handlebar expressions
const identityTraits = getFieldValueFromMessage(message, "traits") || {};

const template = Handlebars.compile(
identifyTemplateConfig ||
buildDefaultTraitTemplate(
whiteTraitsList,
identityTraits,
defaultIdentifyTemplate
)
);

const templateInput = {
name: uName,
...identityTraits,
traits: stringifyJSON(identityTraits, whiteTraitsList),
traitsList: identityTraits
};

const resultText = template(templateInput);
// constructing embed message
if (destination?.Config?.embedFlag) {
const embedMessage = getEmbed(templateInput, destination, "Identify");
const response = {
content: resultText,
embeds: [embedMessage]
};
return buildResponse(response, destination);
}
const response = {
content: resultText
};
return buildResponse(response, destination);
};

const processTrack = (message, destination) => {
const eventTemplateConfig = destination.Config.eventTemplateSettings;

if (!message.event) {
throw new InstrumentationError("Event name is required");
}
const eventName = message.event;
const templateListForThisEvent = new Set();

const traitsList = getWhiteListedTraits(destination);

/** Add global context to regex always
build the templatelist for the event, pick the first in case of multiple
using set to filter out
document this behaviour
*/
eventTemplateConfig.forEach(templateConfig => {
// building templatelist
let configEventName;
let configEventTemplate;
if (
templateConfig.eventName &&
templateConfig.eventName.trim().length > 0
) {
configEventName = templateConfig.eventName.trim();
}
if (
templateConfig.eventTemplate &&
templateConfig.eventTemplate.trim().length > 0
) {
configEventTemplate = templateConfig.eventTemplate.trim();
}
if (configEventName && configEventTemplate) {
if (templateConfig.eventRegex) {
if (
eventName.match(new RegExp(configEventName, "g")) &&
eventName.match(new RegExp(configEventName, "g")).length > 0
) {
templateListForThisEvent.add(configEventTemplate);
}
} else if (configEventName === eventName) {
templateListForThisEvent.add(configEventTemplate);
}
}
});

const templateListArray = Array.from(templateListForThisEvent);

// track event default handlebar expression
const defaultTemplate = "{{name}} did {{event}} with {{propertiesList}}";

const eventTemplate = Handlebars.compile(
templateListArray.length > 0 ? templateListArray[0] : defaultTemplate
);

// provide flattened properties as well as properties object
const identityTraits = getFieldValueFromMessage(message, "traits") || {};
const templateInput = {
name: getName(message),
event: eventName,
...message.properties,
properties: message.properties,
propertiesList: stringifyJSON(message.properties || {}),
traits: stringifyJSON(identityTraits, traitsList),
traitsList: identityTraits
};

const resultText = eventTemplate(templateInput);
// constructing embed message
if (destination?.Config?.embedFlag) {
const embedMessage = getEmbed(templateInput, destination, "Track");
const response = {
content: resultText,
embeds: [embedMessage]
};
return buildResponse(response, destination);
}
const response = {
content: resultText
};
return buildResponse(response, destination);
};

const process = event => {
let response;
const { message, destination } = event;
if (!message.type) {
throw new InstrumentationError("Event type is required");
}
const messageType = message.type.toLowerCase();

switch (messageType) {
case EventType.IDENTIFY:
response = processIdentify(message, destination);
return response;
case EventType.TRACK:
response = processTrack(message, destination);
return response;
default:
throw new InstrumentationError(
`Event type ${messageType} is not supported`
);
}
};

const processRouterDest = async (inputs, reqMetadata) => {
const respList = await simpleProcessRouterDest(inputs, process, reqMetadata);
return respList;
};

module.exports = { process, processRouterDest };
Loading

0 comments on commit 4f6323b

Please sign in to comment.