import _ from "lodash"; import { Campaign, ChoiceRequest, CampaignGroup, splitReqCampaignGroups } from "../../models"; import { StepResult } from "../stepResult"; import { AbstractStep } from "../abstractStep"; import { MsAuctionService } from "../../services/auction/MsAuction.service"; import logger from "../../utils/logger"; import { BucketSet } from "../../services/metric.service"; class MarketplaceResponseStep extends AbstractStep { constructor(private readonly msAuctionService: MsAuctionService) { super("marketplace_selected"); this.metricBucket = BucketSet.zeroTo600ms; this.autoPassCampaignGroup = CampaignGroup.Fallback; } async run(request: ChoiceRequest): Promise { const result: StepResult = new StepResult(); const [marketplaceCampaigns, otherCampaigns] = splitReqCampaignGroups( request, CampaignGroup.Marketplace ); if (otherCampaigns.length > 0 || marketplaceCampaigns.length === 0) { result.passCampaigns(...otherCampaigns); return result; } const marketplaceResult = await this.getMarketplaceResult(request, marketplaceCampaigns); if (marketplaceResult != null) { const campaignData = request.campaignData[marketplaceResult.id]; marketplaceResult.metadata.creative_id = campaignData.creatives?.[0]?.id; result.passCampaigns(marketplaceResult); } return result; } async getMarketplaceResult( request: ChoiceRequest, marketplaceCampaigns: Campaign[] ): Promise { const [privateAuctionCampaigns, openAuctionAuctionCampaigns] = _.partition( marketplaceCampaigns, (c) => request.campaignData[c.id].prog_deal_id?.trim() ); let marketplaceResult: Campaign | null = null; if (privateAuctionCampaigns.length > 0) { logger.debug(() => `[PRIVATE_AUCTION] Call auction endpoint`); marketplaceResult = await this.msAuctionService.getAuctionCampaign( request, privateAuctionCampaigns, "private_auction" ); logger.debug( () => `[PRIVATE_AUCTION] Resp auction endpoint: ${JSON.stringify(marketplaceResult)}` ); } if (!marketplaceResult && openAuctionAuctionCampaigns.length > 0) { logger.debug(() => `[OPEN_AUCTION] Call auction endpoint`); marketplaceResult = await this.msAuctionService.getAuctionCampaign( request, openAuctionAuctionCampaigns, "open_auction" ); logger.debug( () => `[OPEN_AUCTION] Resp auction endpoint: ${JSON.stringify(marketplaceResult)}` ); } return marketplaceResult; } } export default MarketplaceResponseStep;