import fs from 'node:fs'; import axios from 'axios'; import { SignPdf } from '@signpdf/signpdf'; import { P12Signer } from '@signpdf/signer-p12'; import { pdflibAddPlaceholder } from '@signpdf/placeholder-pdf-lib'; import { PDFDocument } from 'pdf-lib'; import { cloudServerUrl, replaceMailVaribles, saveFileUsage, getSecureUrl, appName, } from '../../../Utils.js'; import GenerateCertificate from './GenerateCertificate.js'; import { Placeholder } from './Placeholder.js'; const serverUrl = cloudServerUrl; // process.env.SERVER_URL; const APPID = process.env.APP_ID; const masterKEY = process.env.MASTER_KEY; const eSignName = 'OpenSign'; const eSigncontact = 'hello@opensignlabs.com'; // `updateDoc` is used to create url in from pdfFile async function uploadFile( pdfName, filepath, ) { try { const filedata = fs.readFileSync(filepath); let fileUrl; const file = new Parse.File(pdfName, [...filedata], 'application/pdf'); await file.save({ useMasterKey: true }); const fileRes = getSecureUrl(file.url()); fileUrl = fileRes.url; return { imageUrl: fileUrl }; } catch (err) { console.log('Err ', err); // `fs.unlinkSync` is used to remove exported signed pdf file from exports folder fs.unlinkSync(filepath); } } // `updateDoc` is used to update signedUrl, AuditTrail, Iscompleted in document async function updateDoc(docId, url, userId, ipAddress, data, className, sign) { try { const UserPtr = { __type: 'Pointer', className: className, objectId: userId }; const obj = { UserPtr: UserPtr, SignedUrl: url, Activity: 'Signed', ipAddress: ipAddress, SignedOn: new Date(), Signature: sign, }; let updateAuditTrail; if (data.AuditTrail && data.AuditTrail.length > 0) { const AuditTrail = JSON.parse(JSON.stringify(data.AuditTrail)); const existingIndex = AuditTrail.findIndex( entry => entry.UserPtr.objectId === userId && entry.Activity !== 'Created' ); existingIndex !== -1 ? (AuditTrail[existingIndex] = { ...AuditTrail[existingIndex], ...obj }) : AuditTrail.push(obj); updateAuditTrail = AuditTrail; } else { updateAuditTrail = [obj]; } const auditTrail = updateAuditTrail.filter(x => x.Activity === 'Signed'); let isCompleted = false; if (data.Signers && data.Signers.length > 0) { if (auditTrail.length === data.Placeholders.length) { isCompleted = true; } } else { isCompleted = true; } const body = { SignedUrl: url, AuditTrail: updateAuditTrail, IsCompleted: isCompleted }; const signedRes = await axios.put(serverUrl + '/classes/contracts_Document/' + docId, body, { headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY, }, }); return { isCompleted: isCompleted, message: 'success', AuditTrail: updateAuditTrail }; } catch (err) { console.log('update doc err ', err); return 'err'; } } // `sendNotifyMail` is used to send notification mail of signer signed the document async function sendNotifyMail(doc, signUser, mailProvider) { try { const auditTrailCount = doc?.AuditTrail?.filter(x => x.Activity === 'Signed')?.length || 0; const signersCount = doc?.Placeholders?.length; const remaingsign = signersCount - auditTrailCount; if (remaingsign > 1 && doc?.NotifyOnSignatures) { const sender = doc.ExtUserPtr; const pdfName = doc.Name; const creatorName = doc.ExtUserPtr.Name; const creatorEmail = doc.ExtUserPtr.Email; const signerName = signUser.Name; const signerEmail = signUser.Email; const viewDocUrl = `${process.env.PUBLIC_URL}/recipientSignPdf/${doc.objectId}`; const logo = `

Document signed by ${signerName}
` + `Dear ${creatorName},
${pdfName} has been signed by ${signerName} "${signerEmail}" successfully
` + `This is an automated email from ${appName}. For any queries regarding this email, ` + `please contact the sender ${creatorEmail} directly. If you think this email is inappropriate or spam, you may file a complaint with ${appName}${opurl}.
