Skip to content

Commit e5c50a0

Browse files
authored
Merge pull request #381 from OpenSignLabs/api-v1-beta
2 parents 1add575 + caa1dfa commit e5c50a0

File tree

7 files changed

+214
-48
lines changed

7 files changed

+214
-48
lines changed

apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ export default async function createDocumentWithTemplate(request, response) {
77
const templateId = request.params.template_id;
88
const protocol = customAPIurl();
99
const baseUrl = new URL(process.env.SERVER_URL);
10+
const send_email = request.body.send_email || true;
11+
1012
try {
1113
const reqToken = request.headers['x-api-token'];
1214
if (!reqToken) {
@@ -48,6 +50,8 @@ export default async function createDocumentWithTemplate(request, response) {
4850
if (template?.Description) {
4951
object.set('Description', template.Description);
5052
}
53+
object.set('IsSendMail', send_email);
54+
5155
let templateSigner = template?.Signers ? template?.Signers : [];
5256
let contact = [];
5357
if (signers && signers.length > 0) {

apps/OpenSignServer/cloud/customRoute/v1/routes/createDocument.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export default async function createDocument(request, response) {
99
const signers = request.body.signers;
1010
const folderId = request.body.folderId;
1111
const base64File = request.body.file;
12+
const send_email = request.body.send_email || true;
1213
const fileData = request.files?.[0] ? request.files[0].buffer : null;
1314
// console.log('fileData ', fileData);
1415
const protocol = customAPIurl();
@@ -65,6 +66,7 @@ export default async function createDocument(request, response) {
6566
object.set('URL', fileUrl);
6667
object.set('CreatedBy', userPtr);
6768
object.set('ExtUserPtr', extUserPtr);
69+
object.set('IsSendMail', send_email);
6870
if (signers && signers.length > 0) {
6971
let parseSigners;
7072
if (base64File) {

apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,56 @@
11
import axios from 'axios';
22
import { color, customAPIurl } from '../../../../Utils.js';
33

4+
// `sendDoctoWebhook` is used to send res data of document on webhook
5+
async function sendDoctoWebhook(doc, WebhookUrl, userId) {
6+
if (WebhookUrl) {
7+
const params = {
8+
event: 'created',
9+
...doc,
10+
};
11+
await axios
12+
.post(WebhookUrl, params, {
13+
headers: { 'Content-Type': 'application/json' },
14+
})
15+
.then(res => {
16+
try {
17+
// console.log('res ', res);
18+
const webhook = new Parse.Object('contracts_Webhook');
19+
webhook.set('Log', res?.status);
20+
webhook.set('UserId', {
21+
__type: 'Pointer',
22+
className: '_User',
23+
objectId: userId,
24+
});
25+
webhook.save(null, { useMasterKey: true });
26+
} catch (err) {
27+
console.log('err save in contracts_Webhook', err);
28+
}
29+
})
30+
.catch(err => {
31+
console.log('Err send data to webhook', err);
32+
try {
33+
const webhook = new Parse.Object('contracts_Webhook');
34+
webhook.set('Log', err?.status);
35+
webhook.set('UserId', {
36+
__type: 'Pointer',
37+
className: '_User',
38+
objectId: userId,
39+
});
40+
webhook.save(null, { useMasterKey: true });
41+
} catch (err) {
42+
console.log('err save in contracts_Webhook', err);
43+
}
44+
});
45+
// console.log('res ', res.data);
46+
}
47+
}
448
const randomId = () => Math.floor(1000 + Math.random() * 9000);
549
export default async function createDocumentwithCoordinate(request, response) {
650
const name = request.body.title;
751
const note = request.body.note;
852
const description = request.body.description;
53+
const send_email = request.body.send_email || true;
954
const signers = request.body.signers;
1055
const folderId = request.body.folderId;
1156
const base64File = request.body.file;
@@ -63,6 +108,7 @@ export default async function createDocumentwithCoordinate(request, response) {
63108
object.set('URL', fileUrl);
64109
object.set('CreatedBy', userPtr);
65110
object.set('ExtUserPtr', extUserPtr);
111+
object.set('IsSendMail', send_email);
66112
let contact = [];
67113
if (signers && signers.length > 0) {
68114
let parseSigners;
@@ -168,7 +214,18 @@ export default async function createDocumentwithCoordinate(request, response) {
168214
newACL.setWriteAccess(userPtr.id, true);
169215
object.setACL(newACL);
170216
const res = await object.save(null, { useMasterKey: true });
171-
217+
const doc = {
218+
objectId: res.id,
219+
file: fileUrl,
220+
name: name,
221+
note: note || '',
222+
description: description || '',
223+
signers: contact?.map(x => ({ name: x.name, email: x.email, phone: x.phone })),
224+
createdAt: res.createdAt,
225+
};
226+
if (parseExtUser && parseExtUser.Webhook) {
227+
sendDoctoWebhook(doc, parseExtUser?.Webhook, userPtr?.id);
228+
}
172229
const newDate = new Date();
173230
newDate.setDate(newDate.getDate() + 15);
174231
const localExpireDate = newDate.toLocaleDateString('en-US', {

apps/OpenSignServer/cloud/main.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import getapitoken from './parsefunction/getapitoken.js';
2222
import TemplateAfterSave from './parsefunction/TemplateAfterSave.js';
2323
import GetTemplate from './parsefunction/GetTemplate.js';
2424
import savewebhook from './parsefunction/saveWebhook.js';
25+
import callWebhook from './parsefunction/callWebhook.js';
2526

2627
Parse.Cloud.define('AddUserToRole', addUserToGroups);
2728
Parse.Cloud.define('UserGroups', getUserGroups);
@@ -43,6 +44,7 @@ Parse.Cloud.define('generateapitoken', generateApiToken);
4344
Parse.Cloud.define('getapitoken', getapitoken);
4445
Parse.Cloud.define('getTemplate', GetTemplate);
4546
Parse.Cloud.define('savewebhook', savewebhook);
47+
Parse.Cloud.define('callwebhook', callWebhook);
4648
Parse.Cloud.afterSave('contracts_Document', DocumentAftersave);
4749
Parse.Cloud.afterSave('contracts_Contactbook', ContactbookAftersave);
4850
Parse.Cloud.afterSave('contracts_Users', ContractUsersAftersave);
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import axios from 'axios';
2+
export default async function callWebhook(request) {
3+
const event = request.params.event;
4+
const body = request.params.body;
5+
const serverUrl = process.env.SERVER_URL;
6+
const appId = process.env.APP_ID;
7+
const userRes = await axios.get(serverUrl + '/users/me', {
8+
headers: {
9+
'X-Parse-Application-Id': appId,
10+
'X-Parse-Session-Token': request.headers['sessiontoken'],
11+
},
12+
});
13+
14+
const userId = userRes.data && userRes.data.objectId;
15+
if (userId) {
16+
const extendcls = new Parse.Query('contracts_Users');
17+
extendcls.equalTo('UserId', { __type: 'Pointer', className: '_User', objectId: userId });
18+
const res = await extendcls.first({ useMasterKey: true });
19+
if (res) {
20+
const extUser = JSON.parse(JSON.stringify(res));
21+
if (extUser?.Webhook) {
22+
const params = {
23+
event: event,
24+
...body,
25+
};
26+
await axios
27+
.post(extUser?.Webhook, params, {
28+
headers: { 'Content-Type': 'application/json' },
29+
})
30+
.then(res => {
31+
try {
32+
// console.log('res ', res);
33+
const webhook = new Parse.Object('contracts_Webhook');
34+
webhook.set('Log', res?.status);
35+
webhook.set('UserId', {
36+
__type: 'Pointer',
37+
className: '_User',
38+
objectId: userId,
39+
});
40+
webhook.save(null, { useMasterKey: true });
41+
} catch (err) {
42+
console.log('err save in contracts_Webhook', err);
43+
}
44+
})
45+
.catch(err => {
46+
console.log('Err send data to webhook', err);
47+
try {
48+
const webhook = new Parse.Object('contracts_Webhook');
49+
webhook.set('Log', err?.status);
50+
webhook.set('UserId', {
51+
__type: 'Pointer',
52+
className: '_User',
53+
objectId: userId,
54+
});
55+
webhook.save(null, { useMasterKey: true });
56+
} catch (err) {
57+
console.log('err save in contracts_Webhook', err);
58+
}
59+
});
60+
}
61+
return { message: 'webhook called!' };
62+
}
63+
} else {
64+
return { message: 'User not found!' };
65+
}
66+
}

apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js

Lines changed: 50 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@ async function uploadFile(e, a) {
1515
console.log('Err ', e), fs.unlinkSync(a);
1616
}
1717
}
18-
async function updateDoc(t, s, r, i, o, n) {
18+
async function updateDoc(t, s, r, i, n, o) {
1919
try {
2020
var d = {
21-
UserPtr: { __type: 'Pointer', className: n, objectId: r },
21+
UserPtr: { __type: 'Pointer', className: o, objectId: r },
2222
SignedUrl: s,
2323
Activity: 'Signed',
2424
ipAddress: i,
2525
};
2626
let e;
27-
var l = (e = o.AuditTrail && 0 < o.AuditTrail.length ? [...o.AuditTrail, d] : [d]).filter(
27+
var l = (e = n.AuditTrail && 0 < n.AuditTrail.length ? [...n.AuditTrail, d] : [d]).filter(
2828
e => 'Signed' === e.Activity
2929
);
3030
let a = !1;
31-
!((o.Signers && 0 < o.Signers.length && l.length !== o.Signers.length) || !(a = !0));
31+
!((n.Signers && 0 < n.Signers.length && l.length !== n.Signers.length) || !(a = !0));
3232
var c = { SignedUrl: s, AuditTrail: e, IsCompleted: a };
3333
await axios.put(serverUrl + '/classes/contracts_Document/' + t, c, {
3434
headers: {
@@ -95,27 +95,28 @@ async function sendCompletedMail(e) {
9595
async function sendDoctoWebhook(t, e, a, s) {
9696
let r = [];
9797
(r = s
98-
? { Name: s?.Name, Email: s?.Email, Phone: s?.Phone }
99-
: t?.data?.Signers?.map(e => ({ Name: e.Name, Email: e.Email, Phone: e.Phone })) || [
98+
? { name: s?.Name, email: s?.Email, phone: s?.Phone }
99+
: t?.data?.Signers?.map(e => ({ name: e.Name, email: e.Email, phone: e.Phone })) || [
100100
{
101-
Name: t?.data?.ExtUserPtr?.Name,
102-
Email: t?.data?.ExtUserPtr?.Email,
103-
Phone: t?.data?.ExtUserPtr?.Phone,
101+
name: t?.data?.ExtUserPtr?.Name,
102+
email: t?.data?.ExtUserPtr?.Email,
103+
phone: t?.data?.ExtUserPtr?.Phone,
104104
},
105105
]),
106106
t.data.ExtUserPtr?.Webhook &&
107107
((s =
108-
'Signed' === a
109-
? { Signer: r, SignedAt: new Date() }
110-
: { Signers: r, CompletedAt: new Date() }),
108+
'signed' === a
109+
? { signer: r, signedAt: new Date() }
110+
: { signers: r, completedAt: new Date() }),
111111
(a = {
112-
Event: a,
113-
File: e || '',
114-
Name: t?.data?.Name,
115-
Note: t?.data?.Note || '',
116-
Description: t?.data?.Description || '',
112+
event: a,
113+
objectId: t?.data?.objectId,
114+
file: e || '',
115+
name: t?.data?.Name,
116+
note: t?.data?.Note || '',
117+
description: t?.data?.Description || '',
117118
...s,
118-
CreatedAt: t?.data?.createdAt,
119+
createdAt: t?.data?.createdAt,
119120
}),
120121
await axios
121122
.post(t?.data?.ExtUserPtr?.Webhook, a, { headers: { 'Content-Type': 'application/json' } })
@@ -149,12 +150,12 @@ async function sendDoctoWebhook(t, e, a, s) {
149150
}
150151
}));
151152
}
152-
async function PDF(i, o) {
153+
async function PDF(i, n) {
153154
try {
154155
i.params.sign;
155156
var e = i.params.docId,
156157
a = i.params.userId,
157-
n = await axios.get(
158+
o = await axios.get(
158159
serverUrl + '/classes/contracts_Document/' + e + '?include=ExtUserPtr,Signers',
159160
{
160161
headers: {
@@ -218,26 +219,26 @@ async function PDF(i, o) {
218219
};
219220
let a;
220221
var y = (a =
221-
n.data.AuditTrail && 0 < n.data.AuditTrail.length
222-
? [...n.data.AuditTrail, f]
222+
o.data.AuditTrail && 0 < o.data.AuditTrail.length
223+
? [...o.data.AuditTrail, f]
223224
: [f]).filter(e => 'Signed' === e.Activity);
224225
let t = !1;
225226
!(
226-
(n.data.Signers && 0 < n.data.Signers.length && y.length !== n.data.Signers.length) ||
227+
(o.data.Signers && 0 < o.data.Signers.length && y.length !== o.data.Signers.length) ||
227228
!(t = !0)
228229
);
229-
var P,
230-
v,
230+
var v,
231+
P,
231232
b = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
232233
x = './exports/' + b,
233234
U =
234235
(t
235-
? ((P = n.data.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
236+
? ((v = o.data.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
236237
(e =
237-
P && 0 < P.length
238+
v && 0 < v.length
238239
? plainAddPlaceholder({
239240
pdfBuffer: e,
240-
reason: 'Digitally signed by Open sign for ' + P?.join(', '),
241+
reason: 'Digitally signed by Open sign for ' + v?.join(', '),
241242
location: 'location',
242243
signatureLength: 1e4,
243244
})
@@ -247,39 +248,42 @@ async function PDF(i, o) {
247248
location: 'location',
248249
signatureLength: 1e4,
249250
})),
250-
(v = await new SignPDF(e, u).signPDF()),
251-
fs.writeFileSync(x, v))
251+
(P = await new SignPDF(e, u).signPDF()),
252+
fs.writeFileSync(x, P))
252253
: fs.writeFileSync(x, e),
253254
await uploadFile(b, x));
254255
if (U && U.imageUrl) {
255-
const o = await updateDoc(
256+
const n = await updateDoc(
256257
i.params.docId,
257258
U.imageUrl,
258259
s.data.results[0].objectId,
259260
i.headers['x-real-ip'],
260-
n.data,
261+
o.data,
261262
r
262263
);
263-
return (
264-
sendMail({
264+
var I,
265+
w = {
265266
url: U.imageUrl,
266-
sender: { Mail: n.data.ExtUserPtr.Email, Name: n.data.ExtUserPtr.Name },
267-
pdfName: n.data.Name,
267+
sender: { Mail: o.data.ExtUserPtr.Email, Name: o.data.ExtUserPtr.Name },
268+
pdfName: o.data.Name,
268269
receiver: g,
269-
}),
270-
sendDoctoWebhook(n, U.imageUrl, 'Signed', s?.data.results?.[0]),
271-
o &&
272-
o.isCompleted &&
273-
(sendCompletedMail({
270+
};
271+
return (
272+
o.data.IsSendMail && sendMail(w),
273+
sendDoctoWebhook(o, U.imageUrl, 'signed', s?.data.results?.[0]),
274+
n &&
275+
n.isCompleted &&
276+
((I = {
274277
url: U.imageUrl,
275-
sender: { Mail: n.data.ExtUserPtr.Email, Name: 'OpenSign™' },
276-
pdfName: n.data.Name,
277-
receiver: n.data.ExtUserPtr.Email,
278+
sender: { Mail: o.data.ExtUserPtr.Email, Name: 'OpenSign™' },
279+
pdfName: o.data.Name,
280+
receiver: o.data.ExtUserPtr.Email,
278281
}),
279-
sendDoctoWebhook(n, U.imageUrl, 'Completed')),
282+
o.data.IsSendMail && sendCompletedMail(I),
283+
sendDoctoWebhook(o, U.imageUrl, 'completed')),
280284
fs.unlinkSync(x),
281285
console.log('New Signed PDF created called: ' + x),
282-
'success' === o.message
286+
'success' === n.message
283287
? { status: 'success', data: U.imageUrl }
284288
: { status: 'error', message: 'please provide required parameters!' }
285289
);

0 commit comments

Comments
 (0)