import { ObjectSchema } from "joi"; import { FeatureConfigService } from "../services/FeatureConfig.service"; import MetricService, { BucketSet } from "../services/metric.service"; import { RequestInventorySource } from "../models"; import logger from "../utils/logger"; const featureConfigService = FeatureConfigService.getInstance(); const metricService = MetricService.getInstance(); export const validationSection = "request_validation"; metricService.addSection( validationSection, ["inventory_source", "environment_type", "device_os", "skipped"], BucketSet.zeroTo5ms ); export function validate( request: any, schemaValidation: ObjectSchema, inventorySource: RequestInventorySource ): string | undefined { const end = metricService.startSection(validationSection); const validationMode = getValidationMode(inventorySource); if (validationMode === "disabled") { end(true, { inventory_source: inventorySource, skipped: "true" }); return; } const validationResult = schemaValidation.validate(request); const validationError = validationResult.error?.message; end(!validationError, { inventory_source: inventorySource, skipped: "false" }); if (validationError) { logger.error(new Error(`[${inventorySource}] request validation error: ${validationError}`), { req_body: request, }); if (validationMode === "enabled") { return validationError; } } } export function getValidationMode(inventorySource: RequestInventorySource) { return featureConfigService.getParameterValue( null, `ms-choices.validation-mode${ inventorySource === RequestInventorySource.EXTERNAL ? "-external" : "" }`, "disabled" ); }