import { ChoiceRequest } from "../../models"; import { StepResult } from "../stepResult"; import { CategoryProviderType } from "../../categories/categoryProvider"; import { CampaignModel } from "../../models/CampaignModel"; import AbstractPrebidStep from "./abstractPrebid.step"; export default class BrandSuitabilityStep extends AbstractPrebidStep { constructor( campaignModel: CampaignModel, categoryProviderType: CategoryProviderType, enableInApp: boolean ) { super("brand_suitability", campaignModel, categoryProviderType, enableInApp); } async run(request: ChoiceRequest): Promise { const result: StepResult = new StepResult(); const isWebMobile = request.isWeb; if (this.isBypassed(request, result)) { return result; } const passUnknown: boolean = this.featureConfigService.getBooleanValue( request, "ms-choices.brand-suitability.allow-unknown." + this.categoryProviderType, false ); const bsValues = await this.categoryService.getPublisherCategoryValue( request, this.categoryProviderType ); request.campaigns.forEach((campaign) => { const prebids = CampaignModel.getPrebid( request.campaignData[campaign.id], "brand-suitability", this.categoryProviderType ); if (prebids.length === 0) { result.ignoreCampaigns(campaign); } else { let blocked = false; prebid: for (const prebid of prebids) { if (prebid.segment) { for (const segment of prebid.segment.split(",")) { if (!bsValues.isBrandSuitable(segment, passUnknown)) { blocked = true; break prebid; } } } } if (!blocked) { result.passCampaigns(campaign); } } return true; }); this.fillStepResultMetric(result, isWebMobile, true); return result; } }