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

feat: add support for getting anonymousId by note attributes array #3893

Merged
merged 8 commits into from
Dec 6, 2024
Original file line number Diff line number Diff line change
@@ -1,18 +1,9 @@
/* eslint-disable @typescript-eslint/naming-convention */
const lodash = require('lodash');
const get = require('get-value');
// const { RedisError } = require('@rudderstack/integrations-lib');
const stats = require('../../../../util/stats');
const {
getShopifyTopic,
// createPropertiesForEcomEvent,
extractEmailFromPayload,
getAnonymousIdAndSessionId,
// getHashLineItems,
} = require('../../../../v0/sources/shopify/util');
// const logger = require('../../../logger');
const { getShopifyTopic, extractEmailFromPayload } = require('../../../../v0/sources/shopify/util');
const { removeUndefinedAndNullValues, isDefinedAndNotNull } = require('../../../../v0/util');
// const { RedisDB } = require('../../../util/redis/redisConnector');
const Message = require('../../../../v0/sources/message');
const { EventType } = require('../../../../constants');
const {
Expand All @@ -28,6 +19,7 @@ const {
const {
createPropertiesForEcomEventFromWebhook,
getProductsFromLineItems,
getAnonymousIdFromAttributes,
} = require('./serverSideUtlis');

const NO_OPERATION_SUCCESS = {
Expand Down Expand Up @@ -128,12 +120,9 @@ const processEvent = async (inputEvent, metricMetadata) => {
message.setProperty('traits.email', email);
}
}
// attach anonymousId if the event is track event using note_attributes
if (message.type !== EventType.IDENTIFY) {
const { anonymousId } = await getAnonymousIdAndSessionId(
message,
{ shopifyTopic, ...metricMetadata },
null,
);
const anonymousId = await getAnonymousIdFromAttributes(event);
if (isDefinedAndNotNull(anonymousId)) {
message.setProperty('anonymousId', anonymousId);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const {
getProductsFromLineItems,
createPropertiesForEcomEventFromWebhook,
getAnonymousIdFromAttributes,
} = require('./serverSideUtlis');

const { constructPayload } = require('../../../../v0/util');
Expand Down Expand Up @@ -109,4 +110,21 @@ describe('serverSideUtils.js', () => {
});
});
});

describe('getAnonymousIdFromAttributes', () => {
// Handles empty note_attributes array gracefully
it('should return null when note_attributes is an empty array', async () => {
const event = { note_attributes: [] };
const result = await getAnonymousIdFromAttributes(event);
expect(result).toBeNull();
});

it('get anonymousId from noteAttributes', async () => {
const event = {
note_attributes: [{ name: 'rudderAnonymousId', value: '123456' }],
};
const result = await getAnonymousIdFromAttributes(event);
expect(result).toEqual('123456');
});
});
});
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const { isDefinedAndNotNull } = require('@rudderstack/integrations-lib');
const { constructPayload } = require('../../../../v0/util');

const {
lineItemsMappingJSON,
productMappingJSON,
Expand Down Expand Up @@ -39,7 +39,25 @@ const createPropertiesForEcomEventFromWebhook = (message) => {
return mappedPayload;
};

/**
* Returns the anonymousId from the noteAttributes array in the webhook event
* @param {Object} event
* @returns {String} anonymousId
*/
const getAnonymousIdFromAttributes = async (event) => {
krishna2020 marked this conversation as resolved.
Show resolved Hide resolved
let anonymousId = null;
const noteAttributes = event.note_attributes;
if (isDefinedAndNotNull(event) && isDefinedAndNotNull(noteAttributes)) {
krishna2020 marked this conversation as resolved.
Show resolved Hide resolved
const rudderAnonymousIdObject = noteAttributes.find(
(attr) => attr.name === 'rudderAnonymousId',
);
anonymousId = rudderAnonymousIdObject ? rudderAnonymousIdObject.value : null;
}
return anonymousId;
};

module.exports = {
createPropertiesForEcomEventFromWebhook,
getProductsFromLineItems,
getAnonymousIdFromAttributes,
};
15 changes: 15 additions & 0 deletions test/integrations/sources/shopify/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,21 @@ export const dummyContext = {
},
};

