Showing curated campaigns on tags page.
This commit is contained in:
@@ -33,6 +33,26 @@ function curateCampaign(campaign) {
|
||||
};
|
||||
}
|
||||
|
||||
function selectRandomCampaign(primaryCampaigns, entityCampaigns, preferredCampaigns, allCampaigns, options) {
|
||||
if (primaryCampaigns.length > 0) {
|
||||
return primaryCampaigns[crypto.randomInt(primaryCampaigns.length)];
|
||||
}
|
||||
|
||||
if (entityCampaigns.length > 0) {
|
||||
return entityCampaigns[crypto.randomInt(entityCampaigns.length)];
|
||||
}
|
||||
|
||||
if (preferredCampaigns.length > 0) {
|
||||
return preferredCampaigns[crypto.randomInt(preferredCampaigns.length)];
|
||||
}
|
||||
|
||||
if (allCampaigns.length > 0 && options.allowRandomFallback !== false) {
|
||||
return allCampaigns[crypto.randomInt(allCampaigns.length)];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export async function getRandomCampaign(options = {}, context = {}) {
|
||||
const campaigns = options.campaigns
|
||||
|| await redis.hGetAll('traxxx:campaigns').then((rawCampaigns) => Object.values(rawCampaigns).map((rawCampaign) => JSON.parse(rawCampaign)));
|
||||
@@ -50,40 +70,40 @@ export async function getRandomCampaign(options = {}, context = {}) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (context.tagFilter && campaign.banner && campaign.banner.tags.some((tag) => context.tagFilter.includes(tag))) {
|
||||
if (context.tagFilter && campaign.banner && campaign.banner.tags.some((tag) => context.tagFilter.includes(tag) && !options.tagSlugs?.includes(tag))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// tag page overrides tag filter
|
||||
if (options.tagSlugs && campaign.banner && !campaign.banner.tags.some((tag) => options.tagSlugs.includes(tag))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
if (validCampaigns.length > 0) {
|
||||
const campaignsByEntityId = validCampaigns.reduce((acc, campaign) => {
|
||||
const entityId = campaign.entity.parent?.id || campaign.entity.id;
|
||||
// console.log(validCampaigns);
|
||||
|
||||
if (!acc[entityId]) {
|
||||
acc[entityId] = [];
|
||||
}
|
||||
const campaignsByEntityId = validCampaigns.reduce((acc, campaign) => {
|
||||
const entityId = campaign.entity.parent?.id || campaign.entity.id;
|
||||
|
||||
acc[entityId].push(campaign);
|
||||
if (!acc[entityId]) {
|
||||
acc[entityId] = [];
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
acc[entityId].push(campaign);
|
||||
|
||||
// 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)]];
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
const primaryCampaigns = randomEntityCampaigns.filter((campaign) => campaign.entity.id === options.entityIds?.[0]);
|
||||
// randomize entities first to ensure fair exposure for entities with fewer banners
|
||||
const entityIds = Object.keys(campaignsByEntityId);
|
||||
const randomEntityCampaigns = entityIds.length > 0 ? campaignsByEntityId[entityIds[crypto.randomInt(entityIds.length)]] : [];
|
||||
const primaryCampaigns = randomEntityCampaigns.filter((campaign) => campaign.entity.id === options.entityIds?.[0]);
|
||||
|
||||
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)];
|
||||
const randomCampaign = selectRandomCampaign(primaryCampaigns, randomEntityCampaigns, validCampaigns, campaigns, options);
|
||||
|
||||
return randomCampaign;
|
||||
}
|
||||
|
||||
return null;
|
||||
return randomCampaign;
|
||||
}
|
||||
|
||||
export async function getRandomCampaigns(allOptions = [], context = {}) {
|
||||
@@ -96,6 +116,10 @@ export async function getRandomCampaigns(allOptions = [], context = {}) {
|
||||
}, context)));
|
||||
}
|
||||
|
||||
export function getCampaignIndex(scenesCount) {
|
||||
return Math.floor((Math.random() * (0.5 - 0.2) + 0.2) * scenesCount); // avoid start and end of scenes list
|
||||
}
|
||||
|
||||
export async function cacheCampaigns() {
|
||||
const campaigns = await knex('campaigns')
|
||||
.select('campaigns.*')
|
||||
|
||||
Reference in New Issue
Block a user