From e620e9db1c285eae3879b303bac298cc092900a9 Mon Sep 17 00:00:00 2001 From: Potenz Date: Fri, 4 Jul 2025 23:54:33 +0530 Subject: [PATCH] updated only --- .../src/routes/insuranceEligibility.ts | 92 +++++++++++++++++++ ...leniumClient.ts => seleniumClaimClient.ts} | 0 .../src/services/seleniumEligibilityClient.ts | 52 +++++++++++ 3 files changed, 144 insertions(+) create mode 100644 apps/Backend/src/routes/insuranceEligibility.ts rename apps/Backend/src/services/{seleniumClient.ts => seleniumClaimClient.ts} (100%) create mode 100644 apps/Backend/src/services/seleniumEligibilityClient.ts diff --git a/apps/Backend/src/routes/insuranceEligibility.ts b/apps/Backend/src/routes/insuranceEligibility.ts new file mode 100644 index 0000000..72d3df3 --- /dev/null +++ b/apps/Backend/src/routes/insuranceEligibility.ts @@ -0,0 +1,92 @@ +import { Router } from "express"; +import { Request, Response } from "express"; +import { storage } from "../storage"; +import { z } from "zod"; +import multer from "multer"; +import { forwardToSeleniumAgent } from "../services/seleniumClaimClient"; + +const router = Router(); + + + + +// Routes +const multerStorage = multer.memoryStorage(); // NO DISK +const upload = multer({ + storage: multerStorage, + limits: { fileSize: 5 * 1024 * 1024 }, // 5MB limit per file + fileFilter: (req, file, cb) => { + const allowed = [ + "application/pdf", + "image/jpeg", + "image/png", + "image/webp", + ]; + if (allowed.includes(file.mimetype)) { + cb(null, true); + } else { + cb(new Error("Unsupported file type")); + } + }, +}); + +router.post( + "/selenium", + upload.fields([ + { name: "pdfs", maxCount: 10 }, + { name: "images", maxCount: 10 }, + ]), + async (req: Request, res: Response): Promise => { + if (!req.files || !req.body.data) { + return res + .status(400) + .json({ error: "Missing files or claim data for selenium" }); + } + + if (!req.user || !req.user.id) { + return res.status(401).json({ error: "Unauthorized: user info missing" }); + } + + try { + const claimData = JSON.parse(req.body.data); + const pdfs = + (req.files as Record).pdfs ?? []; + const images = + (req.files as Record).images ?? []; + + const credentials = await storage.getInsuranceCredentialByUserAndSiteKey( + req.user.id, + claimData.insuranceSiteKey + ); + if (!credentials) { + return res + .status(404) + .json({ error: "No insurance credentials found for this provider." }); + } + + const enrichedData = { + ...claimData, + massdhpUsername: credentials.username, + massdhpPassword: credentials.password, + }; + + const result = await forwardToSeleniumAgent(enrichedData, [ + ...pdfs, + ...images, + ]); + + res.json({ + ...result, + claimId: claimData.claimId, + }); + } catch (err: any) { + console.error(err); + return res.status(500).json({ + error: err.message || "Failed to forward to selenium agent", + }); + } + } +); + + +export default router; \ No newline at end of file diff --git a/apps/Backend/src/services/seleniumClient.ts b/apps/Backend/src/services/seleniumClaimClient.ts similarity index 100% rename from apps/Backend/src/services/seleniumClient.ts rename to apps/Backend/src/services/seleniumClaimClient.ts diff --git a/apps/Backend/src/services/seleniumEligibilityClient.ts b/apps/Backend/src/services/seleniumEligibilityClient.ts new file mode 100644 index 0000000..d658f9d --- /dev/null +++ b/apps/Backend/src/services/seleniumEligibilityClient.ts @@ -0,0 +1,52 @@ +import axios from "axios"; + +export interface SeleniumPayload { + claim: any; + pdfs: { + originalname: string; + bufferBase64: string; + }[]; + images: { + originalname: string; + bufferBase64: string; + }[]; +} + +export async function forwardToSeleniumAgent( + claimData: any, + files: Express.Multer.File[] +): Promise { + const pdfs = files + .filter((file) => file.mimetype === "application/pdf") + .map((file) => ({ + originalname: file.originalname, + bufferBase64: file.buffer.toString("base64"), + })); + + const images = files + .filter((file) => file.mimetype.startsWith("image/")) + .map((file) => ({ + originalname: file.originalname, + bufferBase64: file.buffer.toString("base64"), + })); + + const payload: SeleniumPayload = { + claim: claimData, + pdfs, + images, + }; + + const result = await axios.post( + "http://localhost:5002/eligibiliy-check", + payload + ); + if (result.data.status === "error") { + const errorMsg = + typeof result.data.message === "string" + ? result.data.message + : result.data.message?.msg || "Selenium agent error"; + throw new Error(errorMsg); + } + + return result.data; +} \ No newline at end of file