import _ from "lodash"; import { Request, Response } from "express"; import { DVFraudService } from "../services/dvFraud.service"; import { BaseController } from "./BaseController"; import logger from "../utils/logger"; export class FraudController extends BaseController { constructor(private readonly dvFraudService: DVFraudService) { super(); this.get("/check-fraud", this.checkFraudHandler); } async checkFraudHandler(req: Request, res: Response) { try { const output = await this.checkFraud(req.query); res.status(200).json(output); } catch (err: any) { logger.error(err); res.status(500).send(); } } async checkFraud(query: any): Promise { const input: CheckFraudInput = { android: this.parseQueryParameter(query.android), ios: this.parseQueryParameter(query.ios), web: this.parseQueryParameter(query.web), }; const output: CheckFraudOutput = { android: await this.processIdList(input.android, false), ios: await this.processIdList(input.ios, false), web: await this.processIdList(input.web, true), }; return output; } parseQueryParameter(param: string | string[]): string[] { if (!param) { return []; } else if (_.isArray(param)) { return param; } else { return param.split(","); } } async processIdList(ids: string[], isWeb: boolean): Promise | undefined> { if (ids.length === 0) { return undefined; } const output: Record = {}; for (const id of ids) { const cmds = isWeb ? this.dvFraudService.getWebCmds(id) : [this.dvFraudService.getAppCmd(id)]; const results = await Promise.all(cmds.map((c) => this.dvFraudService.isBlacklisted(c))); output[id] = results.some((r) => r.isFraud); } return output; } } type CheckFraudInput = { android: string[]; ios: string[]; web: string[]; }; type CheckFraudOutput = { android?: Record; ios?: Record; web?: Record; };