diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index 21edb67a7..b176a043f 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -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); diff --git a/apps/OpenSignServer/Utils.js b/apps/OpenSignServer/Utils.js index 9684ec154..50d5027c5 100644 --- a/apps/OpenSignServer/Utils.js +++ b/apps/OpenSignServer/Utils.js @@ -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) { diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js index ba7d7b22d..6f7d1ae20 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js @@ -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); } diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js index 2219dc2df..a0874f1e0 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplate.js @@ -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'); diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js index b2a4d2aef..28203575e 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createTemplatewithCoordinate.js @@ -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); diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/draftDocument.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/draftDocument.js index 3dda24f5d..7f31b66bc 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/draftDocument.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/draftDocument.js @@ -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); diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js index 166f4449e..b123d4e25 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js @@ -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!' } );