Skip to content

Commit

Permalink
joined results queries results
Browse files Browse the repository at this point in the history
  • Loading branch information
openfn[bot] authored and github-actions[bot] committed Feb 6, 2025
1 parent 13c8f36 commit d0e4d95
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 6 deletions.
6 changes: 3 additions & 3 deletions openfn-f07240d8-8bb7-4cff-9e20-cc8d8059892f-state.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@
"Remove-Deleted-Campaign-Members/Tags": {
"id": "273e2c2a-a97d-49eb-bebb-2dad0666a716",
"name": "Remove Deleted Campaign Members/Tags",
"inserted_at": "2025-02-04T13:15:40.333004Z",
"lock_version": 216,
"inserted_at": "2025-02-06T09:54:51.723325Z",
"lock_version": 230,
"triggers": {
"cron": {
"enabled": false,
Expand All @@ -129,7 +129,7 @@
"Get-deleted-campaign-members": {
"id": "de821b2b-f7f8-4cc3-ad8f-c746c8698b0f",
"name": "Get deleted campaign members",
"body": "// To test with manual cursor simply create a new input with lastRunTime as the manual cursor\n// cursor($.lastRunTime || '2023-08-16T15:30:00.000Z', { key: 'lastSyncTime' });\n// cursor('now', { key: 'lastRunTime', format: c => new Date(c).toISOString() });\nfn(state => {\n delete state?.members\n delete state?.references\n const manualCursor = '2023-08-16T15:30:00.000Z'; // SF timestamp\n state.lastSyncTime = state.lastRunTime || manualCursor;\n state.lastRunTime = new Date().toISOString();\n return state;\n});\n\n//Get Deleted Campaign Member Records in Salesforce since last run\nbulkQuery(\n `SELECT Contact__r.Id, Contact__r.Name, Email__c, Nome_da_Tag__c FROM Deleted_Campaign_Member__c WHERE CreatedDate > ${$.lastSyncTime}`\n).then(state => {\n const uniqueContactsMap = new Map();\n state.data.forEach(contact => {\n uniqueContactsMap.set(contact['Contact__r.Id'], contact);\n });\n\n const uniqueContacts = Array.from(uniqueContactsMap.values());\n state.deletedMembers = uniqueContacts;\n state.contactIdsList = uniqueContacts\n .map(contact => `'${contact['Contact__r.Id']}'`)\n .join(', ');\n\n console.log('Unique Contact IDs List:', uniqueContacts?.length);\n return state;\n});\n\nfnIf(!$.contactIdsList, state => {\n console.log('No contact IDs found. Skipping second bulk query.');\n return state;\n});\n\n//Get corresponding Campaign Member details for Deleted Campaign Members\nfnIf(\n $.contactIdsList,\n bulkQuery(\n `SELECT Contact.Id, Contact.Name, Contact.Email, Campaign_Tag_Name__c FROM CampaignMember WHERE Campaign.RecordType.Name = 'Grupos, RTs ou Áreas Temáticas' AND Campaign.IsActive = true AND Contact.Id IN (${$.contactIdsList})`\n ).then(state => {\n const campaginMembers = state.data;\n console.log(campaginMembers.length, 'Deleted Campaign Members');\n if (!campaginMembers.length > 0) {\n console.log(\n 'No campaing members found for contacts ids: ',\n state.contactIdsList\n );\n return state;\n }\n\n let mergeMemberTags = [];\n for (const member of campaginMembers) {\n const email = member['Contact.Email'];\n const campaignName = member.Campaign_Tag_Name__c;\n // Find the existing mapped member for this email\n const existingMember = mergeMemberTags.find(\n item => item.email_address === email\n );\n if (existingMember) {\n // If the email already exists, add the campaign name to its tags array\n existingMember.tags.push(campaignName);\n } else {\n // If the email doesn't exist, create a new mapped member\n const newMember = {\n email_address: email,\n tags: [campaignName].map(str => str.replace(/\\n/g, '')),\n email_type: 'html',\n };\n mergeMemberTags.push(newMember);\n }\n }\n console.log(mergeMemberTags.length, 'Retrieved mapped members');\n\n state.members = [...chunk(mergeMemberTags, 500)];\n return state;\n })\n);\n\nfnIf(!$.members && $.deletedMembers.length > 0, state => {\n console.log('Query 2 had 0 results mapping using query 1');\n state.members = [...chunk(state.deletedMembers.map(m => ({\n email_address: m['Email__c'],\n tags: [],\n email_type: 'html',\n })), 500)];\n return state;\n});\n",
"body": "// To test with manual cursor simply create a new input with lastRunTime as the manual cursor\n// cursor($.lastRunTime || '2023-08-16T15:30:00.000Z', { key: 'lastSyncTime' });\n// cursor('now', { key: 'lastRunTime', format: c => new Date(c).toISOString() });\nfn(state => {\n delete state?.members\n delete state?.references\n const manualCursor = '2023-08-16T15:30:00.000Z'; // SF timestamp\n state.lastSyncTime = state.lastRunTime || manualCursor;\n state.lastRunTime = new Date().toISOString();\n return state;\n});\n\n//Get Deleted Campaign Member Records in Salesforce since last run\nbulkQuery(\n `SELECT Contact__r.Id, Contact__r.Name, Email__c, Nome_da_Tag__c FROM Deleted_Campaign_Member__c WHERE CreatedDate > ${$.lastSyncTime}`\n).then(state => {\n const uniqueContactsMap = new Map();\n state.data.forEach(contact => {\n uniqueContactsMap.set(contact['Contact__r.Id'], contact);\n });\n\n const uniqueContacts = Array.from(uniqueContactsMap.values());\n state.deletedMembers = uniqueContacts;\n state.contactIdsList = uniqueContacts\n .map(contact => `'${contact['Contact__r.Id']}'`)\n .join(', ');\n\n console.log('Unique Contact IDs List:', uniqueContacts?.length);\n return state;\n});\n\nfnIf(!$.contactIdsList, state => {\n console.log('No contact IDs found. Skipping second bulk query.');\n return state;\n});\n\n//Get corresponding Campaign Member details for Deleted Campaign Members\nfnIf(\n $.contactIdsList,\n bulkQuery(\n `SELECT Contact.Id, Contact.Name, Contact.Email, Campaign_Tag_Name__c FROM CampaignMember WHERE Campaign.RecordType.Name = 'Grupos, RTs ou Áreas Temáticas' AND Campaign.IsActive = true AND Contact.Id IN (${$.contactIdsList})`\n ).then(state => {\n const deletedMembers = state.deletedMembers.map(i => ({\n \"Campaign_Tag_Name__c\": \"\",\n \"Contact.Email\": i[\"Email__c\"],\n \"Contact.Id\": i[\"Contact__r.Id\"],\n \"Contact.Name\": i[\"Contact__r.Name\"]\n\n }))\n const campaginMembers = [...state.data, ...deletedMembers];\n \n\n console.log(campaginMembers.length, 'Deleted Campaign Members');\n if (!campaginMembers.length > 0) {\n console.log(\n 'No campaing members found for contacts ids: ',\n state.contactIdsList\n );\n return state;\n }\n\n let mergeMemberTags = [];\n for (const member of campaginMembers) {\n const email = member['Contact.Email'];\n const campaignName = member.Campaign_Tag_Name__c;\n // Find the existing mapped member for this email\n const existingMember = mergeMemberTags.find(\n item => item.email_address === email\n );\n if (existingMember) {\n console.log('Existing member found', { campaignName });\n // If the email already exists, add the campaign name to its tags array\n campaignName && existingMember.tags.push(campaignName);\n } else {\n // If the email doesn't exist, create a new mapped member\n const newMember = {\n email_address: email,\n tags: campaignName\n ? [campaignName].map(str => str.replace(/\\n/g, ''))\n : [],\n email_type: 'html',\n };\n mergeMemberTags.push(newMember);\n }\n }\n console.log(mergeMemberTags.length, 'Retrieved mapped members');\n\n state.members = [...chunk(mergeMemberTags, 500)];\n return state;\n })\n);\n\nfnIf(!$.members && $.deletedMembers.length > 0, state => {\n console.log('Query 2 had 0 results mapping using query 1');\n state.members = [...chunk(state.deletedMembers.map(m => ({\n email_address: m['Email__c'],\n tags: [],\n email_type: 'html',\n })), 500)];\n return state;\n});\n",
"adaptor": "@openfn/[email protected]",
"project_credential_id": "becd5822-0191-4800-8a19-c7e24ff3589c"
},
Expand Down
18 changes: 15 additions & 3 deletions workflows/remove-members/fetch-deleted.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,16 @@ fnIf(
bulkQuery(
`SELECT Contact.Id, Contact.Name, Contact.Email, Campaign_Tag_Name__c FROM CampaignMember WHERE Campaign.RecordType.Name = 'Grupos, RTs ou Áreas Temáticas' AND Campaign.IsActive = true AND Contact.Id IN (${$.contactIdsList})`
).then(state => {
const campaginMembers = state.data;
const deletedMembers = state.deletedMembers.map(i => ({
"Campaign_Tag_Name__c": "",
"Contact.Email": i["Email__c"],
"Contact.Id": i["Contact__r.Id"],
"Contact.Name": i["Contact__r.Name"]

}))
const campaginMembers = [...state.data, ...deletedMembers];


console.log(campaginMembers.length, 'Deleted Campaign Members');
if (!campaginMembers.length > 0) {
console.log(
Expand All @@ -59,13 +68,16 @@ fnIf(
item => item.email_address === email
);
if (existingMember) {
console.log('Existing member found', { campaignName });
// If the email already exists, add the campaign name to its tags array
existingMember.tags.push(campaignName);
campaignName && existingMember.tags.push(campaignName);
} else {
// If the email doesn't exist, create a new mapped member
const newMember = {
email_address: email,
tags: [campaignName].map(str => str.replace(/\n/g, '')),
tags: campaignName
? [campaignName].map(str => str.replace(/\n/g, ''))
: [],
email_type: 'html',
};
mergeMemberTags.push(newMember);
Expand Down

0 comments on commit d0e4d95

Please sign in to comment.