Skip to content

Commit

Permalink
Merge branch 'develop' into fix.tiktokads
Browse files Browse the repository at this point in the history
  • Loading branch information
ItsSudip authored Mar 1, 2024
2 parents cb517a4 + aea417c commit ad098a4
Show file tree
Hide file tree
Showing 4 changed files with 254 additions and 35 deletions.
48 changes: 25 additions & 23 deletions src/v0/destinations/facebook_conversions/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,28 +93,26 @@ const populateCustomDataBasedOnCategory = (customData, message, category, catego
);

const contentCategory = eventTypeCustomData.content_category;
let contentType;
let defaultContentType;
if (contentIds.length > 0) {
contentType = 'product';
defaultContentType = 'product';
} else if (contentCategory) {
contentIds.push(contentCategory);
contents.push({
id: contentCategory,
quantity: 1,
});
contentType = 'product_group';
defaultContentType = 'product_group';
}
const contentType =
message.properties?.content_type ||
getContentType(message, defaultContentType, categoryToContent, DESTINATION.toLowerCase());

eventTypeCustomData = {
...eventTypeCustomData,
content_ids: contentIds,
contents,
content_type: getContentType(
message,
contentType,
categoryToContent,
DESTINATION.toLowerCase(),
),
content_type: contentType,
content_category: getContentCategory(contentCategory),
};
break;
Expand All @@ -125,18 +123,20 @@ const populateCustomDataBasedOnCategory = (customData, message, category, catego
case 'payment info entered':
case 'product added to wishlist': {
const contentCategory = eventTypeCustomData.content_category;
const contentType = eventTypeCustomData.content_type;
const contentType =
message.properties?.content_type ||
getContentType(
message,
eventTypeCustomData.content_type,
categoryToContent,
DESTINATION.toLowerCase(),
);
const { contentIds, contents } = populateContentsAndContentIDs([message.properties]);
eventTypeCustomData = {
...eventTypeCustomData,
content_ids: contentIds,
contents,
content_type: getContentType(
message,
contentType,
categoryToContent,
DESTINATION.toLowerCase(),
),
content_type: contentType,
content_category: getContentCategory(contentCategory),
};
validateProductSearchedData(eventTypeCustomData);
Expand All @@ -151,18 +151,20 @@ const populateCustomDataBasedOnCategory = (customData, message, category, catego
);

const contentCategory = eventTypeCustomData.content_category;
const contentType = eventTypeCustomData.content_type;
const contentType =
message.properties?.content_type ||
getContentType(
message,
eventTypeCustomData.content_type,
categoryToContent,
DESTINATION.toLowerCase(),
);

eventTypeCustomData = {
...eventTypeCustomData,
content_ids: contentIds,
contents,
content_type: getContentType(
message,
contentType,
categoryToContent,
DESTINATION.toLowerCase(),
),
content_type: contentType,
content_category: getContentCategory(contentCategory),
num_items: contentIds.length,
};
Expand Down
34 changes: 22 additions & 12 deletions src/v0/destinations/facebook_pixel/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,20 +53,22 @@ const getActionSource = (payload, channel) => {
* Handles order completed and checkout started types of specific events
*/
const handleOrder = (message, categoryToContent) => {
const { products, revenue } = message.properties;
const value = formatRevenue(revenue);

const contentType = getContentType(message, 'product', categoryToContent);
const contentIds = [];
const contents = [];
const {
products,
revenue,
category,
quantity,
price,
currency,
contentName,
delivery_category: deliveryCategory,
} = message.properties;
const value = formatRevenue(revenue);
let { content_type: contentType } = message.properties;
contentType = contentType || getContentType(message, 'product', categoryToContent);
const contentIds = [];
const contents = [];

if (products) {
if (products.length > 0 && Array.isArray(products)) {
products.forEach((singleProduct) => {
Expand Down Expand Up @@ -109,10 +111,17 @@ const handleOrder = (message, categoryToContent) => {
* Handles product list viewed
*/
const handleProductListViewed = (message, categoryToContent) => {
let contentType;
let defaultContentType;
const contentIds = [];
const contents = [];
const { products, category, quantity, value, contentName } = message.properties;
const {
products,
category,
quantity,
value,
contentName,
content_type: contentType,
} = message.properties;
if (products && products.length > 0 && Array.isArray(products)) {
products.forEach((product, index) => {
if (isObject(product)) {
Expand All @@ -132,20 +141,20 @@ const handleProductListViewed = (message, categoryToContent) => {
}

if (contentIds.length > 0) {
contentType = 'product';
defaultContentType = 'product';
// for viewContent event content_ids and content arrays are not mandatory
} else if (category) {
contentIds.push(category);
contents.push({
id: category,
quantity: 1,
});
contentType = 'product_group';
defaultContentType = 'product_group';
}

return {
content_ids: contentIds,
content_type: getContentType(message, contentType, categoryToContent),
content_type: contentType || getContentType(message, defaultContentType, categoryToContent),
contents,
content_category: getContentCategory(category),
content_name: contentName,
Expand All @@ -165,7 +174,8 @@ const handleProduct = (message, categoryToContent, valueFieldIdentifier) => {
const useValue = valueFieldIdentifier === 'properties.value';
const contentId =
message.properties?.product_id || message.properties?.sku || message.properties?.id;
const contentType = getContentType(message, 'product', categoryToContent);
const contentType =
message.properties?.content_type || getContentType(message, 'product', categoryToContent);
const contentName = message.properties.product_name || message.properties.name || '';
const contentCategory = message.properties.category || '';
const currency = message.properties.currency || 'USD';
Expand Down
100 changes: 100 additions & 0 deletions test/integrations/destinations/facebook_conversions/processor/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1434,4 +1434,104 @@ export const data = [
},
mockFns: defaultMockFns,
},
{
name: 'facebook_conversions',
description: 'Track event with standard event order completed with content_type in properties',
feature: 'processor',
module: 'destination',
version: 'v0',
input: {
request: {
body: [
{
message: {
anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1',
channel: 'web',
context: {
traits: {
email: ' [email protected] ',
address: {
zip: 1234,
},
anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1',
},
},
event: 'order completed',
integrations: {
All: true,
},
message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8',
properties: {
content_type: 'product_group',
revenue: 400,
additional_bet_index: 0,
products: [
{
product_id: 1234,
quantity: 5,
price: 55,
},
],
},
timestamp: '2023-11-12T15:46:51.693229+05:30',
type: 'track',
},
destination: {
Config: {
limitedDataUsage: true,
blacklistPiiProperties: [
{
blacklistPiiProperties: '',
blacklistPiiHash: false,
},
],
accessToken: '09876',
datasetId: 'dummyID',
eventsToEvents: [
{
from: '',
to: '',
},
],
removeExternalId: true,
actionSource: 'website',
},
Enabled: true,
},
},
],
},
},
output: {
response: {
status: 200,
body: [
{
output: {
version: '1',
type: 'REST',
method: 'POST',
endpoint: 'https://graph.facebook.com/v18.0/dummyID/events?access_token=09876',
headers: {},
params: {},
body: {
JSON: {},
XML: {},
JSON_ARRAY: {},
FORM: {
data: [
'{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"Purchase","event_time":1699784211,"action_source":"website","custom_data":{"content_type":"product_group","revenue":400,"additional_bet_index":0,"products":[{"product_id":1234,"quantity":5,"price":55}],"content_ids":[1234],"contents":[{"id":1234,"quantity":5,"item_price":55}],"currency":"USD","value":400,"num_items":1}}',
],
},
},
files: {},
userId: '',
},
statusCode: 200,
},
],
},
},
mockFns: defaultMockFns,
},
];
107 changes: 107 additions & 0 deletions test/integrations/destinations/facebook_pixel/processor/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6460,4 +6460,111 @@ export const data = [
},
},
},
{
name: 'facebook_pixel',
description:
'Test 51: properties.content_type is given priority over populating it from categoryToContent mapping.',
feature: 'processor',
module: 'destination',
version: 'v0',
input: {
request: {
body: [
{
message: {
channel: 'web',
type: 'track',
messageId: 'ec5481b6-a926-4d2e-b293-0b3a77c4d3be',
originalTimestamp: '2023-10-14T15:46:51.693229+05:30',
anonymousId: '00000000000000000000000000',
userId: '12345',
event: 'order completed',
properties: {
content_type: 'product_group',
category: ['clothing', 'fishing'],
order_id: 'rudderstackorder1',
revenue: 12.24,
currency: 'INR',
products: [
{
quantity: 1,
price: 24.75,
name: 'my product',
sku: 'p-298',
},
{
quantity: 3,
price: 24.75,
name: 'other product',
sku: 'p-299',
},
],
},
integrations: {
All: true,
},
sentAt: '2019-10-14T11:15:53.296Z',
},
destination: {
Config: {
blacklistPiiProperties: [
{
blacklistPiiProperties: '',
blacklistPiiHash: true,
},
],
categoryToContent: [
{
from: 'clothing',
to: 'product',
},
],
accessToken: '09876',
pixelId: 'dummyPixelId',
eventsToEvents: [
{
from: '',
to: '',
},
],
valueFieldIdentifier: 'properties.price',
advancedMapping: false,
},
Enabled: true,
},
},
],
},
},
output: {
response: {
status: 200,
body: [
{
output: {
version: '1',
type: 'REST',
method: 'POST',
endpoint: `https://graph.facebook.com/${VERSION}/dummyPixelId/events?access_token=09876`,
headers: {},
params: {},
body: {
JSON: {},
JSON_ARRAY: {},
XML: {},
FORM: {
data: [
'{"user_data":{"external_id":"5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5"},"event_name":"Purchase","event_time":1697278611,"event_id":"ec5481b6-a926-4d2e-b293-0b3a77c4d3be","action_source":"website","custom_data":{"content_type":"product_group","category[0]":"clothing","category[1]":"fishing","order_id":"rudderstackorder1","revenue":12.24,"currency":"INR","products[0].quantity":1,"products[0].price":24.75,"products[0].name":"my product","products[0].sku":"p-298","products[1].quantity":3,"products[1].price":24.75,"products[1].name":"other product","products[1].sku":"p-299","content_category":"clothing,fishing","content_ids":["p-298","p-299"],"value":12.24,"contents":[{"id":"p-298","quantity":1,"item_price":24.75},{"id":"p-299","quantity":3,"item_price":24.75}],"num_items":2}}',
],
},
},
files: {},
userId: '',
},
statusCode: 200,
},
],
},
},
},
].map((d) => ({ ...d, mockFns }));

0 comments on commit ad098a4

Please sign in to comment.