Randomizing campaigns by entity to ensure equal exposure.

This commit is contained in:
2024-06-13 03:10:11 +02:00
parent 5291b11c1f
commit 25ce0fe1ec
3 changed files with 22 additions and 5 deletions

View File

@@ -57,12 +57,28 @@ export async function getRandomCampaign(options = {}, context = {}) {
return true;
});
const primaryCampaigns = validCampaigns.filter((campaign) => campaign.entity.id === options.entityIds?.[0]);
const campaignsByEntityId = validCampaigns.reduce((acc, campaign) => {
const entityId = campaign.entity.parent?.id || campaign.entity.id;
if (!acc[entityId]) {
acc[entityId] = [];
}
acc[entityId].push(campaign);
return acc;
}, {});
// randomize entities first to ensure fair exposure for entities with fewer banners
const entityIds = Object.keys(campaignsByEntityId);
const randomEntityCampaigns = campaignsByEntityId[entityIds[crypto.randomInt(entityIds.length)]];
const primaryCampaigns = randomEntityCampaigns.filter((campaign) => campaign.entity.id === options.entityIds?.[0]);
if (validCampaigns.length > 0) {
const randomCampaign = primaryCampaigns.length > 0
? primaryCampaigns[crypto.randomInt(primaryCampaigns.length)]
: validCampaigns[crypto.randomInt(validCampaigns.length)];
const randomCampaign = (primaryCampaigns.length > 0 ? primaryCampaigns[crypto.randomInt(primaryCampaigns.length)] : null)
|| (randomEntityCampaigns.length > 0 ? randomEntityCampaigns[crypto.randomInt(randomEntityCampaigns.length)] : null)
|| validCampaigns[crypto.randomInt(validCampaigns.length)];
return randomCampaign;
}