import { StepDecorator } from "./stepDecorator"; import { Step } from "../step"; import { Campaign, ChoiceRequest } from "../../models"; import { StepResult } from "../stepResult"; import logger from "../../utils/logger"; import { FeatureConfigService } from "../../services/FeatureConfig.service"; import IStepStatus = ogury.delivery.monitoring.DeliveryMonitoringMessage.IStepStatus; import ICreativeStatus = ogury.delivery.monitoring.DeliveryMonitoringMessage.ICreativeStatus; import { ogury } from "../../protos/protos"; class KafkaStep extends StepDecorator { private readonly featureConfigService: FeatureConfigService; constructor(step: Step) { super(step); this.featureConfigService = FeatureConfigService.getInstance(); } async execute(request: ChoiceRequest): Promise { const stepStatus: IStepStatus = this.initStepStatus(request); // execute step const result: StepResult = await this.step.execute(request); this.fillStepStatus(request, result, stepStatus); return result; } private initStepStatus(request: ChoiceRequest): IStepStatus { return { step: this.step.getName(), campaigns_statuses: request.campaigns.map((campaign: Campaign) => { let creativeStatuses: ICreativeStatus[] = []; if (this.step.shouldReportCreativeFiltering() && campaign.creatives) { creativeStatuses = campaign.creatives.map((creativeId: number) => { return { creative_id: creativeId, creative_passing: false, }; }); } return { campaign_id: parseInt(campaign.id), campaign_passing: false, creatives_statuses: creativeStatuses, }; }), }; } private fillStepStatus(request: ChoiceRequest, result: StepResult, stepStatus: IStepStatus) { // fill stepStatus object result.passedCampaigns.forEach((campaign) => { const campaignStatus = stepStatus.campaigns_statuses?.find( (cs) => cs.campaign_id === parseInt(campaign.id) ); if (!campaignStatus) { logger.error( new Error( `Campaign ${campaign.id} is in output of step ${this.step.getName()} but not in input` ) ); } else { campaignStatus.campaign_passing = true; if (this.step.shouldReportCreativeFiltering() && campaign.creatives) { campaignStatus.creatives_statuses?.map((creative_status) => { if (creative_status.creative_id) { creative_status.creative_passing = campaign.creatives?.includes( creative_status.creative_id ); } return creative_status; }); } } }); request.stepsStatuses.push(stepStatus); } } export default KafkaStep;