import joi from "joi"; const baseRequestAuctionSchema = joi .object({ advert_id: joi.string(), user: { odid: joi.string(), }, app: joi.object().optional(), site: joi.object().optional(), campaigns: joi.array().min(1), device: { ip: joi.string(), os_type: joi.string(), user_agent: joi.string(), is_omid_compliant: joi.bool(), screen_size: joi.object().optional(), }, context: { country_code: joi.string(), auction_type: joi.string(), environment_type: joi.string(), }, }) .xor("app", "site"); const appRequestSchema = joi.object({ app: { name: joi.string(), bundle: joi.string(), }, }); const webRequestSchema = joi.object({ site: { name: joi.string(), domain: joi.string(), }, }); const screenSizeSchema = joi.object({ device: { screen_size: { width: joi.number(), height: joi.number(), density: joi.number().optional(), }, }, }); const successfulResponseSchema = joi.object({ advert_id: joi.string(), campaign: joi.number().min(1), advertiser_domain: joi.string(), price: joi.number(), seat: joi.string(), }); const emptyResponseSchema = joi.object({ advert_id: joi.string(), }); const validationOpts: joi.ValidationOptions = { presence: "required", allowUnknown: true, }; const validateWithSchema = (obj: any, schema: joi.Schema): Error | null => { const { error } = schema.validate(obj, validationOpts); return error || null; }; export const validateRequest = (req: any): Error | null => { const err = validateWithSchema(req, baseRequestAuctionSchema); if (err) { return err; } if (req.app) { const errApp = validateWithSchema(req, appRequestSchema); if (errApp != null) { return errApp; } } else { const errSite = validateWithSchema(req, webRequestSchema); if (errSite != null) { return errSite; } } if (req.device.screen_size) { const errScreenSize = validateWithSchema(req, screenSizeSchema); if (errScreenSize != null) { return errScreenSize; } } return null; }; export const validateResponse = (res: any): Error | null => { if (res?.campaign > 0) { return validateWithSchema(res, successfulResponseSchema); } return validateWithSchema(res, emptyResponseSchema); };