export const note_attributes = [
{
name: 'cartId',
value: '9c623f099fc8819aa4d6a958b65dfe7d',
},
{
name: 'cartToken',
value: 'Z2NwLXVzLWVhc3QxOjAxSkQzNUFXVEI4VkVUNUpTTk1LSzBCMzlF',
},
{
name: 'rudderAnonymousId',
value: '50ead33e-d763-4854-b0ab-765859ef05cb',
},
];

export const responseDummyContext = {
document: {
location: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// This file contains the test scenarios for the server-side events from the Shopify GraphQL API for
// the v1 transformation flow
import { mockFns } from '../mocks';
import { dummySourceConfig } from '../constants';
import { dummySourceConfig, note_attributes } from '../constants';

export const checkoutEventsTestScenarios = [
{
Expand All @@ -27,7 +26,7 @@ export const checkoutEventsTestScenarios = [
updated_at: '2024-11-05T21:22:02-05:00',
landing_site: '/',
note: '',
note_attributes: [],
note_attributes,
referring_site: '',
shipping_lines: [],
shipping_address: [],
Expand Down Expand Up @@ -145,7 +144,7 @@ export const checkoutEventsTestScenarios = [
updated_at: '2024-11-05T21:22:02-05:00',
landing_site: '/',
note: '',
note_attributes: [],
note_attributes,
referring_site: '',
shipping_lines: [],
shipping_address: [],
Expand Down Expand Up @@ -237,7 +236,7 @@ export const checkoutEventsTestScenarios = [
traits: {
shippingAddress: [],
},
anonymousId: '5d3e2cb6-4011-5c9c-b7ee-11bc1e905097',
anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb',
},
],
},
Expand Down Expand Up @@ -269,7 +268,7 @@ export const checkoutEventsTestScenarios = [
created_at: '2024-09-16T03:50:1500:00',
updated_at: '2024-09-17T03:29:02-04:00',
note: '',
note_attributes: [],
note_attributes,
shipping_address: {
first_name: 'testuser',
address1: 'oakwood bridge',
Expand Down Expand Up @@ -396,7 +395,7 @@ export const checkoutEventsTestScenarios = [
output: {
batch: [
{
anonymousId: '5d3e2cb6-4011-5c9c-b7ee-11bc1e905097',
anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb',
context: {
cart_token: 'Z2NwLXVzLWVhc3QxOjAxSjdXRjdOQjY0NlFFNFdQVEg0MTRFM1E2',
integration: {
Expand All @@ -415,7 +414,7 @@ export const checkoutEventsTestScenarios = [
created_at: '2024-09-16T03:50:1500:00',
updated_at: '2024-09-17T03:29:02-04:00',
note: '',
note_attributes: [],
note_attributes,
shipping_address: {
first_name: 'testuser',
address1: 'oakwood bridge',
Expand Down Expand Up @@ -680,7 +679,7 @@ export const checkoutEventsTestScenarios = [
merchant_of_record_app_id: null,
name: '#1017',
note: null,
note_attributes: [],
note_attributes,
number: 17,
order_number: 1017,
order_status_url:
Expand Down Expand Up @@ -988,7 +987,7 @@ export const checkoutEventsTestScenarios = [
merchant_of_record_app_id: null,
name: '#1017',
note: null,
note_attributes: [],
note_attributes,
number: 17,
order_number: 1017,
order_status_url:
Expand Down Expand Up @@ -1289,7 +1288,7 @@ export const checkoutEventsTestScenarios = [
},
},
timestamp: '2024-11-06T02:54:50.000Z',
anonymousId: '5d3e2cb6-4011-5c9c-b7ee-11bc1e905097',
anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb',
},
],
},
Expand Down Expand Up @@ -1326,6 +1325,7 @@ export const checkoutEventsTestScenarios = [
current_total_tax: '0.00',
email: '[email protected]',
name: '#1017',
note_attributes,
order_number: 1017,
order_status_url:
'https://pixel-testing-rs.myshopify.com/59026964593/orders/676613a0027fc8240e16d67fdc9f5ac8/authenticate?key=a70bbe7ec8abcc46b77e4331e4df8c60',
Expand Down Expand Up @@ -1486,6 +1486,7 @@ export const checkoutEventsTestScenarios = [
current_total_tax: '0.00',
email: '[email protected]',
name: '#1017',
note_attributes,
order_number: 1017,
order_status_url:
'https://pixel-testing-rs.myshopify.com/59026964593/orders/676613a0027fc8240e16d67fdc9f5ac8/authenticate?key=a70bbe7ec8abcc46b77e4331e4df8c60',
Expand Down Expand Up @@ -1675,7 +1676,7 @@ export const checkoutEventsTestScenarios = [
},
},
timestamp: '2024-11-06T02:54:50.000Z',
anonymousId: '5d3e2cb6-4011-5c9c-b7ee-11bc1e905097',
anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb',
},
],
},
Expand All @@ -1684,4 +1685,4 @@ export const checkoutEventsTestScenarios = [
},
},
},
].map((d1) => ({ ...d1, mockFns }));
];
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// This file contains the test scenarios for the server-side events from the Shopify GraphQL API for
// the v1 transformation flow
import { mockFns } from '../mocks';
import { dummySourceConfig } from '../constants';
import { dummySourceConfig, note_attributes } from '../constants';

export const genericTrackTestScenarios = [
{
Expand All @@ -24,6 +24,7 @@ export const genericTrackTestScenarios = [
token: 'Z2NwLXVzLWVhc3QxOjAxSjdXRjdOQjY0NlFFNFdQVEg0MTRFM1E2',
line_items: [],
note: '',
note_attributes,
updated_at: '2024-09-17T08:15:13.280Z',
created_at: '2024-09-16T03:50:15.478Z',
},
Expand All @@ -43,7 +44,7 @@ export const genericTrackTestScenarios = [
output: {
batch: [
{
anonymousId: '5d3e2cb6-4011-5c9c-b7ee-11bc1e905097',
anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb',
context: {
integration: {
name: 'SHOPIFY',
Expand All @@ -58,6 +59,7 @@ export const genericTrackTestScenarios = [
id: 'Z2NwLXVzLWVhc3QxOjAxSjdXRjdOQjY0NlFFNFdQVEg0MTRFM1E2',
line_items: [],
note: '',
note_attributes,
token: 'Z2NwLXVzLWVhc3QxOjAxSjdXRjdOQjY0NlFFNFdQVEg0MTRFM1E2',
updated_at: '2024-09-17T08:15:13.280Z',
},
Expand Down Expand Up @@ -149,7 +151,7 @@ export const genericTrackTestScenarios = [
merchant_of_record_app_id: null,
name: '#1017',
note: null,
note_attributes: [],
note_attributes,
order_number: 1017,
original_total_additional_fees_set: null,
original_total_duties_set: null,
Expand Down Expand Up @@ -363,7 +365,7 @@ export const genericTrackTestScenarios = [
merchant_of_record_app_id: null,
name: '#1017',
note: null,
note_attributes: [],
note_attributes,
order_number: 1017,
original_total_additional_fees_set: null,
original_total_duties_set: null,
Expand Down Expand Up @@ -545,7 +547,7 @@ export const genericTrackTestScenarios = [
traits: {
email: '[email protected]',
},
anonymousId: '5d3e2cb6-4011-5c9c-b7ee-11bc1e905097',
anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb',
},
],
},
Expand Down
Loading