feat: savefileusage in server side

This commit is contained in:
prafull-opensignlabs
2024-03-29 17:26:33 +05:30
parent 1932dda6d6
commit 881ac12b03
7 changed files with 188 additions and 141 deletions
@@ -39,6 +39,7 @@ import TourContentWithBtn from "../primitives/TourContentWithBtn";
import ModalUi from "../primitives/ModalUi";
import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption";
import WidgetNameModal from "../components/pdf/WidgetNameModal";
import { SaveFileSize } from "../constant/saveFileSize";
function PlaceHolderSign() {
const navigate = useNavigate();
@@ -759,6 +760,10 @@ function PlaceHolderSign() {
// Save the Parse File if needed
const pdfData = await pdfFile.save();
const pdfUrl = pdfData.url();
const tenantId = localStorage.getItem("TenantId");
const buffer = atob(pdfBytes)
console.log("buffer", buffer.length)
SaveFileSize(buffer.length, pdfUrl, tenantId);
return pdfUrl;
} catch (e) {
console.log("error", e);
+59 -41
View File
@@ -43,51 +43,69 @@ export function replaceMailVaribles(subject, body, variables) {
return result;
}
export const saveFileUsage = async (size, imageUrl, tenantId) => {
export const saveFileUsage = async (size, imageUrl, userId) => {
//checking server url and save file's size
const tenantPtr = {
__type: 'Pointer',
className: 'partners_Tenant',
objectId: tenantId,
};
const _tenantPtr = JSON.stringify(tenantPtr);
try {
const res = await axios.get(
`${serverUrl}classes/partners_TenantCredits?where={"PartnersTenant":${_tenantPtr}}`,
{
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': appId,
},
}
);
const response = res.data.results;
let data;
// console.log("response", response);
if (response && response.length > 0) {
data = {
usedStorage: response[0].usedStorage ? response[0].usedStorage + size : size,
try {
const tenantQuery = new Parse.Query('partners_Tenant');
tenantQuery.equalTo('UserId', {
__type: 'Pointer',
className: '_User',
objectId: userId,
});
const tenant = await tenantQuery.first();
if (tenant) {
const tenantPtr = {
__type: 'Pointer',
className: 'partners_Tenant',
objectId: tenant.id,
};
await axios.put(`${serverUrl}classes/partners_TenantCredits/${response[0].objectId}`, data, {
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': appId,
},
});
} else {
data = { usedStorage: size, PartnersTenant: tenantPtr };
await axios.post(`${serverUrl}classes/partners_TenantCredits`, data, {
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': parseAppId,
},
});
const _tenantPtr = JSON.stringify(tenantPtr);
try {
const res = await axios.get(
`${serverUrl}/classes/partners_TenantCredits?where={"PartnersTenant":${_tenantPtr}}`,
{
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': appId,
},
}
);
const response = res.data.results;
let data;
// console.log("response", response);
if (response && response.length > 0) {
data = {
usedStorage: response[0].usedStorage ? response[0].usedStorage + size : size,
};
await axios.put(
`${serverUrl}/classes/partners_TenantCredits/${response[0].objectId}`,
data,
{
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': appId,
},
}
);
} else {
data = { usedStorage: size, PartnersTenant: tenantPtr };
await axios.post(`${serverUrl}/classes/partners_TenantCredits`, data, {
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': appId,
},
});
}
} catch (err) {
console.log('err in save usage', err);
}
saveDataFile(size, imageUrl, tenantPtr);
}
} catch (err) {
console.log('err in save usage', err);
console.log('err in fetch tenant Id', err);
}
saveDataFile(size, imageUrl, tenantPtr);
};
//function for save fileUrl and file size in particular client db class partners_DataFiles
@@ -100,10 +118,10 @@ const saveDataFile = async (size, imageUrl, tenantPtr) => {
// console.log("data save",file, data)
try {
await axios.post(`${serverUrl}classes/partners_DataFiles`, data, {
await axios.post(`${serverUrl}/classes/partners_DataFiles`, data, {
headers: {
'Content-Type': 'application/json',
'X-Parse-Application-Id': parseAppId,
'X-Parse-Application-Id': appId,
},
});
} catch (err) {
@@ -1,5 +1,5 @@
import axios from 'axios';
import { color, customAPIurl, replaceMailVaribles } from '../../../../Utils.js';
import { color, customAPIurl, replaceMailVaribles, saveFileUsage } from '../../../../Utils.js';
// `sendDoctoWebhook` is used to send res data of document on webhook
async function sendDoctoWebhook(doc, WebhookUrl, userId) {
@@ -8,6 +8,7 @@ async function sendDoctoWebhook(doc, WebhookUrl, userId) {
event: 'created',
...doc,
};
await axios
.post(WebhookUrl, params, {
headers: { 'Content-Type': 'application/json' },
@@ -65,6 +66,7 @@ export default async function createDocumentwithCoordinate(request, response) {
if (!reqToken) {
return response.status(400).json({ error: 'Please Provide API Token' });
}
try {
const tokenQuery = new Parse.Query('appToken');
tokenQuery.equalTo('token', reqToken);
@@ -81,17 +83,22 @@ export default async function createDocumentwithCoordinate(request, response) {
if (signers && signers.length > 0) {
let fileUrl;
if (request.files?.[0]) {
const base64 = fileData?.toString('base64');
const file = new Parse.File(request.files?.[0]?.originalname, {
base64: fileData?.toString('base64'),
base64: base64,
});
await file.save({ useMasterKey: true });
fileUrl = file.url();
const buffer = Buffer.from(base64, 'base64');
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
} else {
const file = new Parse.File(`${name}.pdf`, {
base64: base64File,
});
await file.save({ useMasterKey: true });
fileUrl = file.url();
const buffer = Buffer.from(base64File, 'base64');
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
}
const contractsUser = new Parse.Query('contracts_Users');
contractsUser.equalTo('UserId', userPtr);
@@ -242,7 +249,6 @@ export default async function createDocumentwithCoordinate(request, response) {
year: 'numeric',
});
let sender = parseExtUser.Email;
let sendMail;
const serverUrl = process.env.SERVER_URL;
const newServer = serverUrl.replaceAll('/', '%2F');
const serverParams = `${newServer}%2F&${process.env.APP_ID}&contracts`;
@@ -332,7 +338,7 @@ export default async function createDocumentwithCoordinate(request, response) {
html: html,
};
sendMail = await axios.post(url, params, { headers: headers });
await axios.post(url, params, { headers: headers });
} catch (error) {
console.log('error', error);
}
@@ -1,6 +1,4 @@
import { customAPIurl } from '../../../../Utils.js';
const randomId = () => Math.floor(1000 + Math.random() * 9000);
import { saveFileUsage } from '../../../../Utils.js';
export default async function createTemplate(request, response) {
const name = request.body?.title;
const note = request.body?.note;
@@ -36,12 +34,17 @@ export default async function createTemplate(request, response) {
});
await file.save({ useMasterKey: true });
fileUrl = file.url();
const buffer = Buffer.from(base64File, 'base64');
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
} else {
const base64 = fileData?.toString('base64');
const file = new Parse.File(request.files?.[0]?.originalname, {
base64: fileData?.toString('base64'),
base64: base64,
});
await file.save({ useMasterKey: true });
fileUrl = file.url();
const buffer = Buffer.from(base64, 'base64');
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
}
const contractsUser = new Parse.Query('contracts_Users');
@@ -1,5 +1,5 @@
import axios from 'axios';
import { color, customAPIurl } from '../../../../Utils.js';
import { color, customAPIurl, saveFileUsage } from '../../../../Utils.js';
const randomId = () => Math.floor(1000 + Math.random() * 9000);
export default async function createTemplatewithCoordinate(request, response) {
@@ -34,17 +34,22 @@ export default async function createTemplatewithCoordinate(request, response) {
if (signers && signers.length > 0) {
let fileUrl;
if (request.files?.[0]) {
const base64 = fileData?.toString('base64');
const file = new Parse.File(request.files?.[0]?.originalname, {
base64: fileData?.toString('base64'),
base64: base64,
});
await file.save({ useMasterKey: true });
fileUrl = file.url();
const buffer = Buffer.from(base64, 'base64');
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
} else {
const file = new Parse.File(`${name}.pdf`, {
base64: base64File,
});
await file.save({ useMasterKey: true });
fileUrl = file.url();
const buffer = Buffer.from(base64File, 'base64');
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
}
const contractsUser = new Parse.Query('contracts_Users');
contractsUser.equalTo('UserId', userPtr);
@@ -36,17 +36,22 @@ export default async function draftDocument(request, response) {
if (signers && signers.length > 0) {
let fileUrl;
if (request.files?.[0]) {
const base64 = fileData?.toString('base64');
const file = new Parse.File(request.files?.[0]?.originalname, {
base64: fileData?.toString('base64'),
base64: base64,
});
await file.save({ useMasterKey: true });
fileUrl = file.url();
const buffer = Buffer.from(base64, 'base64');
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
} else {
const file = new Parse.File(`${name}.pdf`, {
base64: base64File,
});
await file.save({ useMasterKey: true });
fileUrl = file.url();
const buffer = Buffer.from(base64File, 'base64');
saveFileUsage(buffer.length, fileUrl, parseUser.userId.objectId);
}
const contractsUser = new Parse.Query('contracts_Users');
contractsUser.equalTo('UserId', userPtr);
+94 -89
View File
@@ -3,6 +3,7 @@ import fs from 'node:fs';
import axios from 'axios';
import { pdflibAddPlaceholder } from './customSignPdf/pdflibplaceholder.min.js';
import { PDFDocument } from 'pdf-lib';
import { saveFileUsage } from '../../../Utils.js';
const serverUrl = process.env.SERVER_URL,
APPID = process.env.APP_ID,
masterKEY = process.env.MASTER_KEY;
@@ -151,11 +152,11 @@ async function sendDoctoWebhook(t, e, a, s) {
}
}));
}
async function PDF(i) {
async function PDF(o) {
try {
var e = i.params.docId,
a = i.params.userId,
o = await axios.get(
var e = o.params.docId,
a = o.params.userId,
n = await axios.get(
serverUrl + '/classes/contracts_Document/' + e + '?include=ExtUserPtr,Signers',
{
headers: {
@@ -165,141 +166,145 @@ async function PDF(i) {
},
}
),
t = await axios.get(serverUrl + '/users/me', {
d = await axios.get(serverUrl + '/users/me', {
headers: {
'X-Parse-Application-Id': APPID,
'X-Parse-Session-Token': i.headers.sessiontoken,
'X-Parse-Session-Token': o.headers.sessiontoken,
},
});
if (!t.data || !t.data.objectId) return { status: 'error', message: 'this user not allowed!' };
if (!d.data || !d.data.objectId) return { status: 'error', message: 'This user not allowed!' };
{
var n,
d,
var t,
s,
l,
c = JSON.stringify({ objectId: a });
let s, r;
r = a
? (n = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + c, {
let r, i;
i = a
? (t = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + c, {
headers: {
'X-Parse-Application-Id': APPID,
'X-Parse-Session-Token': i.headers.sessiontoken,
'X-Parse-Session-Token': o.headers.sessiontoken,
},
})).data && 0 < n.data.results.length
? ((s = n), 'contracts_Contactbook')
: ((s = await axios.get(serverUrl + '/classes/contracts_Users?where=' + c, {
})).data && 0 < t.data.results.length
? ((r = t), 'contracts_Contactbook')
: ((r = await axios.get(serverUrl + '/classes/contracts_Users?where=' + c, {
headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY },
})),
'contracts_Users')
: ((d = JSON.stringify({
UserId: { __type: 'Pointer', className: '_User', objectId: t.data.objectId },
: ((s = JSON.stringify({
UserId: { __type: 'Pointer', className: '_User', objectId: d.data.objectId },
})),
(l = await axios.get(serverUrl + '/classes/contracts_Users?where=' + d, {
(l = await axios.get(serverUrl + '/classes/contracts_Users?where=' + s, {
headers: { 'X-Parse-Application-Id': APPID, 'X-Parse-Master-Key': masterKEY },
})).data && 0 < l.data.results.length
? ((s = l), 'contracts_Users')
: ((s = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + d, {
? ((r = l), 'contracts_Users')
: ((r = await axios.get(serverUrl + '/classes/contracts_Contactbook?where=' + s, {
headers: {
'X-Parse-Application-Id': APPID,
'X-Parse-Session-Token': i.headers.sessiontoken,
'X-Parse-Session-Token': o.headers.sessiontoken,
},
})),
'contracts_Contactbook'));
var p = s.data.results[0].Name,
m = s.data.results[0].Email;
if (!i.params.pdfFile) return { status: 'error', message: 'pdf file not present!' };
var p = r.data.results[0].Name,
m = r.data.results[0].Email;
if (!o.params.pdfFile) return { status: 'error', message: 'pdf file not present!' };
{
let e = Buffer.from(i.params.pdfFile, 'base64');
let e = Buffer.from(o.params.pdfFile, 'base64');
var g = process.env.PFX_BASE64,
h = Buffer.from(g, 'base64'),
u = {
UserPtr: { __type: 'Pointer', className: r, objectId: s.data.results[0].objectId },
UserPtr: { __type: 'Pointer', className: i, objectId: r.data.results[0].objectId },
SignedUrl: '',
Activity: 'Signed',
ipAddress: i.headers['x-real-ip'],
ipAddress: o.headers['x-real-ip'],
};
let a;
var f = (a =
o.data.AuditTrail && 0 < o.data.AuditTrail.length
? [...o.data.AuditTrail, u]
n.data.AuditTrail && 0 < n.data.AuditTrail.length
? [...n.data.AuditTrail, u]
: [u]).filter(e => 'Signed' === e.Activity);
let t = !1;
!(
(o.data.Signers && 0 < o.data.Signers.length && f.length !== o.data.Signers.length) ||
(n.data.Signers && 0 < n.data.Signers.length && f.length !== n.data.Signers.length) ||
!(t = !0)
);
var y,
P,
v,
P,
b,
x,
w,
U,
I,
S,
A = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
D = './exports/' + A,
E =
(t
? ((y = o.data.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
(e =
y && 0 < y.length
? ((P = await PDFDocument.load(e)),
pdflibAddPlaceholder({
pdfDoc: P,
reason: 'Digitally signed by OpenSign for ' + y?.join(', '),
location: 'location',
signatureLength: 15e3,
}),
(v = await P.save()),
Buffer.from(v))
: ((b = await PDFDocument.load(e)),
pdflibAddPlaceholder({
pdfDoc: b,
reason: 'Digitally signed by OpenSign for ' + p + ' <' + m + '>',
location: 'location',
signatureLength: 15e3,
}),
(x = await b.save()),
Buffer.from(x))),
(w = await new SignPDF(e, h).signPDF()),
fs.writeFileSync(D, w))
: fs.writeFileSync(D, e),
await uploadFile(A, D));
x,
w = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`,
I = './exports/' + w;
let s = e.length;
s = (
t
? ((y = n.data.Signers?.map(e => e.Name + ' <' + e.Email + '>')),
(e =
y && 0 < y.length
? ((v = await PDFDocument.load(e)),
pdflibAddPlaceholder({
pdfDoc: v,
reason: 'Digitally signed by OpenSign for ' + y?.join(', '),
location: 'location',
signatureLength: 15e3,
}),
(P = await v.save()),
Buffer.from(P))
: ((b = await PDFDocument.load(e)),
pdflibAddPlaceholder({
pdfDoc: b,
reason: 'Digitally signed by OpenSign for ' + p + ' <' + m + '>',
location: 'location',
signatureLength: 15e3,
}),
(U = await b.save()),
Buffer.from(U))),
(x = await new SignPDF(e, h).signPDF()),
fs.writeFileSync(I, x),
x)
: (fs.writeFileSync(I, e), e)
).length;
var S,
A,
D,
E = await uploadFile(w, I);
if (E && E.imageUrl)
return (
(U = await updateDoc(
i.params.docId,
(S = await updateDoc(
o.params.docId,
E.imageUrl,
s.data.results[0].objectId,
i.headers['x-real-ip'],
o.data,
r
r.data.results[0].objectId,
o.headers['x-real-ip'],
n.data,
i
)),
(I = {
(A = {
url: E.imageUrl,
sender: { Mail: o.data.ExtUserPtr.Email, Name: o.data.ExtUserPtr.Name },
pdfName: o.data.Name,
sender: { Mail: n.data.ExtUserPtr.Email, Name: n.data.ExtUserPtr.Name },
pdfName: n.data.Name,
receiver: m,
}),
o.data.IsSendMail && !1 === o.data.IsSendMail
n.data.IsSendMail && !1 === n.data.IsSendMail
? console.log("don't send mail")
: sendMail(I),
sendDoctoWebhook(o, E.imageUrl, 'signed', s?.data.results?.[0]),
U &&
U.isCompleted &&
((S = {
: sendMail(A),
sendDoctoWebhook(n, E.imageUrl, 'signed', r?.data.results?.[0]),
saveFileUsage(s, E.imageUrl, d.data.objectId),
S &&
S.isCompleted &&
((D = {
url: E.imageUrl,
sender: { Mail: o.data.ExtUserPtr.Email, Name: 'OpenSign™' },
pdfName: o.data.Name,
receiver: o.data.ExtUserPtr.Email,
sender: { Mail: n.data.ExtUserPtr.Email, Name: 'OpenSign™' },
pdfName: n.data.Name,
receiver: n.data.ExtUserPtr.Email,
}),
o.data.IsSendMail && !1 === o.data.IsSendMail
n.data.IsSendMail && !1 === n.data.IsSendMail
? console.log("don't send mail")
: sendCompletedMail(S),
sendDoctoWebhook(o, E.imageUrl, 'completed')),
fs.unlinkSync(D),
console.log('New Signed PDF created called: ' + D),
'success' === U.message
: sendCompletedMail(D),
sendDoctoWebhook(n, E.imageUrl, 'completed')),
fs.unlinkSync(I),
console.log('New Signed PDF created called: ' + I),
'success' === S.message
? { status: 'success', data: E.imageUrl }
: { status: 'error', message: 'please provide required parameters!' }
);