Skip to content

Instantly share code, notes, and snippets.

@michaelwclark
Created August 31, 2018 16:37
Show Gist options
  • Select an option

  • Save michaelwclark/63f15792069d0718bcd219bb9d45123f to your computer and use it in GitHub Desktop.

Select an option

Save michaelwclark/63f15792069d0718bcd219bb9d45123f to your computer and use it in GitHub Desktop.
functional fuckery to fucking fuck it up all the fucking time. Pardon my fucking french
const flat = arr => arr.reduce((a, c) => [...a, ...c])
const unique = arr =>
arr.reduce((a, c) => (a.includes(c) ? [...a] : [...a, c]), [])
const normalizeBy = (arr, key) =>
arr.reduce((a, c) => ({ [c[key]]: c, ...a }), {})
const normalizeByMongoId = arr => normalizeBy(arr, '_id')
Object.entries({ flat, unique, normalizeByMongoId, normalizeBy }).map(
arrayFunction =>
Array.prototype[arrayFunction[0]] = function () {
return arrayFunction[1].call(null, this, ...arguments)
}
)
const DenimFacebookAdAccounts = {
act_1: {
_id: 'act_1',
name: 'Account 1',
ad_account_id:'adactid1',
fb_token:'fbtoken1',
},
act_2:{
_id: 'act_2',
name: 'Account 2',
ad_account_id:'adactid2',
fb_token:'fbtoken2',
}
}
const DenimFacebookCampaigns = [
{name:"Campaign1", _id:1, denim_fb_ad_account_id:'act_1', ad_set_ids: ['as1','as2'], ad_ids:['a1','a2']},
{name:"Campaign2", _id:2, denim_fb_ad_account_id:'act_1', ad_set_ids: ['as3','as4'], ad_ids:['a3','a4']},
{name:"Campaign3", _id:3, denim_fb_ad_account_id:'act_2', ad_set_ids: ['as5','as6'], ad_ids:['a5','a6']},
{name:"Campaign4", _id:4, denim_fb_ad_account_id:'act_1', ad_set_ids: ['as7','as8'], ad_ids:['a7','a8']},
{name:"Campaign5", _id:5, denim_fb_ad_account_id:'act_2', ad_set_ids: ['as9','as10'], ad_ids:['a9','a10']},
]
x = DenimFacebookCampaigns.map(_=>_.denim_fb_ad_account_id).unique()
async function getDenimFacebookAdAccountIdById (id) {
return Promise.resolve(DenimFacebookAdAccounts[id])
}
async function getUniqueNormalizedDenimFacebookAdAccountsFromDenimFacebookCampaigns(DenimFacebookCampaigns){
const denimFacebookAdAccountLookupPromises =
DenimFacebookCampaigns
.map(_=>_.denim_fb_ad_account_id)
.unique()
.map(getDenimFacebookAdAccountIdById)
const denimFacebookAdAccounts = await Promise.all(denimFacebookAdAccountLookupPromises)
return denimFacebookAdAccounts.normalizeByMongoId()
}
function getDenimFacebookAdAccountInfo(denimFacebookAccount) {
return {
ad_account_id:denimFacebookAccount.ad_account_id,
fb_token:denimFacebookAccount.fb_token,
}
}
function combineAdSetCampaignAndAccountDataForOWInvocation(denimFacebookCampaignParams){
//input 2 objects, output 1 list
const adSetIds = denimFacebookCampaignParams.denimFbCampaign.ad_set_ids
return adSetIds.reduce((a, c) => {
return [...a, {
name:'update-facebook-ad-set-insights',
blocking: false,
params: {
denimFacebookAdSetId:c,
fbCampaign: denimFacebookCampaignParams.denimFbCampaign,
...denimFacebookCampaignParams.accountData
}
}]
}, [])
}
function combineAdCampaignAndAccountDataForOWInvocation( denimFacebookCampaignParams){
const adIds = denimFacebookCampaignParams.denimFbCampaign.ad_ids
return adIds.reduce((a, c) => {
return [...a, {
name:'update-facebook-ad-insights',
blocking: false,
params: {
denimFacebookAdId:c,
fbCampaign: denimFacebookCampaignParams.denimFbCampaign,
...denimFacebookCampaignParams.accountData
}
}]
}, [])}
function combineCampaignAndAdAccountForOWInvocation(denimFacebookCampaignParams){
return {
name:'update-facebook-campaign-insights',
blocking: false,
params: {
denimFacebookCampaign:denimFacebookCampaignParams.denimFbCampaign,
...denimFacebookCampaignParams.accountData
}
}
}
function injectDenimFacebookAdAccountIntoOwInvocationParams(normalizedAccountLookup, denimFacebookCampaign){
const accountData = getDenimFacebookAdAccountInfo(normalizedAccountLookup[denimFacebookCampaign.denim_fb_ad_account_id])
return {
accountData,
denimFbCampaign: denimFacebookCampaign
}
}
const OWService = function(){
let numInvokes=0;
return {
actions:{
invoke:(params)=>{
console.log(`invoked ${++numInvokes}`)
return true
}
}
}
}
function owParamBuilder(owParams){
return [
combineCampaignAndAdAccountForOWInvocation(owParams), //1 campaign invocation
...combineAdSetCampaignAndAccountDataForOWInvocation(owParams), //multiple adset invocations
...combineAdCampaignAndAccountDataForOWInvocation(owParams), //multiple ad invocations
]
}
async function entry(denimFacebookCampaigns){
const normalizedDenimFacebookAdAccountsLookup = await getUniqueNormalizedDenimFacebookAdAccountsFromDenimFacebookCampaigns(denimFacebookCampaigns)
const accountInjector = injectDenimFacebookAdAccountIntoOwInvocationParams.bind(null, normalizedDenimFacebookAdAccountsLookup)
const ow = OWService()
denimFacebookCampaigns
.map(campaign => accountInjector(campaign))
.map(owParams =>[
combineCampaignAndAdAccountForOWInvocation(owParams), //1 campaign invocation
...combineAdSetCampaignAndAccountDataForOWInvocation(owParams), //multiple adset invocations
...combineAdCampaignAndAccountDataForOWInvocation(owParams), //multiple ad invocations
] )
.flat()
.map(owParams => ow.actions.invoke(owParams))
}
x = entry(DenimFacebookCampaigns)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment