fix: changes in certificate

This commit is contained in:
prafull-opensignlabs
2024-04-29 17:38:25 +05:30
parent 9ad51a1d6a
commit 3599fbee21
6 changed files with 612 additions and 288 deletions
+196 -236
View File
@@ -8,85 +8,96 @@ import GenerateCertificate from './GenerateCertificate.js';
const serverUrl = process.env.SERVER_URL,
APPID = process.env.APP_ID,
masterKEY = process.env.MASTER_KEY;
async function uploadFile(e, a) {
async function uploadFile(e, t) {
try {
var t = fs.readFileSync(a),
s = new Parse.File(e, [...t], 'application/pdf'),
r = (await s.save({ useMasterKey: !0 }), s.url());
return { imageUrl: r };
var a = fs.readFileSync(t),
r = new Parse.File(e, [...a], 'application/pdf'),
i = (await r.save({ useMasterKey: !0 }), r.url());
return { imageUrl: i };
} catch (e) {
console.log('Err ', e), fs.unlinkSync(a);
console.log('Err ', e), fs.unlinkSync(t);
}
}
async function updateDoc(t, s, r, i, o, n) {
async function updateDoc(a, r, i, s, o, n, l) {
try {
var l = {
UserPtr: { __type: 'Pointer', className: n, objectId: r },
SignedUrl: s,
Activity: 'Signed',
ipAddress: i,
};
var c,
d,
p = {
UserPtr: { __type: 'Pointer', className: n, objectId: i },
SignedUrl: r,
Activity: 'Signed',
ipAddress: s,
SignedOn: new Date(),
Signature: l,
};
let e;
var d = (e = o.AuditTrail && 0 < o.AuditTrail.length ? [...o.AuditTrail, l] : [l]).filter(
e => 'Signed' === e.Activity
);
let a = !1;
!((o.Signers && 0 < o.Signers.length && d.length !== o.Signers.length) || !(a = !0));
var c = { SignedUrl: s, AuditTrail: e, IsCompleted: a };
await axios.put(serverUrl + '/classes/contracts_Document/' + t, c, {
var m = (e =
o.AuditTrail && 0 < o.AuditTrail.length
? (-1 !==
(d = (c = JSON.parse(JSON.stringify(o.AuditTrail))).findIndex(
e => e.UserPtr.objectId === i && 'Created' !== e.Activity
))
? (c[d] = { ...c[d], ...p })
: c.push(p),
c)
: [p]).filter(e => 'Signed' === e.Activity);
let t = !1;
!((o.Signers && 0 < o.Signers.length && m.length !== o.Signers.length) || !(t = !0));
var g = { SignedUrl: r, AuditTrail: e, IsCompleted: t };
await axios.put(serverUrl + '/classes/contracts_Document/' + a, g, {
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': APPID,
'X-Parse-Master-Key': masterKEY,
},
});
return { isCompleted: a, message: 'success', AuditTrail: e };
return { isCompleted: t, message: 'success', AuditTrail: e };
} catch (e) {
return console.log('update doc err ', e), 'err';
}
}
async function sendCompletedMail(e) {
var a = e.url,
t = e.doc,
s = e.doc.ExtUserPtr,
r = t.Name,
i = s.Email;
let o = `Document "${r}" has been signed by all parties`,
var t = e.url,
a = e.doc,
r = e.doc.ExtUserPtr,
i = a.Name,
s = r.Email;
let o = `Document "${i}" has been signed by all parties`,
n =
"<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body> <div style='background-color:#f5f5f5;padding:20px'> <div style='box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;background-color:white;'> <div><img src=https://qikinnovation.ams3.digitaloceanspaces.com/logo.png height='50' style='padding:20px'/> </div><div style='padding:2px;font-family:system-ui; background-color: #47a3ad;'> <p style='font-size:20px;font-weight:400;color:white;padding-left:20px',> Document signed successfully</p></div><div><p style='padding:20px;font-family:system-ui;font-size:14px'>All parties have successfully signed the document " +
`<b>"${r}"</b>` +
`<b>"${i}"</b>` +
'. Kindly download the document from the attachment.</p></div> </div><div><p>This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender ' +
s.Email +
r.Email +
' directly. If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ <a href=www.opensignlabs.com target=_blank>here</a>.</p></div></div></body></html>';
if (e?.isCustomMail)
try {
var l,
d,
c,
d,
p,
m,
g = new Parse.Query('partners_Tenant');
g.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: s.UserId.objectId });
const u = await g.first();
u &&
((l = JSON.parse(JSON.stringify(u)))?.CompletionSubject && (o = l?.CompletionSubject),
g.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: r.UserId.objectId });
const f = await g.first();
f &&
((l = JSON.parse(JSON.stringify(f)))?.CompletionSubject && (o = l?.CompletionSubject),
l?.CompletionBody && (n = l?.CompletionBody),
(d = t.ExpiryDate.iso),
(c = new Date(d).toLocaleDateString('en-US', {
(c = a.ExpiryDate.iso),
(d = new Date(c).toLocaleDateString('en-US', {
day: 'numeric',
month: 'long',
year: 'numeric',
})),
(p = {
document_title: r,
sender_name: s.Name,
sender_mail: s.Email,
sender_phone: s.Phone,
receiver_name: s.Name,
receiver_email: s.Email,
receiver_phone: s.Phone,
expiry_date: c,
company_name: s.Company,
document_title: i,
sender_name: r.Name,
sender_mail: r.Email,
sender_phone: r.Phone,
receiver_name: r.Name,
receiver_email: r.Email,
receiver_phone: r.Phone,
expiry_date: d,
company_name: r.Company,
}),
(m = replaceMailVaribles(o, n, p)),
(o = m.subject),
@@ -95,12 +106,12 @@ async function sendCompletedMail(e) {
console.log('error in fetch tenant in signpdf', e.message);
}
g = {
extUserId: s.objectId,
url: a,
extUserId: r.objectId,
url: t,
from: 'OpenSign™',
recipient: i,
recipient: s,
subject: o,
pdfName: r,
pdfName: i,
html: n,
mailProvider: e.mailProvider,
};
@@ -112,44 +123,40 @@ async function sendCompletedMail(e) {
},
});
}
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,
},
async function sendDoctoWebhook(a, e, t, r) {
let i = [];
(i = r
? { name: r?.Name, email: r?.Email, phone: r?.Phone }
: a?.Signers?.map(e => ({ name: e.Name, email: e.Email, phone: e.Phone })) || [
{ name: a?.ExtUserPtr?.Name, email: a?.ExtUserPtr?.Email, phone: a?.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,
a.ExtUserPtr?.Webhook &&
((r =
'signed' === t
? { signer: i, signedAt: new Date() }
: { signers: i, completedAt: new Date() }),
(t = {
event: t,
objectId: a?.objectId,
file: e || '',
name: t?.data?.Name,
note: t?.data?.Note || '',
description: t?.data?.Description || '',
...s,
createdAt: t?.data?.createdAt,
name: a?.Name,
note: a?.Note || '',
description: a?.Description || '',
...r,
createdAt: a?.createdAt,
}),
await axios
.post(t?.data?.ExtUserPtr?.Webhook, a, { headers: { 'Content-Type': 'application/json' } })
axios
.post(a?.ExtUserPtr?.Webhook, t, { headers: { 'Content-Type': 'application/json' } })
.then(e => {
try {
var a = new Parse.Object('contracts_Webhook');
a.set('Log', e?.status),
a.set('UserId', {
var t = new Parse.Object('contracts_Webhook');
t.set('Log', e?.status),
t.set('UserId', {
__type: 'Pointer',
className: '_User',
objectId: t.data.ExtUserPtr.UserId.objectId,
objectId: a.ExtUserPtr.UserId.objectId,
}),
a.save(null, { useMasterKey: !0 });
t.save(null, { useMasterKey: !0 });
} catch (e) {
console.log('err save in contracts_Webhook', e.message);
}
@@ -157,109 +164,106 @@ async function sendDoctoWebhook(t, e, a, s) {
.catch(e => {
console.log('Err send data to webhook', e.message);
try {
var a = new Parse.Object('contracts_Webhook');
a.set('Log', e?.status),
a.set('UserId', {
var t = new Parse.Object('contracts_Webhook');
t.set('Log', e?.status),
t.set('UserId', {
__type: 'Pointer',
className: '_User',
objectId: t.data.ExtUserPtr.UserId.objectId,
objectId: a.ExtUserPtr.UserId.objectId,
}),
a.save(null, { useMasterKey: !0 });
t.save(null, { useMasterKey: !0 });
} catch (e) {
console.log('err save in contracts_Webhook', e.message);
}
}));
}
const sendMailsaveCertifcate = async (e, t, a, r, i, s) => {
var o = await GenerateCertificate(e),
o = await PDFDocument.load(o),
o =
(pdflibAddPlaceholder({
pdfDoc: o,
reason: 'Digitally signed by OpenSign.',
location: 'n/a',
signatureLength: 15e3,
}),
await o.save()),
o = Buffer.from(o),
t = await new SignPDF(o, t).signPDF(),
t =
(fs.writeFileSync('./exports/certificate.pdf', t),
await uploadFile('certificate.pdf', './exports/certificate.pdf')),
n = { CertificateUrl: t.imageUrl };
await axios.put(serverUrl + '/classes/contracts_Document/' + e.objectId, n, {
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': APPID,
'X-Parse-Master-Key': masterKEY,
},
}),
e.IsSendMail && !1 === e.IsSendMail
? console.log("don't send mail")
: sendCompletedMail({ url: a, isCustomMail: r, doc: e, mailProvider: i }),
saveFileUsage(o.length, t.imageUrl, s),
sendDoctoWebhook(e, a, 'completed');
};
async function PDF(o) {
try {
var n = o.params.docId,
e = o.params.userId,
l = o.params.isCustomCompletionMail || !1,
d = o.params.mailProvider || '',
c = await axios.get(
serverUrl + '/classes/contracts_Document/' + n + '?include=ExtUserPtr,Signers',
{
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': APPID,
'X-Parse-Master-Key': masterKEY,
},
}
),
p = await axios.get(serverUrl + '/users/me', {
headers: {
'X-Parse-Application-Id': APPID,
'X-Parse-Session-Token': o.headers.sessiontoken,
},
});
if (!p.data || !p.data.objectId) return { status: 'error', message: 'This user not allowed!' };
if (!o?.user)
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.');
{
var a,
t,
s,
m = JSON.stringify({ objectId: e });
let r, i;
i = e
? (a = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + m, {
headers: {
'X-Parse-Application-Id': APPID,
'X-Parse-Session-Token': o.headers.sessiontoken,
},
})).data && 0 < a.data.results.length
? ((r = a), 'contracts_Contactbook')
: ((r = await axios.get(serverUrl + '/classes/contracts_Users?where=' + m, {
headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY },
})),
'contracts_Users')
: ((t = JSON.stringify({
UserId: { __type: 'Pointer', className: '_User', objectId: p.data.objectId },
})),
(s = await axios.get(serverUrl + '/classes/contracts_Users?where=' + t, {
headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY },
})).data && 0 < s.data.results.length
? ((r = s), 'contracts_Users')
: ((r = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + t, {
headers: {
'X-Parse-Application-Id': APPID,
'X-Parse-Session-Token': o.headers.sessiontoken,
},
})),
'contracts_Contactbook'));
var g = r.data.results[0].Name,
u = r.data.results[0].Email;
if (!o.params.pdfFile) return { status: 'error', message: 'Pdf file not present!' };
var n = o?.user?.toJSON(),
e = o.params.docId;
const F = o.params.userId;
var l = o.params.isCustomCompletionMail || !1,
c = o.params.mailProvider || '',
d = o.params.signature || '',
t = new Parse.Query('contracts_Document'),
a =
(t.include('ExtUserPtr,Signers'),
t.equalTo('objectId', e),
await t.first({ useMasterKey: !0 }));
if (!a) throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Document not found.');
var r,
p = a?.toJSON();
let i, s;
F
? ((r = p.Signers.find(e => e.objectId === F)),
console.log('_contractUser ', r),
r && ((i = r), (s = 'contracts_Contactbook')))
: ((s = 'contracts_Users'), (i = p.ExtUserPtr));
var m,
g = i.Name,
f = i.Email;
if (!o.params.pdfFile) throw (((m = new Error('Pdf file not present!')).code = 400), m);
{
let e = Buffer.from(o.params.pdfFile, 'base64');
var h = process.env.PFX_BASE64,
f = Buffer.from(h, 'base64'),
P = {
UserPtr: { __type: 'Pointer', className: i, objectId: r.data.results[0].objectId },
var u = process.env.PFX_BASE64,
h = Buffer.from(u, 'base64'),
y = {
UserPtr: { __type: 'Pointer', className: s, objectId: i.objectId },
SignedUrl: '',
Activity: 'Signed',
ipAddress: o.headers['x-real-ip'],
};
let a;
var y = (a =
c.data.AuditTrail && 0 < c.data.AuditTrail.length
? [...c.data.AuditTrail, P]
: [P]).filter(e => 'Signed' === e.Activity);
let t = !1;
!(
(c.data.Signers && 0 < c.data.Signers.length && y.length !== c.data.Signers.length) ||
!(t = !0)
let t;
var P = (t = p.AuditTrail && 0 < p.AuditTrail.length ? [...p.AuditTrail, y] : [y]).filter(
e => 'Signed' === e.Activity
);
let a = !1;
!((p.Signers && 0 < p.Signers.length && P.length !== p.Signers.length) || !(a = !0));
var v,
b,
U,
I,
S,
w,
U,
D,
S = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
_ = './exports/' + S;
let s = e.length;
s = (
t
? ((v = c.data.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
I = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
_ = './exports/' + I;
let r = e.length;
r = (
a
? ((v = p.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
(e =
v && 0 < v.length
? ((b = await PDFDocument.load(e)),
@@ -269,97 +273,53 @@ async function PDF(o) {
location: 'n/a',
signatureLength: 15e3,
}),
(U = await b.save()),
Buffer.from(U))
: ((I = await PDFDocument.load(e)),
(S = await b.save()),
Buffer.from(S))
: ((w = await PDFDocument.load(e)),
pdflibAddPlaceholder({
pdfDoc: I,
reason: 'Digitally signed by OpenSign for ' + g + ' <' + u + '>',
pdfDoc: w,
reason: 'Digitally signed by OpenSign for ' + g + ' <' + f + '>',
location: 'n/a',
signatureLength: 15e3,
}),
(w = await I.save()),
Buffer.from(w))),
(D = await new SignPDF(e, f).signPDF()),
(U = await w.save()),
Buffer.from(U))),
(D = await new SignPDF(e, h).signPDF()),
fs.writeFileSync(_, D),
D)
: (fs.writeFileSync(_, e), e)
).length;
var A,
x,
E,
j,
k,
F,
C,
T,
N,
M = await uploadFile(S, _);
if (M && M.imageUrl)
return (
(A = await updateDoc(
var E = await uploadFile(I, _);
if (E && E.imageUrl) {
var x,
A,
j = await updateDoc(
o.params.docId,
M.imageUrl,
r.data.results[0].objectId,
E.imageUrl,
i.objectId,
o.headers['x-real-ip'],
c.data,
i
)),
sendDoctoWebhook(c, M.imageUrl, 'signed', r?.data.results?.[0]),
saveFileUsage(s, M.imageUrl, p.data.objectId),
A &&
A.isCompleted &&
((x = { ...c.data, AuditTrail: A.AuditTrail }),
(E = await GenerateCertificate(x)),
(j = await PDFDocument.load(E)),
pdflibAddPlaceholder({
pdfDoc: j,
reason: 'Digitally signed by OpenSign.',
location: 'n/a',
signatureLength: 15e3,
}),
(k = await j.save()),
(F = Buffer.from(k)),
(C = await new SignPDF(F, f).signPDF()),
fs.writeFileSync('./exports/certificate.pdf', C),
(N = {
CertificateUrl: (T = await uploadFile(
'certificate.pdf',
'./exports/certificate.pdf'
)).imageUrl,
}),
await axios.put(serverUrl + '/classes/contracts_Document/' + n, N, {
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': APPID,
'X-Parse-Master-Key': masterKEY,
},
}),
c.data.IsSendMail && !1 === c.data.IsSendMail
? console.log("don't send mail")
: sendCompletedMail({
url: M.imageUrl,
isCustomMail: l,
doc: c.data,
mailProvider: d,
}),
saveFileUsage(F.length, T.imageUrl, p.data.objectId),
sendDoctoWebhook(c, M.imageUrl, 'completed')),
p,
s,
d
);
if (
(sendDoctoWebhook(p, E.imageUrl, 'signed', i),
saveFileUsage(r, E.imageUrl, n.objectId),
j &&
j.isCompleted &&
((x = { ...p, AuditTrail: j.AuditTrail }),
sendMailsaveCertifcate(x, h, E.imageUrl, l, c, n.objectId)),
fs.unlinkSync(_),
console.log('New Signed PDF created called: ' + _),
'success' === A.message
? { status: 'success', data: M.imageUrl }
: { status: 'error', message: 'Please provide required parameters!' }
);
'success' === j.message)
)
return { status: 'success', data: E.imageUrl };
throw (((A = new Error('Please provide required parameters!')).code = 400), A);
}
}
}
} 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!' }
);
throw (console.log('Err ', e), e);
}
}
export default PDF;