From f96df699e4520e255c12b5b4aa88a9e80a3373a0 Mon Sep 17 00:00:00 2001 From: RaktimaNXG Date: Mon, 22 Apr 2024 17:26:14 +0530 Subject: [PATCH 1/3] fix: update getSubscription cloud function for guest login flow and handle subscription details --- apps/OpenSign/src/constant/Utils.js | 17 ++- apps/OpenSign/src/pages/PdfRequestFiles.js | 27 ++-- .../cloud/parsefunction/getSubscriptions.js | 117 +++++++++++++----- 3 files changed, 119 insertions(+), 42 deletions(-) diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index fb7f7309f..4d6b01d01 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -13,9 +13,10 @@ export const openInNewTab = (url) => { window.open(url, "_blank", "noopener,noreferrer"); }; -export async function fetchSubscription(extUserId) { +export async function fetchSubscription(extUserId, contactObjId) { try { const extClass = localStorage.getItem("Extand_Class"); + const isGuestSign = localStorage.getItem("isGuestSigner"); let extUser; if (extClass) { const jsonSender = JSON.parse(extClass); @@ -30,10 +31,18 @@ export async function fetchSubscription(extUserId) { "X-Parse-Application-Id": localStorage.getItem("parseAppId"), sessionToken: localStorage.getItem("accesstoken") }; - const params = { extUserId: extUser }; + const params = isGuestSign + ? { contactId: contactObjId } + : { extUserId: extUser }; const tenatRes = await axios.post(url, params, { headers: headers }); - const plan = tenatRes.data?.result?.result?.PlanCode; - const billingDate = tenatRes.data?.result?.result?.Next_billing_date?.iso; + let plan, status, billingDate; + if (isGuestSign) { + plan = tenatRes.data?.result?.result?.plan; + status = tenatRes.data?.result?.result?.isSubscribed; + } else { + plan = tenatRes.data?.result?.result?.PlanCode; + billingDate = tenatRes.data?.result?.result?.Next_billing_date?.iso; + } return { plan, billingDate }; } catch (err) { console.log("Err in fetch subscription", err); diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 70a252528..0d99d800e 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -138,10 +138,12 @@ function PdfRequestFiles() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [divRef.current]); - async function checkIsSubscribed(extUserId) { - const res = await fetchSubscription(extUserId); + async function checkIsSubscribed(extUserId, contactId) { + const isGuestSign = localStorage.getItem("isGuestSigner"); + const res = await fetchSubscription(extUserId, contactId); const plan = res.plan; - const billingDate = res.billingDate; + const billingDate = res?.billingDate; + const status = res?.status; if (plan === "freeplan") { return true; } else if (billingDate) { @@ -155,8 +157,15 @@ function PdfRequestFiles() { navigate(`/subscription`); } } + } else if (isGuestSign) { + if (status) { + setIsSubscribed(true); + return true; + } else { + setIsSubscriptionExpired(true); + } } else { - if (location.pathname.includes("/load/")) { + if (isGuestSign) { setIsSubscriptionExpired(true); } else { navigate(`/subscription`); @@ -178,9 +187,7 @@ function PdfRequestFiles() { } else { setPdfArrayBuffer(arrayBuffer); } - if (isEnableSubscription) { - await checkIsSubscribed(documentData[0]?.ExtUserPtr?.objectId); - } + setExtUserId(documentData[0]?.ExtUserPtr?.objectId); const isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted; @@ -196,6 +203,12 @@ function PdfRequestFiles() { ); currUserId = getCurrentSigner[0] ? getCurrentSigner[0].objectId : ""; + if (isEnableSubscription) { + await checkIsSubscribed( + documentData[0]?.ExtUserPtr?.objectId, + currUserId + ); + } setSignerObjectId(currUserId); if (documentData[0].SignedUrl) { setPdfUrl(documentData[0].SignedUrl); diff --git a/apps/OpenSignServer/cloud/parsefunction/getSubscriptions.js b/apps/OpenSignServer/cloud/parsefunction/getSubscriptions.js index f094143ba..80dae27de 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getSubscriptions.js +++ b/apps/OpenSignServer/cloud/parsefunction/getSubscriptions.js @@ -2,41 +2,96 @@ import axios from 'axios'; const serverUrl = process.env.SERVER_URL; const appId = process.env.APP_ID; export default async function getSubscription(request) { - const extUserId = request.params.extUserId; - try { - const userRes = await axios.get(serverUrl + '/users/me', { - headers: { - 'X-Parse-Application-Id': appId, - 'X-Parse-Session-Token': request.headers['sessiontoken'], - }, - }); - const userId = userRes.data && userRes.data.objectId; - if (userId) { - const subcriptionCls = new Parse.Query('contracts_Users'); - const exUser = await subcriptionCls.get(extUserId, { useMasterKey: true }); - if (exUser) { - const subscriptionCls = new Parse.Query('contracts_Subscriptions'); - subscriptionCls.equalTo('TenantId', { - __type: 'Pointer', - className: 'partners_Tenant', - objectId: exUser.get('TenantId').id, - }); - subscriptionCls.descending('createdAt'); - const subcripitions = await subscriptionCls.first({ useMasterKey: true }); - if (subcripitions) { - const _subcripitions = JSON.parse(JSON.stringify(subcripitions)); - return { status: 'success', result: _subcripitions }; + const extUserId = request.params.extUserId || ''; + const contactId = request.params.contactId || ''; + + if (extUserId) { + try { + const userRes = await axios.get(serverUrl + '/users/me', { + headers: { + 'X-Parse-Application-Id': appId, + 'X-Parse-Session-Token': request.headers['sessiontoken'], + }, + }); + const userId = userRes.data && userRes.data.objectId; + if (userId) { + const extCls = new Parse.Query('contracts_Users'); + const exUser = await extCls.get(extUserId, { useMasterKey: true }); + if (exUser) { + const subscriptionCls = new Parse.Query('contracts_Subscriptions'); + subscriptionCls.equalTo('TenantId', { + __type: 'Pointer', + className: 'partners_Tenant', + objectId: exUser.get('TenantId').id, + }); + subscriptionCls.descending('createdAt'); + const subcripitions = await subscriptionCls.first({ useMasterKey: true }); + if (subcripitions) { + const _subcripitions = JSON.parse(JSON.stringify(subcripitions)); + return { status: 'success', result: _subcripitions }; + } else { + return { status: 'success', result: {} }; + } } else { - return { status: 'success', result: {} }; + return { status: 'error', result: 'User not found!' }; } } else { - return { status: 'error', result: 'User not found!' }; + return { status: 'error', result: 'Invalid session token!' }; } - } else { - return { status: 'error', result: 'Invalid session token!' }; + } catch (err) { + console.log('Err in get subscription', err.message); + return { status: 'error', result: err.message }; } - } catch (err) { - console.log('Err in get subscription', err.message); - return { status: 'error', result: err.message }; + } else if (contactId) { + try { + const userRes = await axios.get(serverUrl + '/users/me', { + headers: { + 'X-Parse-Application-Id': appId, + 'X-Parse-Session-Token': request.headers['sessiontoken'], + }, + }); + + const userId = userRes.data && userRes.data.objectId; + if (userId) { + const contactCls = new Parse.Query('contracts_Contactbook'); + const contactUser = await contactCls.get(contactId, { useMasterKey: true }); + if (contactUser) { + const subscriptionCls = new Parse.Query('contracts_Subscriptions'); + subscriptionCls.equalTo('TenantId', { + __type: 'Pointer', + className: 'partners_Tenant', + objectId: contactUser.get('TenantId').id, + }); + subscriptionCls.descending('createdAt'); + const subcripitions = await subscriptionCls.first({ useMasterKey: true }); + + if (subcripitions) { + const _subcripitions = JSON.parse(JSON.stringify(subcripitions)); + if (_subcripitions.PlanCode === 'freeplan') { + return { status: 'success', result: { isSubscribed: false, plan: 'freeplan' } }; + } else if (_subcripitions?.Next_billing_date?.iso) { + if (new Date(_subcripitions.Next_billing_date.iso) > new Date()) { + return { status: 'success', result: { isSubscribed: true } }; + } else { + return { status: 'success', result: { isSubscribed: false } }; + } + } else { + return { status: 'success', result: { isSubscribed: false } }; + } + } else { + return { status: 'success', result: { isSubscribed: false } }; + } + } else { + return { status: 'error', result: 'User not found!' }; + } + } else { + return { status: 'error', result: 'Invalid session token!' }; + } + } catch (err) { + console.log('Err in get subscription2', err.message); + return { status: 'error', result: err.message }; + } + } else { + return { status: 'error', result: 'Invalid session token!' }; } } From 174b9b99412af4ecd637728138a31bf4249e92fa Mon Sep 17 00:00:00 2001 From: RaktimaNXG Date: Mon, 22 Apr 2024 17:45:48 +0530 Subject: [PATCH 2/3] fix: fix subscription issue --- apps/OpenSign/src/constant/Utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index 4d6b01d01..17189865a 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -43,7 +43,7 @@ export async function fetchSubscription(extUserId, contactObjId) { plan = tenatRes.data?.result?.result?.PlanCode; billingDate = tenatRes.data?.result?.result?.Next_billing_date?.iso; } - return { plan, billingDate }; + return { plan, billingDate, status }; } catch (err) { console.log("Err in fetch subscription", err); return { plan: "", billingDate: "" }; From d5bc2df20f7397c67bec53d4a5be104138f097f1 Mon Sep 17 00:00:00 2001 From: RaktimaNXG Date: Mon, 22 Apr 2024 18:53:41 +0530 Subject: [PATCH 3/3] feat: add mailProvider parameter in sendmailv3 function and signPdf function --- .../src/components/pdf/EmailComponent.js | 5 ++++- apps/OpenSign/src/constant/Utils.js | 4 +++- apps/OpenSign/src/pages/PdfRequestFiles.js | 21 +++++++++++++++++-- apps/OpenSign/src/pages/PlaceHolderSign.js | 17 ++++++++------- apps/OpenSign/src/pages/SignyourselfPdf.js | 20 +++++++++++------- 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/EmailComponent.js b/apps/OpenSign/src/components/pdf/EmailComponent.js index 879ff5fa2..b1e905719 100644 --- a/apps/OpenSign/src/components/pdf/EmailComponent.js +++ b/apps/OpenSign/src/components/pdf/EmailComponent.js @@ -16,7 +16,8 @@ function EmailComponent({ pdfName, sender, setIsAlert, - extUserId + extUserId, + activeMailAdapter }) { const [emailList, setEmailList] = useState([]); const [emailValue, setEmailValue] = useState(); @@ -24,6 +25,7 @@ function EmailComponent({ //function for send email const sendEmail = async () => { setIsLoading(true); + let sendMail; for (let i = 0; i < emailList.length; i++) { try { @@ -39,6 +41,7 @@ function EmailComponent({ const openSignUrl = "https://www.opensignlabs.com/contact-us"; const themeBGcolor = themeColor; let params = { + mailProvider: activeMailAdapter, extUserId: extUserId, pdfName: pdfName, url: pdfUrl, diff --git a/apps/OpenSign/src/constant/Utils.js b/apps/OpenSign/src/constant/Utils.js index 17189865a..3ec7bad23 100644 --- a/apps/OpenSign/src/constant/Utils.js +++ b/apps/OpenSign/src/constant/Utils.js @@ -537,7 +537,8 @@ export const signPdfFun = async ( signerObjectId, setIsAlert, objectId, - isSubscribed + isSubscribed, + activeMailAdapter ) => { let singleSign, isCustomCompletionMail = false; @@ -557,6 +558,7 @@ export const signPdfFun = async ( } singleSign = { + mailProvider: activeMailAdapter, pdfFile: base64Url, docId: documentId, userId: signerObjectId, diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 0d99d800e..9b83567da 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -24,7 +24,8 @@ import { radioButtonWidget, replaceMailVaribles, fetchSubscription, - convertPdfArrayBuffer + convertPdfArrayBuffer, + contractUsers } from "../constant/Utils"; import Loader from "../primitives/LoaderWithMsg"; import HandleError from "../primitives/HandleError"; @@ -590,6 +591,20 @@ function PdfRequestFiles() { ); //get ExistUserPtr object id of user class to get tenantDetails const objectId = pdfDetails?.[0]?.ExtUserPtr?.UserId?.objectId; + + const res = await contractUsers(jsonSender?.email); + console.log("res", res); + let activeMailAdapter = ""; + if (res === "Error: Something went wrong!") { + setHandleError("Error: Something went wrong!"); + setIsLoading({ + isLoad: false + }); + } else if (!res || res?.length === 0) { + activeMailAdapter = ""; + } else if (res[0] && res.length) { + activeMailAdapter = res[0]?.active_mail_adapter; + } //function for call to embed signature in pdf and get digital signature pdf try { const res = await signPdfFun( @@ -598,7 +613,8 @@ function PdfRequestFiles() { signerObjectId, setIsAlert, objectId, - isSubscribed + isSubscribed, + activeMailAdapter ); if (res && res.status === "success") { setPdfUrl(res.data); @@ -690,6 +706,7 @@ function PdfRequestFiles() { } let params = { + mailProvider: activeMailAdapter, extUserId: extUserId, recipient: user.Email, subject: requestSubject diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index cd11a1c03..cb8928940 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -123,6 +123,7 @@ function PlaceHolderSign() { const [requestSubject, setRequestSubject] = useState(""); const [requestBody, setRequestBody] = useState(""); const [pdfArrayBuffer, setPdfArrayBuffer] = useState(""); + const [activeMailAdapter, setActiveMailAdapter] = useState(""); const [isAlreadyPlace, setIsAlreadyPlace] = useState({ status: false, message: "" @@ -406,7 +407,14 @@ function PlaceHolderSign() { setIsLoading(loadObj); } const res = await contractUsers(jsonSender.email); - if (res[0] && res.length) { + if (res === "Error: Something went wrong!") { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } else if (res[0] && res.length) { + setActiveMailAdapter(res[0]?.active_mail_adapter); setSignerUserId(res[0].objectId); const tourstatus = res[0].TourStatus && res[0].TourStatus; if (tourstatus && tourstatus.length > 0) { @@ -422,12 +430,6 @@ function PlaceHolderSign() { isLoad: false }; setIsLoading(loadObj); - } else if (res === "Error: Something went wrong!") { - const loadObj = { - isLoad: false - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); } else if (res.length === 0) { setHandleError("No Data Found!"); const loadObj = { @@ -1104,6 +1106,7 @@ function PlaceHolderSign() { } let params = { + mailProvider: activeMailAdapter, extUserId: extUserId, recipient: signerMail[i].Email, subject: isCustomize diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index 871b0c426..b14c6934c 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -104,6 +104,7 @@ function SignYourSelf() { const [extUserId, setExtUserId] = useState(""); const [isCompleted, setIsCompleted] = useState(false); const [pdfArrayBuffer, setPdfArrayBuffer] = useState(""); + const [activeMailAdapter, setActiveMailAdapter] = useState(""); const divRef = useRef(null); const nodeRef = useRef(null); const [, drop] = useDrop({ @@ -266,7 +267,14 @@ function SignYourSelf() { setIsLoading(loadObj); }); const contractUsersRes = await contractUsers(jsonSender.email); - if (contractUsersRes[0] && contractUsersRes.length > 0) { + if (contractUsersRes === "Error: Something went wrong!") { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } else if (contractUsersRes[0] && contractUsersRes.length > 0) { + setActiveMailAdapter(contractUsersRes[0]?.active_mail_adapter); setContractName("_Users"); setSignerUserId(contractUsersRes[0].objectId); const tourstatuss = @@ -286,12 +294,6 @@ function SignYourSelf() { isLoad: false }; setIsLoading(loadObj); - } else if (contractUsersRes === "Error: Something went wrong!") { - const loadObj = { - isLoad: false - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); } else if (contractUsersRes.length === 0) { const contractContactBook = await contactBook(jsonSender.objectId); if (contractContactBook && contractContactBook.length > 0) { @@ -615,7 +617,8 @@ function SignYourSelf() { let singleSign = { pdfFile: base64Url, docId: documentId, - isCustomCompletionMail: isCustomCompletionMail + isCustomCompletionMail: isCustomCompletionMail, + mailProvider: activeMailAdapter }; await axios @@ -1138,6 +1141,7 @@ function SignYourSelf() { sender={jsonSender} setIsAlert={setIsAlert} extUserId={extUserId} + activeMailAdapter={activeMailAdapter} /> {/* pdf header which contain funish back button */}