From 5adaffc684dacfa49b870edd529ce92958c752ae Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Sun, 31 Mar 2024 12:42:08 +0530 Subject: [PATCH] feat: add emailcount of user --- .../src/components/pdf/EmailComponent.js | 4 +- apps/OpenSign/src/pages/PdfRequestFiles.js | 4 +- apps/OpenSign/src/pages/PlaceHolderSign.js | 5 +- apps/OpenSign/src/pages/PlanSubscriptions.js | 1 - apps/OpenSign/src/pages/SignyourselfPdf.js | 12 ++-- apps/OpenSignServer/Utils.js | 24 ++++++++ .../v1/routes/CreateDocumentWithTemplate.js | 1 + .../v1/routes/createDocumentwithCoordinate.js | 1 + apps/OpenSignServer/cloud/main.js | 6 +- .../cloud/parsefunction/SendMailOTPv1.js | 53 ++++++++-------- .../cloud/parsefunction/SendMailv1.js | 27 -------- .../cloud/parsefunction/pdf/PDF.min.js | 61 ++++++++++--------- .../{sendMail.js => sendMailv3.js} | 19 +++++- apps/OpenSignServer/index.js | 10 +-- 14 files changed, 126 insertions(+), 102 deletions(-) delete mode 100644 apps/OpenSignServer/cloud/parsefunction/SendMailv1.js rename apps/OpenSignServer/cloud/parsefunction/{sendMail.js => sendMailv3.js} (88%) diff --git a/apps/OpenSign/src/components/pdf/EmailComponent.js b/apps/OpenSign/src/components/pdf/EmailComponent.js index 3ca39f177..879ff5fa2 100644 --- a/apps/OpenSign/src/components/pdf/EmailComponent.js +++ b/apps/OpenSign/src/components/pdf/EmailComponent.js @@ -15,7 +15,8 @@ function EmailComponent({ setSuccessEmail, pdfName, sender, - setIsAlert + setIsAlert, + extUserId }) { const [emailList, setEmailList] = useState([]); const [emailValue, setEmailValue] = useState(); @@ -38,6 +39,7 @@ function EmailComponent({ const openSignUrl = "https://www.opensignlabs.com/contact-us"; const themeBGcolor = themeColor; let params = { + extUserId: extUserId, pdfName: pdfName, url: pdfUrl, recipient: emailList[i], diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 8df0ad294..7c05fa4ec 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -94,6 +94,7 @@ function PdfRequestFiles() { const [sendInOrder, setSendInOrder] = useState(false); const [currWidgetsDetails, setCurrWidgetsDetails] = useState({}); const [isSubscribed, setIsSubscribed] = useState(false); + const [extUserId, setExtUserId] = useState(""); const divRef = useRef(null); const isMobile = window.innerWidth < 767; const rowLevel = @@ -169,6 +170,7 @@ function PdfRequestFiles() { if (isEnableSubscription) { await checkIsSubscribed(documentData[0]?.ExtUserPtr?.Email); } + setExtUserId(documentData[0]?.ExtUserPtr?.objectId); const isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted; const expireDate = documentData[0].ExpiryDate.iso; @@ -624,10 +626,10 @@ function PdfRequestFiles() { : ""; const themeBGcolor = themeColor; let params = { + extUserId: extUserId, recipient: user.Email, subject: `${pdfDetails?.[0].ExtUserPtr.Name} has requested you to sign ${pdfDetails?.[0].Name}`, from: sender, - html: "
0) { + setExtUserId(documentData[0]?.ExtUserPtr?.objectId); if (isEnableSubscription) { checkIsSubscribed(documentData[0]?.ExtUserPtr?.Email); } @@ -761,7 +763,7 @@ function PlaceHolderSign() { const pdfData = await pdfFile.save(); const pdfUrl = pdfData.url(); const tenantId = localStorage.getItem("TenantId"); - const buffer = atob(pdfBytes) + const buffer = atob(pdfBytes); SaveFileSize(buffer.length, pdfUrl, tenantId); return pdfUrl; } catch (e) { @@ -856,6 +858,7 @@ function PlaceHolderSign() { : ""; const themeBGcolor = themeColor; let params = { + extUserId: extUserId, recipient: signerMail[i].Email, subject: `${pdfDetails?.[0].ExtUserPtr.Name} has requested you to sign ${pdfDetails?.[0].Name}`, from: sender, diff --git a/apps/OpenSign/src/pages/PlanSubscriptions.js b/apps/OpenSign/src/pages/PlanSubscriptions.js index bff48d33f..954cc432d 100644 --- a/apps/OpenSign/src/pages/PlanSubscriptions.js +++ b/apps/OpenSign/src/pages/PlanSubscriptions.js @@ -49,7 +49,6 @@ const PlanSubscriptions = () => { try { const params = { userId: Parse.User.current().id }; const res = await Parse.Cloud.run("freesubscription", params); - console.log("res.result ", res.result); if (res.status === "success" && res.result === "already subscribed!") { setIsLoader(false); alert("You have already subscription of free plan"); diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index 4538732f8..9cdef9b7a 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -99,6 +99,7 @@ function SignYourSelf() { }); const [isAlert, setIsAlert] = useState({ isShow: false, alertMessage: "" }); const [isDontShow, setIsDontShow] = useState(false); + const [extUserId, setExtUserId] = useState(""); const divRef = useRef(null); const nodeRef = useRef(null); const [, drop] = useDrop({ @@ -186,7 +187,7 @@ function SignYourSelf() { if (documentData && documentData.length > 0) { setPdfDetails(documentData); - + setExtUserId(documentData[0]?.ExtUserPtr?.objectId); isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted; if (isCompleted) { const docStatus = { @@ -433,13 +434,13 @@ function SignYourSelf() { Width: widgetTypeExist ? calculateInitialWidthHeight(dragTypeValue, widgetValue).getWidth : dragTypeValue === "initials" - ? defaultWidthHeight(dragTypeValue).width - : "", + ? defaultWidthHeight(dragTypeValue).width + : "", Height: widgetTypeExist ? calculateInitialWidthHeight(dragTypeValue, widgetValue).getHeight : dragTypeValue === "initials" - ? defaultWidthHeight(dragTypeValue).height - : "", + ? defaultWidthHeight(dragTypeValue).height + : "", options: addWidgetOptions(dragTypeValue) }; @@ -1120,6 +1121,7 @@ function SignYourSelf() { setSuccessEmail={setSuccessEmail} sender={jsonSender} setIsAlert={setIsAlert} + extUserId={extUserId} /> {/* pdf header which contain funish back button */}
{ console.log('error in save usage ', err); } }; + +export const updateMailCount = async extUserId => { + // Update count in contracts_Users class + const query = new Parse.Query('contracts_Users'); + query.equalTo('objectId', extUserId); + + try { + const contractUser = await query.first({ useMasterKey: true }); + console.log("contractUser", contractUser) + + if (contractUser) { + contractUser.increment('EmailCount', 1); + await contractUser.save(null, { useMasterKey: true }); + } else { + // Create new entry if not found + const ContractsUsers = Parse.Object.extend('contracts_users'); + const newContractUser = new ContractsUsers(); + newContractUser.set('EmailCount', 1); + await newContractUser.save(null, { useMasterKey: true }); + } + } catch (error) { + console.log('Error updating EmailCount in contracts_users: ' + error.message); + } +}; diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js index 970c95b5f..b3b6f2179 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/CreateDocumentWithTemplate.js @@ -284,6 +284,7 @@ export default async function createDocumentWithTemplate(request, response) { subject: subject, from: sender, html: html, + extUserId: template.ExtUserPtr.objectId, }; sendMail = await axios.post(url, params, { headers: headers }); } catch (error) { diff --git a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js index 6f7d1ae20..05477562e 100644 --- a/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js +++ b/apps/OpenSignServer/cloud/customRoute/v1/routes/createDocumentwithCoordinate.js @@ -336,6 +336,7 @@ export default async function createDocumentwithCoordinate(request, response) { subject: subject, from: sender, html: html, + extUserId: extUser.id, }; await axios.post(url, params, { headers: headers }); diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index d6f0adaf6..7850e9b56 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -1,5 +1,5 @@ import PDF from './parsefunction/pdf/PDF.min.js'; -import sendmail from './parsefunction/sendMail.js'; +import sendmailv3 from './parsefunction/sendMailv3.js'; import GoogleSign from './parsefunction/GoogleSign.js'; import ZohoDetails from './parsefunction/ZohoDetails.js'; import usersignup from './parsefunction/usersignup.js'; @@ -10,7 +10,6 @@ import DocumentAftersave from './parsefunction/DocumentAftersave.js'; import ContactbookAftersave from './parsefunction/ContactBookAftersave.js'; import ContractUsersAftersave from './parsefunction/ContractUsersAftersave.js'; import sendMailOTPv1 from './parsefunction/SendMailOTPv1.js'; -import SendMailv1 from './parsefunction/SendMailv1.js'; import AuthLoginAsMail from './parsefunction/AuthLoginAsMail.js'; import getUserId from './parsefunction/getUserId.js'; import getUserDetails from './parsefunction/getUserDetails.js'; @@ -30,13 +29,12 @@ import TemplateBeforeSave from './parsefunction/TemplateBeforesave.js'; Parse.Cloud.define('AddUserToRole', addUserToGroups); Parse.Cloud.define('UserGroups', getUserGroups); Parse.Cloud.define('signPdf', PDF); -Parse.Cloud.define('sendmailv3', sendmail); +Parse.Cloud.define('sendmailv3', sendmailv3); Parse.Cloud.define('googlesign', GoogleSign); Parse.Cloud.define('zohodetails', ZohoDetails); Parse.Cloud.define('usersignup', usersignup); Parse.Cloud.define('facebooksign', FacebookSign); Parse.Cloud.define('SendOTPMailV1', sendMailOTPv1); -Parse.Cloud.define('sendmail', SendMailv1); Parse.Cloud.define('AuthLoginAsMail', AuthLoginAsMail); Parse.Cloud.define('getUserId', getUserId); Parse.Cloud.define('getUserDetails', getUserDetails); diff --git a/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js b/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js index 4c3b52283..f29f01ca2 100644 --- a/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js +++ b/apps/OpenSignServer/cloud/parsefunction/SendMailOTPv1.js @@ -1,4 +1,4 @@ -import axios from 'axios' +import { updateMailCount } from '../../Utils.js'; async function sendMailOTPv1(request) { try { @@ -11,37 +11,40 @@ async function sendMailOTPv1(request) { // console.log(JSON.stringify(request)); if (email) { - axios({ - method: 'POST', - url: process.env.SERVER_URL + '/functions/sendmail', - headers: { - 'Content-Type': 'application/json', - 'X-Parse-Application-Id': process.env.APP_ID, - }, - params: { - otp: code, - email: email, - TenantId: TenantId, - }, - }).then( - function (httpResponse) {}, - function (httpResponse) { - console.error('sms Request failed with response code ' + httpResponse.status); - return Promise.reject('sms Request failed with response code ' + httpResponse.status); + const recipient = request.params.email; + const otp = request.params.otp; + const mailsender = process.env.SMTP_ENABLE + ? process.env.SMTP_USER_EMAIL + : process.env.MAILGUN_SENDER; + try { + await Parse.Cloud.sendEmail({ + from: 'Opensign™' + ' <' + mailsender + '>', + recipient: recipient, + subject: 'Your OpenSign™ OTP', + text: 'This email is a test.', + html: + "

OTP Verification

Your OTP for OpenSign™ verification is:

" + + otp + + '

', + }); + console.log('OTP sent'); + if (request.params?.extUserId) { + await updateMailCount(request.params.extUserId); } - ); - + } catch (err) { + console.log('error in send OTP mail', err); + } const tempOtp = new Parse.Query('defaultdata_Otp'); tempOtp.equalTo('Email', email); const resultOTP = await tempOtp.first({ useMasterKey: true }); - console.log('resultOTP', resultOTP); + // console.log('resultOTP', resultOTP); if (resultOTP !== undefined) { const updateOtpQuery = new Parse.Query('defaultdata_Otp'); const updateOtp = await updateOtpQuery.get(resultOTP.id, { useMasterKey: true, }); updateOtp.set('OTP', code); - const updateRes = updateOtp.save(null, { useMasterKey: true }); + updateOtp.save(null, { useMasterKey: true }); // console.log("update otp Res in tempSendOtp ", updateRes); } else { const otpClass = Parse.Object.extend('defaultdata_Otp'); @@ -49,17 +52,17 @@ async function sendMailOTPv1(request) { newOtpQuery.set('OTP', code); newOtpQuery.set('Email', email); newOtpQuery.set('TenantId', TenantId); - const newRes = await newOtpQuery.save(null, { useMasterKey: true }); + await newOtpQuery.save(null, { useMasterKey: true }); // console.log("new otp Res in tempSendOtp ", newRes); } return 'Otp send'; } else { - return Promise.reject('Please Enter valid email'); + return 'Please Enter valid email'; } } catch (err) { console.log('err in sendMailOTPv1'); console.log(err); - return Promise.reject(err); + return err; } } export default sendMailOTPv1; diff --git a/apps/OpenSignServer/cloud/parsefunction/SendMailv1.js b/apps/OpenSignServer/cloud/parsefunction/SendMailv1.js deleted file mode 100644 index 741ac4ec0..000000000 --- a/apps/OpenSignServer/cloud/parsefunction/SendMailv1.js +++ /dev/null @@ -1,27 +0,0 @@ -async function SendMailv1(request) { - console.log('in SendMailv1'); - - try { - const recipient = request.params.email; - const otp = request.params.otp; - const res = await Parse.Cloud.sendEmail({ - from: 'Test user' + ' <' + process.env.SMTP_ENABLE ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER + '>', - recipient: recipient, - subject: 'Your OpenSign™ OTP', - text: 'This email is a test.', - html: - "

OTP Verification

Your OTP for OpenSign™ verification is:

" + - otp + - '

', - // "

Hello,

Your OTP for LegaDaft verification .

76984

Thank You!
" - }); - console.log('Res'); - console.log(res); - return otp; - } catch (err) { - console.log('err in SendMailv1'); - console.log(err); - return err; - } -} -export default SendMailv1; diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js index 37d9a39da..fe1463137 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js @@ -48,10 +48,12 @@ async function sendCompletedMail(e) { var a = e.url, t = e.sender, s = e.pdfName, - a = { + r = e.receiver, + e = { + extUserId: e.extUserId, url: a, from: 'OpenSign™', - recipient: e.receiver, + recipient: r, subject: `Document ${s} has been signed by all parties`, pdfName: s, html: @@ -61,7 +63,7 @@ async function sendCompletedMail(e) { t.Mail + ' directly. If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ here.

', }; - await axios.post(serverUrl + '/functions/sendmailv3', a, { + await axios.post(serverUrl + '/functions/sendmailv3', e, { headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APPID, @@ -206,11 +208,11 @@ async function PDF(i) { var P, y, v, - b, U, + b, I, S = `exported_file_${Math.floor(5e3 * Math.random())}.pdf`, - A = './exports/' + S; + x = './exports/' + S; let s = e.length; s = ( t @@ -226,51 +228,52 @@ async function PDF(i) { }), (v = await y.save()), Buffer.from(v)) - : ((b = await PDFDocument.load(e)), + : ((U = await PDFDocument.load(e)), pdflibAddPlaceholder({ - pdfDoc: b, + pdfDoc: U, reason: 'Digitally signed by OpenSign for ' + p + ' <' + m + '>', location: 'location', signatureLength: 15e3, }), - (U = await b.save()), - Buffer.from(U))), + (b = await U.save()), + Buffer.from(b))), (I = await new SignPDF(e, u).signPDF()), - fs.writeFileSync(A, I), + fs.writeFileSync(x, I), I) - : (fs.writeFileSync(A, e), e) + : (fs.writeFileSync(x, e), e) ).length; - var w, - D, - x = await uploadFile(S, A); - if (x && x.imageUrl) + var A, + w, + D = await uploadFile(S, x); + if (D && D.imageUrl) return ( - (w = await updateDoc( + (A = await updateDoc( i.params.docId, - x.imageUrl, + D.imageUrl, r.data.results[0].objectId, i.headers['x-real-ip'], n.data, o )), - sendDoctoWebhook(n, x.imageUrl, 'signed', r?.data.results?.[0]), - saveFileUsage(s, x.imageUrl, d.data.objectId), - w && - w.isCompleted && - ((D = { - url: x.imageUrl, + sendDoctoWebhook(n, D.imageUrl, 'signed', r?.data.results?.[0]), + saveFileUsage(s, D.imageUrl, d.data.objectId), + A && + A.isCompleted && + ((w = { + url: D.imageUrl, sender: { Mail: n.data.ExtUserPtr.Email, Name: 'OpenSign™' }, pdfName: n.data.Name, receiver: n.data.ExtUserPtr.Email, + extUserId: n.data.ExtUserPtr.objectId, }), n.data.IsSendMail && !1 === n.data.IsSendMail ? console.log("don't send mail") - : sendCompletedMail(D), - sendDoctoWebhook(n, x.imageUrl, 'completed')), - fs.unlinkSync(A), - console.log('New Signed PDF created called: ' + A), - 'success' === w.message - ? { status: 'success', data: x.imageUrl } + : sendCompletedMail(w), + sendDoctoWebhook(n, D.imageUrl, 'completed')), + fs.unlinkSync(x), + console.log('New Signed PDF created called: ' + x), + 'success' === A.message + ? { status: 'success', data: D.imageUrl } : { status: 'error', message: 'please provide required parameters!' } ); } diff --git a/apps/OpenSignServer/cloud/parsefunction/sendMail.js b/apps/OpenSignServer/cloud/parsefunction/sendMailv3.js similarity index 88% rename from apps/OpenSignServer/cloud/parsefunction/sendMail.js rename to apps/OpenSignServer/cloud/parsefunction/sendMailv3.js index f8fb5f8da..dd5844e61 100644 --- a/apps/OpenSignServer/cloud/parsefunction/sendMail.js +++ b/apps/OpenSignServer/cloud/parsefunction/sendMailv3.js @@ -3,8 +3,9 @@ import https from 'https'; import formData from 'form-data'; import Mailgun from 'mailgun.js'; import { createTransport } from 'nodemailer'; +import { updateMailCount } from '../../Utils.js'; -async function sendmail(req) { +async function sendmailv3(req) { try { let transporterSMTP; let mailgunClient; @@ -77,6 +78,9 @@ async function sendmail(req) { const res = await transporterSMTP.sendMail(messageParams); console.log('Res ', res); if (!res.err) { + if (req.params?.extUserId) { + await updateMailCount(req.params.extUserId); + } return { status: 'success', }; @@ -85,6 +89,9 @@ async function sendmail(req) { const res = await mailgunClient.messages.create(mailgunDomain, messageParams); console.log('Res ', res); if (res.status === 200) { + if (req.params?.extUserId) { + await updateMailCount(req.params.extUserId); + } return { status: 'success', }; @@ -109,6 +116,9 @@ async function sendmail(req) { const res = await transporterSMTP.sendMail(messageParams); console.log('Res ', res); if (!res.err) { + if (req.params?.extUserId) { + await updateMailCount(req.params.extUserId); + } return { status: 'success', }; @@ -117,6 +127,9 @@ async function sendmail(req) { const res = await mailgunClient.messages.create(mailgunDomain, messageParams); console.log('Res ', res); if (res.status === 200) { + if (req.params?.extUserId) { + await updateMailCount(req.params.extUserId); + } return { status: 'success', }; @@ -124,11 +137,11 @@ async function sendmail(req) { } } } catch (err) { - console.log('err ', err); + console.log('err in sendmailv3', err); if (err) { return { status: 'error' }; } } } -export default sendmail; +export default sendmailv3; diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 9ae7cce6b..521205fa6 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -86,7 +86,9 @@ if (process.env.SMTP_ENABLE) { console.log('Please provide valid Mailgun credentials'); } } - +const mailsender = process.env.SMTP_ENABLE + ? process.env.SMTP_USER_EMAIL + : process.env.MAILGUN_SENDER; export const config = { databaseURI: process.env.DATABASE_URI || process.env.MONGODB_URI || 'mongodb://localhost:27017/dev', @@ -102,7 +104,7 @@ export const config = { verifyUserEmails: isMailAdapter === true ? true : false, publicServerURL: process.env.SERVER_URL || 'http://localhost:8080/app', // Your apps name. This will appear in the subject and body of the emails that are sent. - appName: 'Open Sign', + appName: 'Opensign', allowClientClassCreation: false, allowExpiredAuthDataToken: false, encodeParseObjectInCloudFunction: true, @@ -112,9 +114,7 @@ export const config = { module: 'parse-server-api-mail-adapter', options: { // The email address from which emails are sent. - sender: process.env.SMTP_ENABLE - ? process.env.SMTP_USER_EMAIL - : process.env.MAILGUN_SENDER, + sender: 'Opensign™' + ' <' + mailsender + '>', // The email templates. templates: { // The template used by Parse Server to send an email for password