Created
August 31, 2018 16:37
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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