import { getCaseByID, getPortalModuleDetails, getAppealPDFDocs } from "../../../actions/services/caseService"; import { getFormCollectionByID } from "../../../components/utils"; import { pdf } from "@react-pdf/renderer"; import { getPickLists } from "../../../actions/services/referenceDataService"; import { planningappeals78_pdf } from "../../../components/pdftemplates/planningappeals78_pdf"; import { other_pdf } from "../../../components/pdftemplates/other_pdf"; import { respondError } from "../middleware/apiResponse"; const getDetails = (resultsObj) => { if (!Array.isArray(resultsObj)) { return Promise.resolve([]); } const detailsPromises = resultsObj .filter((searchDetail) => searchDetail.pinswg_appealcasetype != null) .map((searchDetail) => { const caseID = searchDetail.ticketnumber; const appealType = searchDetail.pinswg_appealcasetype; const form = getFormCollectionByID(appealType); if (!form) { return null; } return getPortalModuleDetails(form.LogicalCollectionName, caseID); }) .filter(Boolean); // Remove any `null` if form not found return Promise.all(detailsPromises); }; export default async function handler(req, res) { const incidentid = req.body?.docProps; if (!incidentid) { return respondError(res, { status: 400, code: "INCIDENT_ID_REQUIRED", message: "Incident id is required" }); } try { const caseObj = await getCaseByID(incidentid); if (!Array.isArray(caseObj) || caseObj.length === 0) { return respondError(res, { status: 404, code: "CASE_NOT_FOUND", message: "Case not found" }); } const caseDetailsObj = await getDetails(caseObj); const fileList = (await getAppealPDFDocs(incidentid)) || []; if (caseDetailsObj[0]?.value?.[0]) { caseDetailsObj[0].value[0].pinswg_developmentdescription = caseObj[0].description; caseDetailsObj[0].value[0].caseObj = caseObj[0]; caseDetailsObj[0].value[0].filesList = fileList; } const whichForm = getFormCollectionByID( caseObj[0].pinswg_appealcasetype ); if (!whichForm?.UrlName) { return respondError(res, { status: 400, code: "FORM_COLLECTION_NOT_FOUND", message: "Unable to resolve form collection" }); } const pickListData = await getPickLists(whichForm.UrlName); const appealTypeMap = { 846040000: planningappeals78_pdf, 846040004: planningappeals78_pdf }; const renderDocument = appealTypeMap[caseObj[0].pinswg_appealcasetype] || other_pdf; const pdfComponent = renderDocument({ docProps: caseDetailsObj?.[0]?.value?.[0] || {}, pickListData }); const pdfBuffer = await pdf(pdfComponent).toBuffer(); const repDate = new Date(); const formattedDate = repDate.toISOString().split("T")[0]; res.setHeader("Content-Type", "application/pdf"); res.setHeader( "Content-Disposition", `attachment; filename=${formattedDate}_-_Appeal_Form.pdf` ); return res.send(pdfBuffer); } catch (error) { return respondError(res, { status: 400, code: "APPEAL_PDF_COPY_GENERATION_FAILED", message: "Unable to generate appeal PDF copy" }); } }