import { ChoiceRequest } from "../../models"; import { StepResult } from "../stepResult"; import { CategoryProviderType, CategoryRating, FraudSeverity, stringToFraudSeverity, } from "../../categories/categoryProvider"; import { CampaignModel } from "../../models/CampaignModel"; import AbstractPrebidStep from "./abstractPrebid.step"; export default class PublisherFraudStep extends AbstractPrebidStep { defaultPublisherFraudThreshold = FraudSeverity.High; constructor( campaignModel: CampaignModel, categoryProviderType: CategoryProviderType, enableInApp: boolean ) { super("publisher_fraud", campaignModel, categoryProviderType, enableInApp, [ "publisher_fraud_high", "publisher_fraud_medium", ]); } async run(request: ChoiceRequest): Promise { const passUnknown: boolean = this.featureConfigService.getBooleanValue( request, "ms-choices.publisher-fraud.allow-unknown." + this.categoryProviderType, false ); const fraudSeverityName: string = this.featureConfigService.getStringValue( request, "ms-choices.publisher-fraud.severity." + this.categoryProviderType, this.defaultPublisherFraudThreshold ); const fraudSeverityThreshold = stringToFraudSeverity( fraudSeverityName, this.defaultPublisherFraudThreshold ); const result: StepResult = new StepResult(); const isWebMobile = request.isWeb; if (this.isBypassed(request, result)) { return result; } const bsValues = await this.categoryService.getPublisherCategoryValue( request, this.categoryProviderType ); const bsValue: CategoryRating = bsValues.getPublisherFraud(fraudSeverityThreshold) || CategoryRating.Safe; const brandSafe: boolean = bsValue === CategoryRating.Safe || (bsValue === CategoryRating.Unknown && passUnknown); const metrics = new Map([ ["publisher_fraud_high", bsValues.getPublisherFraud(FraudSeverity.High)], ["publisher_fraud_medium", bsValues.getPublisherFraud(FraudSeverity.Medium)], ]); this.addMetadataResult(request, bsValue); this.fillStepResult(request, result, isWebMobile, brandSafe, false, metrics); return result; } }