import SignPDF from './SignPDF.min.cjs'; import fs from 'node:fs'; import axios from 'axios'; import { plainAddPlaceholder } from 'node-signpdf/dist/helpers/index.js'; const serverUrl = process.env.SERVER_URL, APPID = process.env.APP_ID, masterKEY = process.env.MASTER_KEY; async function uploadFile(e, a) { try { var t = fs.readFileSync(a), s = new Parse.File(e, [...t]), r = (await s.save({ useMasterKey: !0 }), s.url()); return { imageUrl: r }; } catch (e) { console.log('Err ', e), fs.unlinkSync(a); } } async function updateDoc(t, s, r, i, n, o) { try { var d = { UserPtr: { __type: 'Pointer', className: o, objectId: r }, SignedUrl: s, Activity: 'Signed', ipAddress: i, }; let e; var l = (e = n.AuditTrail && 0 < n.AuditTrail.length ? [...n.AuditTrail, d] : [d]).filter( e => 'Signed' === e.Activity ); let a = !1; !((n.Signers && 0 < n.Signers.length && l.length !== n.Signers.length) || !(a = !0)); var c = { SignedUrl: s, AuditTrail: e, IsCompleted: a }; await axios.put(serverUrl + '/classes/contracts_Document/' + t, c, { headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY, }, }); return { isCompleted: a, message: 'success' }; } catch (e) { return console.log('update doc err ', e), 'err'; } } async function sendMail(e) { var a = e.url, t = e.sender, s = e.pdfName, a = { url: a, from: 'OpenSign™', recipient: e.receiver, subject: 'You have signed the doc - ' + s, pdfName: s, html: "

Document Copy

A copy of the document " + s + ' Standard is attached to this email. Kindly download the document from the attachment.

This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender ' + t.Mail + ' directly. If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ here.

', }; await axios.post(serverUrl + '/functions/sendmailv3', a, { headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY, }, }); } async function sendCompletedMail(e) { var a = e.url, t = e.sender, s = e.pdfName, a = { url: a, from: 'OpenSign™', recipient: e.receiver, subject: `Document ${s} has been signed by all parties`, pdfName: s, html: "

Document sign successfully

All parties have successfully signed the document" + s + '. Kindly download the document from the attachment.

This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender ' + t.Mail + ' directly. If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ here.

', }; await axios.post(serverUrl + '/functions/sendmailv3', a, { headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY, }, }); } async function sendDoctoWebhook(t, e, a, s) { let r = []; (r = s ? { name: s?.Name, email: s?.Email, phone: s?.Phone } : t?.data?.Signers?.map(e => ({ name: e.Name, email: e.Email, phone: e.Phone })) || [ { name: t?.data?.ExtUserPtr?.Name, email: t?.data?.ExtUserPtr?.Email, phone: t?.data?.ExtUserPtr?.Phone, }, ]), t.data.ExtUserPtr?.Webhook && ((s = 'signed' === a ? { signer: r, signedAt: new Date() } : { signers: r, completedAt: new Date() }), (a = { event: a, objectId: t?.data?.objectId, file: e || '', name: t?.data?.Name, note: t?.data?.Note || '', description: t?.data?.Description || '', ...s, createdAt: t?.data?.createdAt, }), await axios .post(t?.data?.ExtUserPtr?.Webhook, a, { headers: { 'Content-Type': 'application/json' } }) .then(e => { try { var a = new Parse.Object('contracts_Webhook'); a.set('Log', e?.status), a.set('UserId', { __type: 'Pointer', className: '_User', objectId: t.data.ExtUserPtr.UserId.objectId, }), a.save(null, { useMasterKey: !0 }); } catch (e) { console.log('err save in contracts_Webhook', e); } }) .catch(e => { console.log('Err send data to webhook', e); try { var a = new Parse.Object('contracts_Webhook'); a.set('Log', e?.status), a.set('UserId', { __type: 'Pointer', className: '_User', objectId: t.data.ExtUserPtr.UserId.objectId, }), a.save(null, { useMasterKey: !0 }); } catch (e) { console.log('err save in contracts_Webhook', e); } })); } async function PDF(i, n) { try { i.params.sign; var e = i.params.docId, a = i.params.userId, o = await axios.get( serverUrl + '/classes/contracts_Document/' + e + '?include=ExtUserPtr,Signers', { headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY, }, } ), t = await axios.get(serverUrl + '/users/me', { headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Session-Token': i.headers.sessiontoken, }, }); if (!t.data || !t.data.objectId) return { status: 'error', message: 'this user not allowed!' }; { var d, l, c, p = JSON.stringify({ objectId: a }); let s, r; r = a ? (d = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + p, { headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Session-Token': i.headers.sessiontoken, }, })).data && 0 < d.data.results.length ? ((s = d), 'contracts_Contactbook') : ((s = await axios.get(serverUrl + '/classes/contracts_Users?where=' + p, { headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY }, })), 'contracts_Users') : ((l = JSON.stringify({ UserId: { __type: 'Pointer', className: '_User', objectId: t.data.objectId }, })), (c = await axios.get(serverUrl + '/classes/contracts_Users?where=' + l, { headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY }, })).data && 0 < c.data.results.length ? ((s = c), 'contracts_Users') : ((s = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + l, { headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Session-Token': i.headers.sessiontoken, }, })), 'contracts_Contactbook')); var m = s.data.results[0].Name, g = s.data.results[0].Email; if (!i.params.pdfFile) return { status: 'error', message: 'pdf file not present!' }; { let e = Buffer.from(i.params.pdfFile, 'base64'); var h = process.env.PFX_BASE64, u = Buffer.from(h, 'base64'), f = { UserPtr: { __type: 'Pointer', className: r, objectId: s.data.results[0].objectId }, SignedUrl: '', Activity: 'Signed', ipAddress: i.headers['x-real-ip'], }; let a; var y = (a = o.data.AuditTrail && 0 < o.data.AuditTrail.length ? [...o.data.AuditTrail, f] : [f]).filter(e => 'Signed' === e.Activity); let t = !1; !( (o.data.Signers && 0 < o.data.Signers.length && y.length !== o.data.Signers.length) || !(t = !0) ); var v, P, b = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`, x = './exports/' + b, U = (t ? ((v = o.data.Signers?.map(e => e.Name + ' <' + e.Email + '>')), (e = v && 0 < v.length ? plainAddPlaceholder({ pdfBuffer: e, reason: 'Digitally signed by OpenSign™ for ' + v?.join(', '), location: 'location', signatureLength: 1e4, }) : plainAddPlaceholder({ pdfBuffer: e, reason: 'Digitally signed by OpenSign™ for ' + m + ' <' + g + '>', location: 'location', signatureLength: 1e4, })), (P = await new SignPDF(e, u).signPDF()), fs.writeFileSync(x, P)) : fs.writeFileSync(x, e), await uploadFile(b, x)); if (U && U.imageUrl) { const n = await updateDoc( i.params.docId, U.imageUrl, s.data.results[0].objectId, i.headers['x-real-ip'], o.data, r ); var I, w = { url: U.imageUrl, sender: { Mail: o.data.ExtUserPtr.Email, Name: o.data.ExtUserPtr.Name }, pdfName: o.data.Name, receiver: g, }; return ( o.data.IsSendMail && !1 === o.data.IsSendMail ? console.log("don't send mail") : sendMail(w), sendDoctoWebhook(o, U.imageUrl, 'signed', s?.data.results?.[0]), n && n.isCompleted && ((I = { url: U.imageUrl, sender: { Mail: o.data.ExtUserPtr.Email, Name: 'OpenSign™' }, pdfName: o.data.Name, receiver: o.data.ExtUserPtr.Email, }), o.data.IsSendMail && !1 === o.data.IsSendMail ? console.log("don't send mail") : sendCompletedMail(I), sendDoctoWebhook(o, U.imageUrl, 'completed')), fs.unlinkSync(x), console.log('New Signed PDF created called: ' + x), 'success' === n.message ? { status: 'success', data: U.imageUrl } : { status: 'error', message: 'please provide required parameters!' } ); } } } } catch (e) { return ( console.log('Err ', e), 'ERR_BAD_REQUEST' === e.code ? { status: 'error', message: 'Invalid session token!' } : { status: 'error', message: 'Encrypted files are currently not supported!' } ); } } export default PDF;