1
- import SignPDF from './SignPDF.min.cjs' ;
2
1
import fs from 'node:fs' ;
3
2
import axios from 'axios' ;
4
- import { pdflibAddPlaceholder } from './customSignPdf/pdflibplaceholder.min.js' ;
3
+ import { SignPdf } from '@signpdf/signpdf' ;
4
+ import { P12Signer } from '@signpdf/signer-p12' ;
5
+ import { pdflibAddPlaceholder } from '@signpdf/placeholder-pdf-lib' ;
5
6
import { PDFDocument } from 'pdf-lib' ;
6
7
import { replaceMailVaribles , saveFileUsage } from '../../../Utils.js' ;
7
8
import GenerateCertificate from './GenerateCertificate.js' ;
8
9
const serverUrl = process . env . SERVER_URL ,
9
10
APPID = process . env . APP_ID ,
10
- masterKEY = process . env . MASTER_KEY ;
11
+ masterKEY = process . env . MASTER_KEY ,
12
+ eSignName = 'opensign' ,
13
+ eSigncontact = '[email protected] ' ;
11
14
async function uploadFile ( e , t ) {
12
15
try {
13
16
var a = fs . readFileSync ( t ) ,
@@ -18,31 +21,31 @@ async function uploadFile(e, t) {
18
21
console . log ( 'Err ' , e ) , fs . unlinkSync ( t ) ;
19
22
}
20
23
}
21
- async function updateDoc ( a , r , i , s , o , n , l ) {
24
+ async function updateDoc ( a , r , i , n , s , o , l ) {
22
25
try {
23
26
var c ,
24
27
d ,
25
28
p = {
26
- UserPtr : { __type : 'Pointer' , className : n , objectId : i } ,
29
+ UserPtr : { __type : 'Pointer' , className : o , objectId : i } ,
27
30
SignedUrl : r ,
28
31
Activity : 'Signed' ,
29
- ipAddress : s ,
32
+ ipAddress : n ,
30
33
SignedOn : new Date ( ) ,
31
34
Signature : l ,
32
35
} ;
33
36
let e ;
34
37
var m = ( e =
35
- o . AuditTrail && 0 < o . AuditTrail . length
38
+ s . AuditTrail && 0 < s . AuditTrail . length
36
39
? ( - 1 !==
37
- ( d = ( c = JSON . parse ( JSON . stringify ( o . AuditTrail ) ) ) . findIndex (
40
+ ( d = ( c = JSON . parse ( JSON . stringify ( s . AuditTrail ) ) ) . findIndex (
38
41
e => e . UserPtr . objectId === i && 'Created' !== e . Activity
39
42
) )
40
43
? ( c [ d ] = { ...c [ d ] , ...p } )
41
44
: c . push ( p ) ,
42
45
c )
43
46
: [ p ] ) . filter ( e => 'Signed' === e . Activity ) ;
44
47
let t = ! 1 ;
45
- ! ( ( o . Signers && 0 < o . Signers . length && m . length !== o . Signers . length ) || ! ( t = ! 0 ) ) ;
48
+ ! ( ( s . Signers && 0 < s . Signers . length && m . length !== s . Signers . length ) || ! ( t = ! 0 ) ) ;
46
49
var g = { SignedUrl : r , AuditTrail : e , IsCompleted : t } ;
47
50
await axios . put ( serverUrl + '/classes/contracts_Document/' + a , g , {
48
51
headers : {
@@ -61,9 +64,9 @@ async function sendCompletedMail(e) {
61
64
a = e . doc ,
62
65
r = e . doc . ExtUserPtr ,
63
66
i = a . Name ,
64
- s = r . Email ;
65
- let o = `Document "${ i } " has been signed by all parties` ,
66
- n =
67
+ n = r . Email ;
68
+ let s = `Document "${ i } " has been signed by all parties` ,
69
+ o =
67
70
"<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 " +
68
71
`<b>"${ i } "</b>` +
69
72
'. 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 ' +
@@ -80,8 +83,8 @@ async function sendCompletedMail(e) {
80
83
g . equalTo ( 'UserId' , { __type : 'Pointer' , className : '_User' , objectId : r . UserId . objectId } ) ;
81
84
const f = await g . first ( ) ;
82
85
f &&
83
- ( ( l = JSON . parse ( JSON . stringify ( f ) ) ) ?. CompletionSubject && ( o = l ?. CompletionSubject ) ,
84
- l ?. CompletionBody && ( n = l ?. CompletionBody ) ,
86
+ ( ( l = JSON . parse ( JSON . stringify ( f ) ) ) ?. CompletionSubject && ( s = l ?. CompletionSubject ) ,
87
+ l ?. CompletionBody && ( o = l ?. CompletionBody ) ,
85
88
( c = a . ExpiryDate . iso ) ,
86
89
( d = new Date ( c ) . toLocaleDateString ( 'en-US' , {
87
90
day : 'numeric' ,
@@ -99,20 +102,20 @@ async function sendCompletedMail(e) {
99
102
expiry_date : d ,
100
103
company_name : r . Company ,
101
104
} ) ,
102
- ( m = replaceMailVaribles ( o , n , p ) ) ,
103
- ( o = m . subject ) ,
104
- ( n = m . body ) ) ;
105
+ ( m = replaceMailVaribles ( s , o , p ) ) ,
106
+ ( s = m . subject ) ,
107
+ ( o = m . body ) ) ;
105
108
} catch ( e ) {
106
109
console . log ( 'error in fetch tenant in signpdf' , e . message ) ;
107
110
}
108
111
g = {
109
112
extUserId : r . objectId ,
110
113
url : t ,
111
114
from : 'OpenSignβ’' ,
112
- recipient : s ,
113
- subject : o ,
115
+ recipient : n ,
116
+ subject : s ,
114
117
pdfName : i ,
115
- html : n ,
118
+ html : o ,
116
119
mailProvider : e . mailProvider ,
117
120
} ;
118
121
await axios . post ( serverUrl + '/functions/sendmailv3' , g , {
@@ -124,17 +127,17 @@ async function sendCompletedMail(e) {
124
127
} ) ;
125
128
}
126
129
async function sendDoctoWebhook ( a , e , t , r , i ) {
127
- let s = [ ] ;
128
- ( s = r
130
+ let n = [ ] ;
131
+ ( n = r
129
132
? { name : r ?. Name , email : r ?. Email , phone : r ?. Phone }
130
133
: a ?. Signers ?. map ( e => ( { name : e . Name , email : e . Email , phone : e . Phone } ) ) || [
131
134
{ name : a ?. ExtUserPtr ?. Name , email : a ?. ExtUserPtr ?. Email , phone : a ?. ExtUserPtr ?. Phone } ,
132
135
] ) ,
133
136
a . ExtUserPtr ?. Webhook &&
134
137
( ( r =
135
138
'signed' === t
136
- ? { signer : s , signedAt : new Date ( ) }
137
- : { signers : s , completedAt : new Date ( ) } ) ,
139
+ ? { signer : n , signedAt : new Date ( ) }
140
+ : { signers : n , completedAt : new Date ( ) } ) ,
138
141
( t = {
139
142
event : t ,
140
143
objectId : a ?. objectId ,
@@ -178,24 +181,27 @@ async function sendDoctoWebhook(a, e, t, r, i) {
178
181
}
179
182
} ) ) ;
180
183
}
181
- const sendMailsaveCertifcate = async ( e , t , a , r , i , s ) => {
182
- var o = await GenerateCertificate ( e ) ,
183
- o = await PDFDocument . load ( o ) ,
184
- o =
184
+ const sendMailsaveCertifcate = async ( e , t , a , r , i , n ) => {
185
+ var s = await GenerateCertificate ( e ) ,
186
+ s = await PDFDocument . load ( s ) ,
187
+ t = new P12Signer ( t , { passphrase : process . env . PASS_PHRASE || null } ) ,
188
+ s =
185
189
( pdflibAddPlaceholder ( {
186
- pdfDoc : o ,
190
+ pdfDoc : s ,
187
191
reason : 'Digitally signed by OpenSign.' ,
188
192
location : 'n/a' ,
193
+ name : eSignName ,
194
+ contactInfo : eSigncontact ,
189
195
signatureLength : 15e3 ,
190
196
} ) ,
191
- await o . save ( ) ) ,
192
- o = Buffer . from ( o ) ,
193
- t = await new SignPDF ( o , t ) . signPDF ( ) ,
197
+ await s . save ( ) ) ,
198
+ s = Buffer . from ( s ) ,
199
+ t = await new SignPdf ( ) . sign ( s , t ) ,
194
200
t =
195
201
( fs . writeFileSync ( './exports/certificate.pdf' , t ) ,
196
202
await uploadFile ( 'certificate.pdf' , './exports/certificate.pdf' ) ) ,
197
- n = { CertificateUrl : t . imageUrl } ;
198
- await axios . put ( serverUrl + '/classes/contracts_Document/' + e . objectId , n , {
203
+ o = { CertificateUrl : t . imageUrl } ;
204
+ await axios . put ( serverUrl + '/classes/contracts_Document/' + e . objectId , o , {
199
205
headers : {
200
206
'Content-Type' : 'application/json' ,
201
207
'X-Parse-Application-Id' : APPID ,
@@ -205,20 +211,20 @@ const sendMailsaveCertifcate = async (e, t, a, r, i, s) => {
205
211
e . IsSendMail && ! 1 === e . IsSendMail
206
212
? console . log ( "don't send mail" )
207
213
: sendCompletedMail ( { url : a , isCustomMail : r , doc : e , mailProvider : i } ) ,
208
- saveFileUsage ( o . length , t . imageUrl , s ) ,
214
+ saveFileUsage ( s . length , t . imageUrl , n ) ,
209
215
sendDoctoWebhook ( e , a , 'completed' , '' , t . imageUrl ) ;
210
216
} ;
211
- async function PDF ( o ) {
217
+ async function PDF ( s ) {
212
218
try {
213
- if ( ! o ?. user )
219
+ if ( ! s ?. user )
214
220
throw new Parse . Error ( Parse . Error . INVALID_SESSION_TOKEN , 'User is not authenticated.' ) ;
215
221
{
216
- var n = o ?. user ?. toJSON ( ) ,
217
- e = o . params . docId ;
218
- const F = o . params . userId ;
219
- var l = o . params . isCustomCompletionMail || ! 1 ,
220
- c = o . params . mailProvider || '' ,
221
- d = o . params . signature || '' ,
222
+ var o = s ?. user ?. toJSON ( ) ,
223
+ e = s . params . docId ;
224
+ const C = s . params . userId ;
225
+ var l = s . params . isCustomCompletionMail || ! 1 ,
226
+ c = s . params . mailProvider || '' ,
227
+ d = s . params . signature || '' ,
222
228
t = new Parse . Query ( 'contracts_Document' ) ,
223
229
a =
224
230
( t . include ( 'ExtUserPtr,Signers' ) ,
@@ -227,95 +233,100 @@ async function PDF(o) {
227
233
if ( ! a ) throw new Parse . Error ( Parse . Error . OBJECT_NOT_FOUND , 'Document not found.' ) ;
228
234
var r ,
229
235
p = a ?. toJSON ( ) ;
230
- let i , s ;
231
- F
232
- ? ( ( r = p . Signers . find ( e => e . objectId === F ) ) ,
236
+ let i , n ;
237
+ C
238
+ ? ( ( r = p . Signers . find ( e => e . objectId === C ) ) ,
233
239
console . log ( '_contractUser ' , r ) ,
234
- r && ( ( i = r ) , ( s = 'contracts_Contactbook' ) ) )
235
- : ( ( s = 'contracts_Users' ) , ( i = p . ExtUserPtr ) ) ;
240
+ r && ( ( i = r ) , ( n = 'contracts_Contactbook' ) ) )
241
+ : ( ( n = 'contracts_Users' ) , ( i = p . ExtUserPtr ) ) ;
236
242
var m ,
237
243
g = i . Name ,
238
244
f = i . Email ;
239
- if ( ! o . params . pdfFile ) throw ( ( ( m = new Error ( 'Pdf file not present!' ) ) . code = 400 ) , m ) ;
245
+ if ( ! s . params . pdfFile ) throw ( ( ( m = new Error ( 'Pdf file not present!' ) ) . code = 400 ) , m ) ;
240
246
{
241
- let e = Buffer . from ( o . params . pdfFile , 'base64' ) ;
247
+ let e = Buffer . from ( s . params . pdfFile , 'base64' ) ;
242
248
var u = process . env . PFX_BASE64 ,
243
249
h = Buffer . from ( u , 'base64' ) ,
244
- y = {
245
- UserPtr : { __type : 'Pointer' , className : s , objectId : i . objectId } ,
250
+ y = new P12Signer ( h , { passphrase : process . env . PASS_PHRASE || null } ) ,
251
+ P = {
252
+ UserPtr : { __type : 'Pointer' , className : n , objectId : i . objectId } ,
246
253
SignedUrl : '' ,
247
254
Activity : 'Signed' ,
248
- ipAddress : o . headers [ 'x-real-ip' ] ,
255
+ ipAddress : s . headers [ 'x-real-ip' ] ,
249
256
} ;
250
257
let t ;
251
- var P = ( t = p . AuditTrail && 0 < p . AuditTrail . length ? [ ...p . AuditTrail , y ] : [ y ] ) . filter (
258
+ var v = ( t = p . AuditTrail && 0 < p . AuditTrail . length ? [ ...p . AuditTrail , P ] : [ P ] ) . filter (
252
259
e => 'Signed' === e . Activity
253
260
) ;
254
261
let a = ! 1 ;
255
- ! ( ( p . Signers && 0 < p . Signers . length && P . length !== p . Signers . length ) || ! ( a = ! 0 ) ) ;
256
- var v ,
262
+ ! ( ( p . Signers && 0 < p . Signers . length && v . length !== p . Signers . length ) || ! ( a = ! 0 ) ) ;
263
+ var S ,
257
264
b ,
258
- S ,
259
265
w ,
260
266
U ,
261
- D ,
262
- I = `exported_file_${ Math . floor ( 5e3 * Math . random ( ) ) } .pdf` ,
263
- _ = './exports/' + I ;
267
+ I ,
268
+ _ ,
269
+ E = `exported_file_${ Math . floor ( 5e3 * Math . random ( ) ) } .pdf` ,
270
+ D = './exports/' + E ;
264
271
let r = e . length ;
265
272
r = (
266
273
a
267
- ? ( ( v = p . Signers ?. map ( e => e . Name + ' <' + e . Email + '>' ) ) ,
274
+ ? ( ( S = p . Signers ?. map ( e => e . Name + ' <' + e . Email + '>' ) ) ,
268
275
( e =
269
- v && 0 < v . length
276
+ S && 0 < S . length
270
277
? ( ( b = await PDFDocument . load ( e ) ) ,
271
278
pdflibAddPlaceholder ( {
272
279
pdfDoc : b ,
273
- reason : 'Digitally signed by OpenSign for ' + v ?. join ( ', ' ) ,
280
+ reason : 'Digitally signed by OpenSign for ' + S ?. join ( ', ' ) ,
274
281
location : 'n/a' ,
282
+ name : eSignName ,
283
+ contactInfo : eSigncontact ,
275
284
signatureLength : 15e3 ,
276
285
} ) ,
277
- ( S = await b . save ( ) ) ,
278
- Buffer . from ( S ) )
279
- : ( ( w = await PDFDocument . load ( e ) ) ,
286
+ ( w = await b . save ( ) ) ,
287
+ Buffer . from ( w ) )
288
+ : ( ( U = await PDFDocument . load ( e ) ) ,
280
289
pdflibAddPlaceholder ( {
281
- pdfDoc : w ,
290
+ pdfDoc : U ,
282
291
reason : 'Digitally signed by OpenSign for ' + g + ' <' + f + '>' ,
283
292
location : 'n/a' ,
293
+ name : eSignName ,
294
+ contactInfo : eSigncontact ,
284
295
signatureLength : 15e3 ,
285
296
} ) ,
286
- ( U = await w . save ( ) ) ,
287
- Buffer . from ( U ) ) ) ,
288
- ( D = await new SignPDF ( e , h ) . signPDF ( ) ) ,
289
- fs . writeFileSync ( _ , D ) ,
290
- D )
291
- : ( fs . writeFileSync ( _ , e ) , e )
297
+ ( I = await U . save ( ) ) ,
298
+ Buffer . from ( I ) ) ) ,
299
+ ( _ = await new SignPdf ( ) . sign ( e , y ) ) ,
300
+ fs . writeFileSync ( D , _ ) ,
301
+ _ )
302
+ : ( fs . writeFileSync ( D , e ) , e )
292
303
) . length ;
293
- var E = await uploadFile ( I , _ ) ;
294
- if ( E && E . imageUrl ) {
304
+ var A = await uploadFile ( E , D ) ;
305
+ if ( A && A . imageUrl ) {
295
306
var x ,
296
- A ,
297
- j = await updateDoc (
298
- o . params . docId ,
299
- E . imageUrl ,
307
+ j ,
308
+ N = await updateDoc (
309
+ s . params . docId ,
310
+ A . imageUrl ,
300
311
i . objectId ,
301
- o . headers [ 'x-real-ip' ] ,
312
+ s . headers [ 'x-real-ip' ] ,
302
313
p ,
303
- s ,
314
+ n ,
304
315
d
305
316
) ;
306
317
if (
307
- ( sendDoctoWebhook ( p , E . imageUrl , 'signed' , i ) ,
308
- saveFileUsage ( r , E . imageUrl , n . objectId ) ,
309
- j &&
310
- j . isCompleted &&
311
- ( ( x = { ...p , AuditTrail : j . AuditTrail } ) ,
312
- sendMailsaveCertifcate ( x , h , E . imageUrl , l , c , n . objectId ) ) ,
313
- fs . unlinkSync ( _ ) ,
314
- console . log ( 'New Signed PDF created called: ' + _ ) ,
315
- 'success' === j . message )
318
+ ( sendDoctoWebhook ( p , A . imageUrl , 'signed' , i ) ,
319
+ saveFileUsage ( r , A . imageUrl , o . objectId ) ,
320
+ N &&
321
+ N . isCompleted &&
322
+ ( ( x = { ...p , AuditTrail : N . AuditTrail } ) ,
323
+ sendMailsaveCertifcate ( x , h , A . imageUrl , l , c , o . objectId ) ) ,
324
+ fs . unlinkSync ( D ) ,
325
+ console . log ( 'New Signed PDF created called: ' + D ) ,
326
+ 'success' === N . message )
316
327
)
317
- return { status : 'success' , data : E . imageUrl } ;
318
- throw ( ( ( A = new Error ( 'Please provide required parameters!' ) ) . code = 400 ) , A ) ;
328
+ return { status : 'success' , data : A . imageUrl } ;
329
+ throw ( ( ( j = new Error ( 'Please provide required parameters!' ) ) . code = 400 ) , j ) ;
319
330
}
320
331
}
321
332
}
0 commit comments