import { ChoiceRequest, RequestInventorySource } from "../../models"; import { ContextFeatures, ContextHashMap } from "../scoringSystem/contextHashMap.service"; import { CampaignCreative } from "../../steps/ordering/ordering.model"; import logger from "../../utils/logger"; const LOG_ID = "[CONTEXT_SERVICE]"; /** * This class is responsible for getting scores from a hashMaps. */ export class ContextService { constructor(private readonly contextHashMap: ContextHashMap) {} /** * add accomplished score and context accomplished score and average campaign score accomplished in metadata */ async addScores(request: ChoiceRequest, campaignCreatives: CampaignCreative[]) { campaignCreatives.forEach((campaignCreative) => { const campaignScore = this.getContextHashMapScore(request, campaignCreative); campaignCreative.metadata.context_score = campaignScore != null && campaignScore >= 0 ? campaignScore : null; campaignCreative.metadata.acc_rate = campaignCreative.metadata.context_score; campaignCreative.metadataTmp.accMetadata = this.contextHashMap.getStatistics( campaignCreative.metadataTmp.economicType, campaignCreative.metadataTmp.format, campaignCreative.campaign.id ); logger.debug( () => `${LOG_ID} campaign ${ campaignCreative.campaign.id } has acc-rate score of ${campaignScore} with metadata ${JSON.stringify( campaignCreative.metadataTmp.accMetadata )}` ); }); } getContextHashMapScore( request: ChoiceRequest, campaignCreative: CampaignCreative ): number | undefined { return this.contextHashMap.getScore( this.buildFeaturesFromRequest(request, campaignCreative), request ); } buildFeaturesFromRequest( request: ChoiceRequest, campaignCreative: CampaignCreative ): ContextFeatures { const isHeaderBidding = request.inventory_source === RequestInventorySource.HEADER_BIDDING; const priceModel = isHeaderBidding ? "first_price" : "fixed_price"; const assetId = request.isWeb ? request.site?.domain : request.app?.bundle_id?.toLowerCase().replace(/_/g, "-"); const result = { economicType: campaignCreative.metadataTmp.economicType, format: campaignCreative.metadataTmp.format, ssp: request.context?.ssp, campaignId: campaignCreative.campaign.id, assetId, assetUnit: request.isWeb ? request.site?.page : request.app?.ad_unit_id, // price model new features environmentType: request.environment_type, priceModel: priceModel, adUnitType: request.app?.ad_unit_type, //temporary remove advertType: request.app.advert_type apiKey: request.app?.app_api_key?.toString(), }; logger.debug(() => `${LOG_ID} ContextFeatures: ${JSON.stringify(result)}`); return result; } }