import { Router, Request, Response } from "express"; import { storage } from "../storage"; import { enqueueSeleniumJob } from "../queue/jobRunner"; import { forwardOtpToSeleniumUnitedDHClaimAgent } from "../services/seleniumUnitedDHClaimClient"; import { io } from "../socket"; const router = Router(); /** * POST /uniteddh-claim * * Enqueues a United/DentalHub claim submission job. * * Body fields (JSON): * data — claim payload (memberId, dateOfBirth, serviceDate, serviceLines, patientName, etc.) * socketId — socket.io client id * claimId — existing claim DB id (optional) * * Response: { status: "queued", jobId: "…" } */ router.post("/uniteddh-claim", async (req: Request, res: Response): Promise => { if (!req.user?.id) { return res.status(401).json({ error: "Unauthorized: user info missing" }); } try { const claimData = typeof req.body.data === "string" ? JSON.parse(req.body.data) : req.body.data ?? req.body ?? {}; // Fetch United/DentalHub credentials — same portal as UnitedSCO const credentials = await storage.getInsuranceCredentialByUserAndSiteKey( req.user.id, "UNITED_SCO" ); if (!credentials) { return res.status(404).json({ error: "No United/DentalHub credentials found. Please add them on the Settings page.", }); } const enrichedPayload = { claim: { ...claimData, uniteddhUsername: credentials.username, uniteddhPassword: credentials.password, }, }; const socketId: string | undefined = req.body.socketId; const claimId: number | undefined = claimData.claimId ? Number(claimData.claimId) : undefined; const jobId = enqueueSeleniumJob({ jobType: "uniteddh-claim-submit", userId: req.user.id, socketId, enrichedPayload, claimId, }); return res.json({ status: "queued", jobId }); } catch (err: any) { console.error("[uniteddh-claim route] error:", err); return res.status(500).json({ error: err.message || "Failed to enqueue United/DentalHub claim job", }); } }); /** * POST /claims/uniteddh-claim/selenium/submit-otp * Body: { session_id, otp, socketId? } */ router.post("/uniteddh-claim/selenium/submit-otp", async (req: Request, res: Response): Promise => { const { session_id: sessionId, otp, socketId } = req.body; if (!sessionId || !otp) { return res.status(400).json({ error: "session_id and otp are required" }); } try { const r = await forwardOtpToSeleniumUnitedDHClaimAgent(sessionId, otp); if (socketId && io) { io.to(socketId).emit("selenium:otp_submitted", { session_id: sessionId }); } return res.json(r); } catch (err: any) { console.error("[uniteddh-claim] submit-otp failed:", err?.message); return res.status(500).json({ error: err?.message || "Failed to forward OTP" }); } }); export default router;