From db4494c463a8bc9756576ba096a22249abb980e9 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 9 Nov 2023 17:08:57 +0530 Subject: [PATCH 01/20] security improvment --- apps/OpenSign/src/components/LoginFacebook.js | 12 +-- apps/OpenSign/src/components/LoginGoogle.js | 8 +- apps/OpenSign/src/routes/Login.js | 77 ++++++++----------- apps/OpenSign/src/routes/Pgsignup.js | 12 +-- apps/OpenSign/src/routes/Signup.js | 5 +- apps/OpenSignServer/cloud/main.js | 2 + .../cloud/parsefunction/getContractUser.js | 12 +++ apps/OpenSignServer/package-lock.json | 7 ++ .../default-data/legadraGCva.w_dashboard.json | 2 +- 9 files changed, 68 insertions(+), 69 deletions(-) create mode 100644 apps/OpenSignServer/cloud/parsefunction/getContractUser.js diff --git a/apps/OpenSign/src/components/LoginFacebook.js b/apps/OpenSign/src/components/LoginFacebook.js index e6b77eed3..d158a96aa 100644 --- a/apps/OpenSign/src/components/LoginFacebook.js +++ b/apps/OpenSign/src/components/LoginFacebook.js @@ -27,14 +27,14 @@ const LoginFacebook = ({ setThirdpartyLoader(true); const details = { Email: response.email, - Name: response.name, + Name: response.name }; setUserDetails({ ...userDetails, ...details }); const fDetails = { Id: response.userID, AccessToken: response.accessToken, Name: response.name, - Email: response.email, + Email: response.email }; setFBDetails({ ...fBDetails, ...fDetails }); const res = await checkExtUser(fDetails); @@ -42,9 +42,11 @@ const LoginFacebook = ({ }; const checkExtUser = async (details) => { - const extUser = new Parse.Query("contracts_Users"); - extUser.equalTo("Email", details.Email); - const extRes = await extUser.first(); + // const extUser = new Parse.Query("contracts_Users"); + // extUser.equalTo("Email", details.Email); + // const extRes = await extUser.first(); + const params = { email: details.Email }; + const extRes = await Parse.Cloud.run("getContractUser", params); // console.log("extRes ", extRes); if (extRes) { const params = { ...details, Phone: extRes.get("Phone") }; diff --git a/apps/OpenSign/src/components/LoginGoogle.js b/apps/OpenSign/src/components/LoginGoogle.js index 5fbf3309c..2a19f7c8f 100644 --- a/apps/OpenSign/src/components/LoginGoogle.js +++ b/apps/OpenSign/src/components/LoginGoogle.js @@ -66,9 +66,11 @@ const GoogleSignInBtn = ({ } }; const checkExtUser = async (details) => { - const extUser = new Parse.Query("contracts_Users"); - extUser.equalTo("Email", details.Gmail); - const extRes = await extUser.first(); + // const extUser = new Parse.Query("contracts_Users"); + // extUser.equalTo("Email", details.Gmail); + // const extRes = await extUser.first(); + const params = { email: details.Gmail }; + const extRes = await Parse.Cloud.run("getContractUser", params); // console.log("extRes ", extRes); if (extRes) { const params = { ...details, Phone: extRes.get("Phone") }; diff --git a/apps/OpenSign/src/routes/Login.js b/apps/OpenSign/src/routes/Login.js index 9ca1a2eb0..509dc0efd 100644 --- a/apps/OpenSign/src/routes/Login.js +++ b/apps/OpenSign/src/routes/Login.js @@ -129,7 +129,7 @@ function Login(props) { ); if (rolesfiltered.length > 0) { _currentRole = rolesfiltered[0]; - } + } } else { const rolesfiltered = userRoles.filter( (x) => !valuesToExclude.includes(x) @@ -334,23 +334,6 @@ function Login(props) { sessionToken: user.getSessionToken() }; handleSubmitbtn(payload); - // setState({ - // ...state, - // loading: false, - // toastColor: "#d9534f", - // toastDescription: - // "You dont have access to this application." - // }); - - // const x = document.getElementById("snackbar"); - // x.className = "show"; - // setTimeout(function () { - // x.className = x.className.replace( - // "show", - // "" - // ); - // }, 2000); - // localStorage.setItem("accesstoken", null); console.error( "Error while fetching Follow", error @@ -472,7 +455,7 @@ function Login(props) { ); if (rolesfiltered.length > 0) { _currentRole = rolesfiltered[0]; - } + } } else { const rolesfiltered = userRoles.filter( (x) => !valuesToExclude.includes(x) @@ -596,6 +579,30 @@ function Login(props) { setThirdpartyLoader(false); setState({ ...state, loading: false }); if (process.env.REACT_APP_ENABLE_SUBSCRIPTION) { + if (billingDate) { + if (billingDate > new Date()) { + localStorage.removeItem("userDetails"); + navigate( + `/${element.pageType}/${element.pageId}` + ); + } else { + navigate(`/subscription`); + } + } else { + navigate(`/subscription`); + } + } + } + } else { + localStorage.setItem("PageLanding", element.pageId); + localStorage.setItem( + "defaultmenuid", + element.menuId + ); + localStorage.setItem("pageType", element.pageType); + setState({ ...state, loading: false }); + setThirdpartyLoader(false); + if (process.env.REACT_APP_ENABLE_SUBSCRIPTION) { if (billingDate) { if (billingDate > new Date()) { localStorage.removeItem("userDetails"); @@ -610,31 +617,7 @@ function Login(props) { } } } - } else { - localStorage.setItem("PageLanding", element.pageId); - localStorage.setItem( - "defaultmenuid", - element.menuId - ); - localStorage.setItem("pageType", element.pageType); - setState({ ...state, loading: false }); - setThirdpartyLoader(false); - if (process.env.REACT_APP_ENABLE_SUBSCRIPTION) { - if (billingDate) { - if (billingDate > new Date()) { - localStorage.removeItem("userDetails"); - navigate( - `/${element.pageType}/${element.pageId}` - ); - } else { - navigate(`/subscription`); - } - } else { - navigate(`/subscription`); - } - } - } - }, + }, (error) => { const payload = { sessionToken: sessionToken @@ -655,7 +638,6 @@ function Login(props) { } else { setThirdpartyLoader(false); setState({ ...state, loading: false }); - } }) .catch((err) => { @@ -717,9 +699,10 @@ function Login(props) { await axios .post(url, JSON.stringify(body), { headers: headers1 }) - .then((roles) => { + .then((axiosres) => { + const roles = axiosres.data.result; if (roles) { - userRoles = roles.data.result; + userRoles = roles; let _currentRole = ""; if (userRoles.length > 1) { if ( diff --git a/apps/OpenSign/src/routes/Pgsignup.js b/apps/OpenSign/src/routes/Pgsignup.js index bda1934a4..ab215844c 100644 --- a/apps/OpenSign/src/routes/Pgsignup.js +++ b/apps/OpenSign/src/routes/Pgsignup.js @@ -67,9 +67,8 @@ const PgSignUp = (props) => { const userSettings = JSON.parse(localStorage.getItem("userSettings")); const extClass = userSettings[0].extended_class; // console.log("extClass ", extClass); - const checkUser = new Parse.Query(extClass); - checkUser.equalTo("Email", userDetails.email); - const res = await checkUser.first(); + const params = { email: userDetails.email }; + const res = await Parse.Cloud.run("getContractUser", params); // console.log("res", res); if (res) { const checkUser = new Parse.Query(extClass); @@ -279,13 +278,6 @@ const PgSignUp = (props) => { "" ); localStorage.setItem("_user_role", _role); - - if (element.enableCart) { - localStorage.setItem("EnableCart", element.enableCart); - props.setEnableCart(element.enableCart); - } else { - localStorage.removeItem("EnableCart"); - } // Get TenentID from Extendend Class localStorage.setItem( "extended_class", diff --git a/apps/OpenSign/src/routes/Signup.js b/apps/OpenSign/src/routes/Signup.js index 1f52261b6..31c26f566 100644 --- a/apps/OpenSign/src/routes/Signup.js +++ b/apps/OpenSign/src/routes/Signup.js @@ -101,9 +101,8 @@ const Signup = (props) => { }) .catch(async (err) => { if (err.code === 202) { - const userQuery = new Parse.Query("contracts_Users"); - userQuery.equalTo("Email", email); - const res = await userQuery.first(); + const params = { email: email }; + const res = await Parse.Cloud.run("getContractUser", params); // console.log("Res ", res); if (res) { alert("User already exists with this username!"); diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 45cc0efae..ed4396a9f 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -13,6 +13,7 @@ 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 getContractUser from './parsefunction/getContractUser.js'; Parse.Cloud.define('AddUserToRole', addUserToGroups); Parse.Cloud.define('UserGroups', getUserGroups); @@ -29,3 +30,4 @@ Parse.Cloud.define('SendOTPMailV1', sendMailOTPv1); Parse.Cloud.define('sendmail', SendMailv1); Parse.Cloud.define('AuthLoginAsMail', AuthLoginAsMail); Parse.Cloud.define('getUserId', getUserId); +Parse.Cloud.define('getContractUser', getContractUser); diff --git a/apps/OpenSignServer/cloud/parsefunction/getContractUser.js b/apps/OpenSignServer/cloud/parsefunction/getContractUser.js new file mode 100644 index 000000000..96f403be4 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/getContractUser.js @@ -0,0 +1,12 @@ +async function getContractUser(request) { + try { + const userQuery = new Parse.Query('contracts_Users'); + userQuery.equalTo('Email', request.params.email); + const res = await userQuery.first({ useMasterKey: true }); + return res; + } catch (err) { + console.log('Err ', err); + return err; + } +} +export default getContractUser; diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 6b692e824..aadbb80b1 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -28,6 +28,7 @@ "parse": "4.1.0", "parse-server": "6.3.1", "parse-server-api-mail-adapter": "^3.0.0", + "parse-server-fs-adapter": "1.0.1", "parse-server-s3-adapter": "^1.2.0", "pdf-lib": "^1.16.0", "pdfkit": "^0.13.0", @@ -7403,6 +7404,12 @@ "node": ">=12" } }, + "node_modules/parse-server-fs-adapter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-server-fs-adapter/-/parse-server-fs-adapter-1.0.1.tgz", + "integrity": "sha512-5IRKAT2QkzHrYrBESY4E8jsV1sl+XVBTKGyUvBPgBR2QzsTTqiyU/lFZD8PAJavA+TH1BLyLTUMZbhZhswNVbQ==", + "deprecated": "use @parse/fs-files-adapter" + }, "node_modules/parse-server-s3-adapter": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parse-server-s3-adapter/-/parse-server-s3-adapter-1.2.0.tgz", diff --git a/apps/mongo/default-data/legadraGCva.w_dashboard.json b/apps/mongo/default-data/legadraGCva.w_dashboard.json index 3ca1737a5..3f2c2794f 100644 --- a/apps/mongo/default-data/legadraGCva.w_dashboard.json +++ b/apps/mongo/default-data/legadraGCva.w_dashboard.json @@ -40,7 +40,7 @@ "id": "c1935cc0-28d4-3d73-b72a-8c1e3d18a17f", "queryType": "", "class": "contracts_Document", - "query": "where={\"CreatedBy\":{\"__type\":\"Pointer\",\"className\":\"_User\",\"objectId\":\"#UserId.objectId#\"},\"IsCompleted\":{\"$ne\":true},\"IsDeclined\":{\"$ne\":true},\"Type\":{\"$ne\":\"Folder\"},\"Placeholders\":{\"$ne\":null},\"ExpiryDate\":{\"#*gt\":{\"__type\":\"#Date#\",\"iso\":\"#today#\"}}}&count=1", + "query": "where={\"IsDeclined\":{\"$ne\":true},\"IsCompleted\":{\"$ne\":true},\"Type\":{\"$ne\":\"Folder\"},\"Placeholders\":{\"$ne\":null},\"ExpiryDate\":{\"#*gt\":{\"__type\":\"#Date#\",\"iso\":\"#today#\"}}}&include=Signers,AuditTrail.UserPtr", "key": "count", "Redirect_type": "Report", "Redirect_id": "1MwEuxLEkF", From 93a891c8b680065522cd843089a944a041381192 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 16 Nov 2023 10:47:11 +0530 Subject: [PATCH 02/20] feat: add migration code for contracts_users class --- .../cloud/parsefunction/ZohoDetails.js | 2 +- .../20231110174122-create_setclp.cjs | 60 +++++++++++++++++++ apps/OpenSignServer/index.js | 23 ++++++- apps/OpenSignServer/runmigrate.js | 37 ++++++++++++ 4 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs create mode 100644 apps/OpenSignServer/runmigrate.js diff --git a/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js b/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js index f3d14c616..f2249e53b 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js +++ b/apps/OpenSignServer/cloud/parsefunction/ZohoDetails.js @@ -50,7 +50,7 @@ export default async function ZohoDetails(request) { phone: userData.data.data.subscription.contactpersons[0].mobile, name: first_name + ' ' + last_name, email: userData.data.data.subscription.contactpersons[0].email, - nextBillingDate: userData.data.expiring_time, + nextBillingDate: userData.data.data.subscription.next_billing_at, company: company_name, plan: userData.data.data.subscription.plan, customer_id: userData.data.data.subscription.customer_id, diff --git a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs b/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs new file mode 100644 index 000000000..b3a670318 --- /dev/null +++ b/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs @@ -0,0 +1,60 @@ +/** + * + * @param {Parse} Parse + */ +exports.up = async Parse => { + // TODO: set className here + const className = 'Contracts_Users'; + const schema = new Parse.Schema(className); + schema.addString('Name'); + schema.addString('Phone'); + schema.addString('JobTitle'); + schema.addString('Email'); + schema.addString('Company'); + schema.addString('UserRole'); + schema.addObject('Plan'); + schema.addString('Customer_id'); + schema.addString('Subscription_id'); + schema.addString('Next_billing_date'); + schema.addBoolean('IsContactEntry'); + schema.addBoolean('ShareWithTeam'); + schema.addPointer('TenantId', "partners_Tenant") + schema.addPointer('UserId', "_User") + schema.addPointer("CreatedBy", "_User") + schema.setCLP({ + get: {}, + find: {}, + count: {}, + create: {}, + update: {}, + delete: {}, + addField: {}, + }); + + return schema.save(); + + + // const config = new Config(process.env.APP_ID, process.env.PARSE_MOUNT); + // const schema = await config.database.loadSchema(); + // await schema.setPermissions('myclass', { + // get: { requiresAuthentication: true }, + // find: { requiresAuthentication: true }, + // count: { requiresAuthentication: true }, + // create: { requiresAuthentication: true }, + // update: { requiresAuthentication: true }, + // delete: { requiresAuthentication: true }, + // addField: {}, + // }); +}; + +/** + * + * @param {Parse} Parse + */ +exports.down = async Parse => { + // TODO: set className here + const className = 'Contracts_Users'; + const schema = new Parse.Schema(className); + + return schema.purge().then(() => schema.delete()); +}; diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 814d9cf58..b60238cf7 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -17,10 +17,11 @@ import S3Adapter from 'parse-server-s3-adapter'; import FSFilesAdapter from 'parse-server-fs-adapter'; import AWS from 'aws-sdk'; import { app as customRoute } from './cloud/customRoute/customApp.js'; +import { exec } from 'child_process'; const spacesEndpoint = new AWS.Endpoint(process.env.DO_ENDPOINT); // console.log("configuration ", configuration); -if (process.env.USE_LOCAL !== "TRUE") { +if (process.env.USE_LOCAL !== 'TRUE') { const s3Options = { bucket: process.env.DO_SPACE, // globalConfig.S3FilesAdapter.bucket, baseUrl: process.env.DO_BASEURL, @@ -36,7 +37,7 @@ if (process.env.USE_LOCAL !== "TRUE") { var fsAdapter = new S3Adapter(s3Options); } else { var fsAdapter = new FSFilesAdapter({ - "filesSubDirectory": "files" // optional, defaults to ./files + filesSubDirectory: 'files', // optional, defaults to ./files }); } @@ -167,4 +168,22 @@ if (!process.env.TESTING) { }); // This will enable the Live Query real-time server await ParseServer.createLiveQueryServer(httpServer); + + const migrate = + 'APPLICATION_ID=legadranaxn SERVER_URL=http://localhost:8080/app MASTER_KEY=XnAwPDRQQyMr npx parse-dbtool migrate'; + // `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=${process.env.SERVER_URL} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; + + exec(migrate, (error, stdout, stderr) => { + if (error) { + console.error(`Error: ${error.message}`); + return; + } + + if (stderr) { + console.error(`Error: ${stderr}`); + return; + } + + console.log(`Command output: ${stdout}`); + }); } diff --git a/apps/OpenSignServer/runmigrate.js b/apps/OpenSignServer/runmigrate.js new file mode 100644 index 000000000..1757b0e1b --- /dev/null +++ b/apps/OpenSignServer/runmigrate.js @@ -0,0 +1,37 @@ +// const { exec } = require('child_process'); +import { exec } from 'child_process'; + +const migrate = + 'APPLICATION_ID=legadranaxn SERVER_URL=http://localhost:8080/app MASTER_KEY=XnAwPDRQQyMr npx parse-dbtool migrate'; +// `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=${process.env.SERVER_URL} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; + +exec(migrate, (error, stdout, stderr) => { + if (error) { + console.error(`Error: ${error.message}`); + return; + } + + if (stderr) { + console.error(`Error: ${stderr}`); + return; + } + + console.log(`Command output: ${stdout}`); +}); + +// const seeder = +// 'APPLICATION_ID=legadranaxn SERVER_URL=http://localhost:8080/app MASTER_KEY=XnAwPDRQQyMr npx parse-dbtool seed'; + +// exec(seeder, (error, stdout, stderr) => { +// if (error) { +// console.error(`Error: ${error.message}`); +// return; +// } + +// if (stderr) { +// console.error(`Error: ${stderr}`); +// return; +// } + +// console.log(`Command output: ${stdout}`); +// }); From 45d65cfbe2030a88089d09188224aac0e6f88d12 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 16 Nov 2023 11:00:49 +0530 Subject: [PATCH 03/20] change cloud function name getContractUser to getUserDetails --- apps/OpenSign/src/components/LoginFacebook.js | 2 +- apps/OpenSign/src/components/LoginGoogle.js | 2 +- apps/OpenSign/src/routes/Pgsignup.js | 2 +- apps/OpenSign/src/routes/Signup.js | 2 +- apps/OpenSignServer/cloud/main.js | 4 ++-- .../parsefunction/{getContractUser.js => getUserDetails.js} | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) rename apps/OpenSignServer/cloud/parsefunction/{getContractUser.js => getUserDetails.js} (78%) diff --git a/apps/OpenSign/src/components/LoginFacebook.js b/apps/OpenSign/src/components/LoginFacebook.js index d158a96aa..442fcb3e7 100644 --- a/apps/OpenSign/src/components/LoginFacebook.js +++ b/apps/OpenSign/src/components/LoginFacebook.js @@ -46,7 +46,7 @@ const LoginFacebook = ({ // extUser.equalTo("Email", details.Email); // const extRes = await extUser.first(); const params = { email: details.Email }; - const extRes = await Parse.Cloud.run("getContractUser", params); + const extRes = await Parse.Cloud.run("getUserDetails", params); // console.log("extRes ", extRes); if (extRes) { const params = { ...details, Phone: extRes.get("Phone") }; diff --git a/apps/OpenSign/src/components/LoginGoogle.js b/apps/OpenSign/src/components/LoginGoogle.js index 2a19f7c8f..7e00b8e8c 100644 --- a/apps/OpenSign/src/components/LoginGoogle.js +++ b/apps/OpenSign/src/components/LoginGoogle.js @@ -70,7 +70,7 @@ const GoogleSignInBtn = ({ // extUser.equalTo("Email", details.Gmail); // const extRes = await extUser.first(); const params = { email: details.Gmail }; - const extRes = await Parse.Cloud.run("getContractUser", params); + const extRes = await Parse.Cloud.run("getUserDetails", params); // console.log("extRes ", extRes); if (extRes) { const params = { ...details, Phone: extRes.get("Phone") }; diff --git a/apps/OpenSign/src/routes/Pgsignup.js b/apps/OpenSign/src/routes/Pgsignup.js index ab215844c..c47adbfcf 100644 --- a/apps/OpenSign/src/routes/Pgsignup.js +++ b/apps/OpenSign/src/routes/Pgsignup.js @@ -68,7 +68,7 @@ const PgSignUp = (props) => { const extClass = userSettings[0].extended_class; // console.log("extClass ", extClass); const params = { email: userDetails.email }; - const res = await Parse.Cloud.run("getContractUser", params); + const res = await Parse.Cloud.run("getUserDetails", params); // console.log("res", res); if (res) { const checkUser = new Parse.Query(extClass); diff --git a/apps/OpenSign/src/routes/Signup.js b/apps/OpenSign/src/routes/Signup.js index 137c76b21..280e5f9a3 100644 --- a/apps/OpenSign/src/routes/Signup.js +++ b/apps/OpenSign/src/routes/Signup.js @@ -102,7 +102,7 @@ const Signup = (props) => { .catch(async (err) => { if (err.code === 202) { const params = { email: email }; - const res = await Parse.Cloud.run("getContractUser", params); + const res = await Parse.Cloud.run("getUserDetails", params); // console.log("Res ", res); if (res) { alert("User already exists with this username!"); diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index ed4396a9f..2facd600c 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -13,7 +13,7 @@ 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 getContractUser from './parsefunction/getContractUser.js'; +import getUserDetails from './parsefunction/getUserDetails.js'; Parse.Cloud.define('AddUserToRole', addUserToGroups); Parse.Cloud.define('UserGroups', getUserGroups); @@ -30,4 +30,4 @@ Parse.Cloud.define('SendOTPMailV1', sendMailOTPv1); Parse.Cloud.define('sendmail', SendMailv1); Parse.Cloud.define('AuthLoginAsMail', AuthLoginAsMail); Parse.Cloud.define('getUserId', getUserId); -Parse.Cloud.define('getContractUser', getContractUser); +Parse.Cloud.define('getUserDetails', getUserDetails); diff --git a/apps/OpenSignServer/cloud/parsefunction/getContractUser.js b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js similarity index 78% rename from apps/OpenSignServer/cloud/parsefunction/getContractUser.js rename to apps/OpenSignServer/cloud/parsefunction/getUserDetails.js index 96f403be4..970d50f22 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getContractUser.js +++ b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js @@ -1,4 +1,4 @@ -async function getContractUser(request) { +async function getUserDetails(request) { try { const userQuery = new Parse.Query('contracts_Users'); userQuery.equalTo('Email', request.params.email); @@ -9,4 +9,4 @@ async function getContractUser(request) { return err; } } -export default getContractUser; +export default getUserDetails; From 2b67af609755a26d9738f70329f718ceef112f6e Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 16 Nov 2023 11:09:56 +0530 Subject: [PATCH 04/20] change create, update clp of contracts_Users class --- .../migrations/20231110174122-create_setclp.cjs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs b/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs index b3a670318..786c506af 100644 --- a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs +++ b/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs @@ -18,22 +18,21 @@ exports.up = async Parse => { schema.addString('Next_billing_date'); schema.addBoolean('IsContactEntry'); schema.addBoolean('ShareWithTeam'); - schema.addPointer('TenantId', "partners_Tenant") - schema.addPointer('UserId', "_User") - schema.addPointer("CreatedBy", "_User") + schema.addPointer('TenantId', 'partners_Tenant'); + schema.addPointer('UserId', '_User'); + schema.addPointer('CreatedBy', '_User'); schema.setCLP({ get: {}, find: {}, count: {}, - create: {}, - update: {}, + create: { '*': true }, + update: { '*': true }, delete: {}, addField: {}, }); return schema.save(); - // const config = new Config(process.env.APP_ID, process.env.PARSE_MOUNT); // const schema = await config.database.loadSchema(); // await schema.setPermissions('myclass', { From 3ad58ee52bc2b438d440a75ced8a75a661b1c49f Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 16 Nov 2023 11:16:28 +0530 Subject: [PATCH 05/20] update url of migrate --- apps/OpenSignServer/index.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 14ca95558..b126fe32f 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -21,7 +21,7 @@ import { exec } from 'child_process'; const spacesEndpoint = new AWS.Endpoint(process.env.DO_ENDPOINT); // console.log("configuration ", configuration); -if (process.env.USE_LOCAL !== "TRUE") { +if (process.env.USE_LOCAL !== 'TRUE') { const s3Options = { bucket: process.env.DO_SPACE, // globalConfig.S3FilesAdapter.bucket, baseUrl: process.env.DO_BASEURL, @@ -84,7 +84,9 @@ 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: process.env.SMTP_ENABLE + ? process.env.SMTP_USER_EMAIL + : process.env.MAILGUN_SENDER, // The email templates. templates: { // The template used by Parse Server to send an email for password @@ -185,9 +187,8 @@ if (!process.env.TESTING) { // This will enable the Live Query real-time server await ParseServer.createLiveQueryServer(httpServer); - const migrate = - 'APPLICATION_ID=legadranaxn SERVER_URL=http://localhost:8080/app MASTER_KEY=XnAwPDRQQyMr npx parse-dbtool migrate'; - // `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=${process.env.SERVER_URL} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; + const migrate = `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=${process.env.SERVER_URL} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; + // 'APPLICATION_ID={legadranaxn} SERVER_URL=http://localhost:8080/app MASTER_KEY=XnAwPDRQQyMr npx parse-dbtool migrate'; exec(migrate, (error, stdout, stderr) => { if (error) { From 642ef334f608d3d806f4526e6d895df52f0b24d3 Mon Sep 17 00:00:00 2001 From: Rishab <33950743+rishabjasrotia@users.noreply.github.com> Date: Fri, 17 Nov 2023 09:21:31 +0000 Subject: [PATCH 06/20] #170 - Fix While dragging sign placeholder in mobile view the drawbox pops up unexpectedly --- .../SignDocuments/src/Component/component/renderPdf.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/microfrontends/SignDocuments/src/Component/component/renderPdf.js b/microfrontends/SignDocuments/src/Component/component/renderPdf.js index 07cade06e..58e3670cd 100644 --- a/microfrontends/SignDocuments/src/Component/component/renderPdf.js +++ b/microfrontends/SignDocuments/src/Component/component/renderPdf.js @@ -606,7 +606,7 @@ function RenderPdf({ > {" "}
{ + onTouchEnd ={(e) => { if (!isDragging) { setTimeout(() => { e.stopPropagation(); @@ -640,6 +640,7 @@ function RenderPdf({ alt="signimg" onClick={(e) => { setSignKey(pos.key); + console.log("Drag 2"); setIsSignPad(true); setIsStamp(pos.isStamp); }} @@ -692,11 +693,10 @@ function RenderPdf({ }} >
{ + onTouchEnd ={(e) => { if (!isDragging) { setTimeout(() => { setIsSignPad(true); - setSignKey(pos.key); setIsStamp(pos.isStamp); }, 500); From 4a3276f4e3768b38e8bf7caacea02abf788c1778 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 Nov 2023 18:07:26 +0530 Subject: [PATCH 07/20] check migration functionality in staging app --- .../cloud/parsefunction/pdf/PDF.min.js | 4 +-- .../20231110174122-create_setclp.cjs | 12 ------- .../OpenSignServer/databases/seeders/.gitkeep | 0 apps/OpenSignServer/index.js | 31 +++++++++---------- 4 files changed, 16 insertions(+), 31 deletions(-) create mode 100644 apps/OpenSignServer/databases/seeders/.gitkeep diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js index a7d141891..6e0bb6658 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js @@ -132,7 +132,7 @@ async function PDF(s, r) { : ((a = await axios.get(serverUrl + '/classes/contracts_Users?where=' + m, { headers: { 'X-Parse-Application-Id': APPID, - 'X-Parse-Session-Token': s.headers.sessiontoken, + 'X-Parse-Master-Key': masterKEY, }, })), 'contracts_Users') @@ -142,7 +142,7 @@ async function PDF(s, r) { (c = await axios.get(serverUrl + '/classes/contracts_Users?where=' + p, { headers: { 'X-Parse-Application-Id': APPID, - 'X-Parse-Session-Token': s.headers.sessiontoken, + 'X-Parse-Master-Key': masterKEY, }, })).data && 0 < c.data.results.length ? ((a = c), 'contracts_Users') diff --git a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs b/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs index 8db57d426..83f059ef1 100644 --- a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs +++ b/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs @@ -32,18 +32,6 @@ exports.up = async Parse => { }); return schema.update(); - - // const config = new Config(process.env.APP_ID, process.env.PARSE_MOUNT); - // const schema = await config.database.loadSchema(); - // await schema.setPermissions('myclass', { - // get: { requiresAuthentication: true }, - // find: { requiresAuthentication: true }, - // count: { requiresAuthentication: true }, - // create: { requiresAuthentication: true }, - // update: { requiresAuthentication: true }, - // delete: { requiresAuthentication: true }, - // addField: {}, - // }); }; /** diff --git a/apps/OpenSignServer/databases/seeders/.gitkeep b/apps/OpenSignServer/databases/seeders/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index b126fe32f..676d7ce31 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -183,24 +183,21 @@ if (!process.env.TESTING) { httpServer.headersTimeout = 100000; // in milliseconds httpServer.listen(port, function () { console.log('parse-server-example running on port ' + port + '.'); + const migrate = `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=${process.env.SERVER_URL} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; + + exec(migrate, (error, stdout, stderr) => { + if (error) { + console.error(`Error: ${error.message}`); + return; + } + + if (stderr) { + console.error(`Error: ${stderr}`); + return; + } + console.log(`Command output: ${stdout}`); + }); }); // This will enable the Live Query real-time server await ParseServer.createLiveQueryServer(httpServer); - - const migrate = `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=${process.env.SERVER_URL} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; - // 'APPLICATION_ID={legadranaxn} SERVER_URL=http://localhost:8080/app MASTER_KEY=XnAwPDRQQyMr npx parse-dbtool migrate'; - - exec(migrate, (error, stdout, stderr) => { - if (error) { - console.error(`Error: ${error.message}`); - return; - } - - if (stderr) { - console.error(`Error: ${stderr}`); - return; - } - - console.log(`Command output: ${stdout}`); - }); } From 502400ee56cfada500569691008fc29b0a3196a8 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 Nov 2023 18:27:34 +0530 Subject: [PATCH 08/20] rename file from create_setclp to update_setclp --- ...0174122-create_setclp.cjs => 20231110174122-update_setclp.cjs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/OpenSignServer/databases/migrations/{20231110174122-create_setclp.cjs => 20231110174122-update_setclp.cjs} (100%) diff --git a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs b/apps/OpenSignServer/databases/migrations/20231110174122-update_setclp.cjs similarity index 100% rename from apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs rename to apps/OpenSignServer/databases/migrations/20231110174122-update_setclp.cjs From 11d3e6c696b9710821f7c1a98e556f7393050411 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 Nov 2023 19:36:11 +0530 Subject: [PATCH 09/20] migration db changes --- apps/OpenSignServer/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 676d7ce31..16445d99c 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -183,7 +183,7 @@ if (!process.env.TESTING) { httpServer.headersTimeout = 100000; // in milliseconds httpServer.listen(port, function () { console.log('parse-server-example running on port ' + port + '.'); - const migrate = `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=${process.env.SERVER_URL} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; + const migrate = `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=http://localhost:8080/app MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; exec(migrate, (error, stdout, stderr) => { if (error) { From cdfc952a3fdacd6270bbad93a25206b9161c8d3c Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 Nov 2023 20:00:43 +0530 Subject: [PATCH 10/20] add parse-dbtool package --- apps/OpenSignServer/package-lock.json | 321 +++++++++++++++++++++++++- apps/OpenSignServer/package.json | 1 + 2 files changed, 315 insertions(+), 7 deletions(-) diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index f7626012e..e57104d95 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -27,6 +27,7 @@ "nodemailer": "^6.9.7", "openai": "^4.8.0", "parse": "4.1.0", + "parse-dbtool": "^1.2.0", "parse-server": "6.3.1", "parse-server-api-mail-adapter": "^3.0.0", "parse-server-fs-adapter": "1.0.1", @@ -2147,7 +2148,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -2796,6 +2796,37 @@ "node": ">=0.10" } }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/date-fns/node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/date-fns/node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3902,6 +3933,32 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4001,7 +4058,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4337,7 +4393,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -5093,7 +5148,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -6089,6 +6143,14 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -6097,6 +6159,18 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -7338,6 +7412,234 @@ "crypto-js": "4.1.1" } }, + "node_modules/parse-dbtool": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-dbtool/-/parse-dbtool-1.2.0.tgz", + "integrity": "sha512-APRMPdQ2jyJ7SBouPYZsCD4BjB0zIrSEgALgeYZsVSDrrtoqXhUHJHi42tF/0ocTA/nolteUMzlHT+msrqPvjQ==", + "dependencies": { + "chalk": "^4.1.1", + "date-fns": "^2.21.3", + "dotenv": "^10.0.0", + "fast-glob": "^3.2.5", + "parse": "^3.2.0", + "ts-dedent": "^2.1.1", + "yargs": "^17.0.1" + }, + "bin": { + "parse-dbtool": "src/parse-dbtool.js" + } + }, + "node_modules/parse-dbtool/node_modules/@babel/runtime": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.0.tgz", + "integrity": "sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/parse-dbtool/node_modules/@babel/runtime-corejs3": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz", + "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==", + "dependencies": { + "core-js-pure": "^3.20.2", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/parse-dbtool/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/parse-dbtool/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/parse-dbtool/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/parse-dbtool/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/parse-dbtool/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/parse-dbtool/node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/parse-dbtool/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-dbtool/node_modules/idb-keyval": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.0.3.tgz", + "integrity": "sha512-yh8V7CnE6EQMu9YDwQXhRxwZh4nv+8xm/HV4ZqK4IiYFJBWYGjJuykADJbSP+F/GDXUBwCSSNn/14IpGL81TuA==", + "dependencies": { + "safari-14-idb-fix": "^3.0.0" + } + }, + "node_modules/parse-dbtool/node_modules/parse": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/parse/-/parse-3.5.1.tgz", + "integrity": "sha512-uxkLVNfbqgZ/pStg/jIQGh09tOUkPZorzDIqz9vSFjZ3iIZzgvNk6VBbjXjcMWsR8LyFPOR1ROR6/y9Dedn3/w==", + "dependencies": { + "@babel/runtime": "7.18.0", + "@babel/runtime-corejs3": "7.17.8", + "idb-keyval": "6.0.3", + "react-native-crypto-js": "1.0.0", + "uuid": "3.4.0", + "ws": "8.6.0", + "xmlhttprequest": "1.8.0" + }, + "optionalDependencies": { + "crypto-js": "4.1.1" + } + }, + "node_modules/parse-dbtool/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-dbtool/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/parse-dbtool/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/parse-dbtool/node_modules/ws": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", + "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/parse-dbtool/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/parse-dbtool/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/parse-dbtool/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/parse-server": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/parse-server/-/parse-server-6.3.1.tgz", @@ -7897,7 +8199,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -8471,7 +8772,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9237,7 +9537,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -9299,6 +9598,14 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "engines": { + "node": ">=6.10" + } + }, "node_modules/tslib": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index 5049e7188..4725d28d5 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -36,6 +36,7 @@ "nodemailer": "^6.9.7", "openai": "^4.8.0", "parse": "4.1.0", + "parse-dbtool": "^1.2.0", "parse-server": "6.3.1", "parse-server-api-mail-adapter": "^3.0.0", "parse-server-fs-adapter": "1.0.1", From db9268e1afa38269d58e9dc2711cfa0af4033e8f Mon Sep 17 00:00:00 2001 From: rishabjasrotia Date: Sat, 18 Nov 2023 20:21:17 +0530 Subject: [PATCH 11/20] Include the Signer Email Address --- .../SignDocuments/src/Component/Certificate/Certificate.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js b/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js index 37eee4fc3..f0ae76b05 100644 --- a/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js +++ b/microfrontends/SignDocuments/src/Component/Certificate/Certificate.js @@ -246,6 +246,12 @@ function Certificate({ pdfData }) { {pdfData[0].ExtUserPtr.Name} + + Email :   + + {pdfData[0].ExtUserPtr.Email} + + Accessed from :   From ed6f44fd6247c3840da9058d0fc0419694263183 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Mon, 20 Nov 2023 10:42:20 +0530 Subject: [PATCH 12/20] create getDocument cloud function & minor UI changes --- apps/OpenSign/src/components/LoginFacebook.js | 14 ++--- apps/OpenSign/src/components/LoginGoogle.js | 20 +++---- apps/OpenSign/src/json/plansArr.json | 2 +- apps/OpenSign/src/routes/Pgsignup.js | 7 ++- apps/OpenSign/src/routes/PlanSubscriptions.js | 35 ++++++----- apps/OpenSign/src/routes/Signup.js | 59 ++++++------------- apps/OpenSign/src/routes/UserProfile.js | 34 +++++------ apps/OpenSign/src/styles/pgsignup.css | 38 +++++++++--- apps/OpenSignServer/cloud/main.js | 3 + .../cloud/parsefunction/getDocument.js | 23 ++++++++ 10 files changed, 131 insertions(+), 104 deletions(-) create mode 100644 apps/OpenSignServer/cloud/parsefunction/getDocument.js diff --git a/apps/OpenSign/src/components/LoginFacebook.js b/apps/OpenSign/src/components/LoginFacebook.js index 442fcb3e7..1aeef2c73 100644 --- a/apps/OpenSign/src/components/LoginFacebook.js +++ b/apps/OpenSign/src/components/LoginFacebook.js @@ -209,6 +209,13 @@ const LoginFacebook = ({ />
+ -
diff --git a/apps/OpenSign/src/components/LoginGoogle.js b/apps/OpenSign/src/components/LoginGoogle.js index 7e00b8e8c..1038b21bb 100644 --- a/apps/OpenSign/src/components/LoginGoogle.js +++ b/apps/OpenSign/src/components/LoginGoogle.js @@ -263,17 +263,17 @@ const GoogleSignInBtn = ({
setUserDetails({ @@ -285,6 +285,13 @@ const GoogleSignInBtn = ({ />
+ -
diff --git a/apps/OpenSign/src/json/plansArr.json b/apps/OpenSign/src/json/plansArr.json index 57439a344..ed75ffcb9 100644 --- a/apps/OpenSign/src/json/plansArr.json +++ b/apps/OpenSign/src/json/plansArr.json @@ -26,7 +26,7 @@ "planName": "THANKS PLAN", "currency": "$", "price": "29.99", - "subtitle": "Use code 'FREEBETA' to get this for free(First 100 users)", + "subtitle": "Use code 'FREEBETA' to get this for free(First 1000 users)", "btnText": "Subscribe", "url": "https://subscriptions.zoho.in/subscribe/ef798486e6a0a11ea65f2bae8f2af901dbadf3175d495584fd25b9af5d2f2b9e/thanks", "benefits": [ diff --git a/apps/OpenSign/src/routes/Pgsignup.js b/apps/OpenSign/src/routes/Pgsignup.js index 75a34c253..79f033a6c 100644 --- a/apps/OpenSign/src/routes/Pgsignup.js +++ b/apps/OpenSign/src/routes/Pgsignup.js @@ -151,6 +151,7 @@ const PgSignUp = (props) => { if (res) { const params = { userDetails: { + jobTitle: zohoRes.data.result.jobTitle, company: zohoRes.data.result.company, name: zohoRes.data.result.name, email: zohoRes.data.result.email, @@ -438,10 +439,10 @@ const PgSignUp = (props) => { ) : (
-

Choose Password

+

Choose Password


{ /> { @@ -28,7 +28,12 @@ const PlanSubscriptions = () => { : ""; const phone = userDetails && userDetails.phone ? "&mobile=" + userDetails.phone : ""; - const details = "?shipping_country_code=US&" + name + email + company + phone; + const details = + "?shipping_country_code=US&billing_country_code=US&billing_state_code=CA&" + + name + + email + + company + + phone; useEffect(() => { if (localStorage.getItem("accesstoken")) { setIsLoader(false); @@ -41,7 +46,7 @@ const PlanSubscriptions = () => { return ( <> - + <Title title={"Subscriptions"} /> {isLoader ? ( <div style={{ @@ -131,15 +136,13 @@ const PlanSubscriptions = () => { <p>{item.subtitle}</p> </div> </div> - <div className="bg-[#002862] w-full text-white py-2 rounded"> - <NavLink - to={item.url + details} - className="rounded uppercase hover:no-underline hover:text-white" - target="_self" - > - {item.btnText} - </NavLink> - </div> + <NavLink + to={item.url + details} + className="bg-[#002862] w-full text-white py-2 rounded uppercase hover:no-underline hover:text-white" + target="_self" + > + {item.btnText} + </NavLink> </div> <hr className="w-full bg-gray-300 p-[.5px]" /> <ul className="mx-1 p-3 text-left break-words text-sm list-none"> diff --git a/apps/OpenSign/src/routes/Signup.js b/apps/OpenSign/src/routes/Signup.js index 3ae28e34c..8c7332a16 100644 --- a/apps/OpenSign/src/routes/Signup.js +++ b/apps/OpenSign/src/routes/Signup.js @@ -52,50 +52,27 @@ const Signup = (props) => { res .then(async (r) => { if (r) { - let roleurl = `${parseBaseUrl}functions/AddUserToRole`; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": parseAppId, - sessionToken: - r.getSessionToken() || localStorage.getItem("accesstoken") - }; - let body = { - appName: props.appInfo.appname, - roleName: props.appInfo.defaultRole, - userId: r.id - }; - await axios.post(roleurl, body, { headers: headers }); - let roleData = props.appInfo.settings; if (roleData && roleData.length > 0) { - roleData.forEach((rld) => { - if (rld.role === props.appInfo.defaultRole) { - const extCls = Parse.Object.extend(rld.extended_class); - const newObj = new extCls(); - newObj.set("UserId", { - __type: "Pointer", - className: "_User", - objectId: r.id - }); - newObj.set("UserRole", props.appInfo.defaultRole); - newObj.set("Email", email); - newObj.set("Name", name); - newObj.set("Phone", phone); - newObj.set("Company", company); - newObj.set("JobTitle", jobTitle); - newObj - .save() - .then((ex) => { - if (ex) { - handleNavigation(r.getSessionToken()); - } - }) - .catch((err) => { - alert(err.message); - setState({ loading: false }); - }); + const params = { + userDetails: { + jobTitle: jobTitle, + company: company, + name: name, + email: email, + phone: phone, + role: props.appInfo.defaultRole } - }); + }; + try { + const usersignup = await Parse.Cloud.run("usersignup", params); + if (usersignup) { + handleNavigation(r.getSessionToken()); + } + } catch (err) { + alert(err.message); + setState({ loading: false }); + } } } }) diff --git a/apps/OpenSign/src/routes/UserProfile.js b/apps/OpenSign/src/routes/UserProfile.js index ae86ca1ba..f252f3644 100644 --- a/apps/OpenSign/src/routes/UserProfile.js +++ b/apps/OpenSign/src/routes/UserProfile.js @@ -214,26 +214,11 @@ function UserProfile() { </li> </ul> <div className="flex justify-center pb-4"> - <button - type="button" - onClick={() => { - if (editmode) { - setEditMode(false); - } else { - navigate("/changepassword"); - } - }} - className={`rounded shadow text-white bg-[#3598dc] mr-4 ${ - editmode ? "px-4 py-2 " : "p-2" - }`} - > - {editmode ? "Cancel" : "Change Password"} - </button> {editmode ? ( <button type="button" onClick={handleSubmit} - className="rounded bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] px-4 py-2" + className="rounded bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] px-4 py-2 mr-4" > Save </button> @@ -243,11 +228,26 @@ function UserProfile() { onClick={() => { setEditMode(true); }} - className="rounded shadow text-white bg-[#e7505a] px-4 py-2" + className="rounded shadow text-white bg-[#e7505a] px-4 py-2 mr-4" > Edit </button> )} + <button + type="button" + onClick={() => { + if (editmode) { + setEditMode(false); + } else { + navigate("/changepassword"); + } + }} + className={`rounded shadow text-white bg-[#3598dc] ${ + editmode ? "px-4 py-2 " : "p-2" + }`} + > + {editmode ? "Cancel" : "Change Password"} + </button> </div> </div> )} diff --git a/apps/OpenSign/src/styles/pgsignup.css b/apps/OpenSign/src/styles/pgsignup.css index fab477b35..102a878de 100644 --- a/apps/OpenSign/src/styles/pgsignup.css +++ b/apps/OpenSign/src/styles/pgsignup.css @@ -1,12 +1,14 @@ /* Full-width input fields */ .inputt { width: 100%; - padding: 15px; - margin: 5px 0 22px 0; + padding: 8px; + margin-bottom: 10px; + /* margin: 5px 0 14px 0; */ display: inline-block; border: none; background: #f1f1f1; color: black; + font-size: 12px; } /* Add a background color when the inputs get focus */ @@ -18,11 +20,12 @@ .confirmInputt { width: 100%; - padding: 15px; - margin: 5px 0 1px 0; + padding: 8px; + /* margin: 5px 0 14px 0; */ display: inline-block; background: #f1f1f1; color: black; + font-size: 12px; } .inputt::placeholder, @@ -42,11 +45,10 @@ .signupbtn { background-color: #15b4e9; color: white; - padding: 14px 20px; + padding: 12px 12px; margin: 8px 0; border: none; cursor: pointer; - width: 100%; opacity: 0.9; float: left; width: 50%; @@ -87,7 +89,7 @@ margin: 5% auto 15% auto; /* 5% from the top, 15% from the bottom and centered */ border: 1px solid #888; - width: 80%; + width: 50%; /* Could be more or less, depending on screen size */ } @@ -111,8 +113,26 @@ } /* Change styles for cancel button and signup button on extra small screens */ -@media screen and (max-width: 300px) { +@media screen and (max-width: 768px) { + + /* pgsignup Content/Box */ + .pgsignup-content { + background-color: #fefefe; + margin: 5% auto 15% auto; + /* 5% from the top, 15% from the bottom and centered */ + border: 1px solid #888; + width: 90%; + /* Could be more or less, depending on screen size */ + } + .signupbtn { width: 100%; + font-size: 16px; } -} + + /* Style the horizontal ruler */ + .hrt { + border: 1px solid #f1f1f1; + margin-bottom: 16px; + } +} \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 2facd600c..634677ed7 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -14,6 +14,8 @@ import SendMailv1 from './parsefunction/SendMailv1.js'; import AuthLoginAsMail from './parsefunction/AuthLoginAsMail.js'; import getUserId from './parsefunction/getUserId.js'; import getUserDetails from './parsefunction/getUserDetails.js'; +import getDocument from './parsefunction/getDocument.js'; +import getInProgressReport from './parsefunction/getInProgressReport.js'; Parse.Cloud.define('AddUserToRole', addUserToGroups); Parse.Cloud.define('UserGroups', getUserGroups); @@ -31,3 +33,4 @@ Parse.Cloud.define('sendmail', SendMailv1); Parse.Cloud.define('AuthLoginAsMail', AuthLoginAsMail); Parse.Cloud.define('getUserId', getUserId); Parse.Cloud.define('getUserDetails', getUserDetails); +Parse.Cloud.define('getDocument', getDocument); diff --git a/apps/OpenSignServer/cloud/parsefunction/getDocument.js b/apps/OpenSignServer/cloud/parsefunction/getDocument.js new file mode 100644 index 000000000..e2e1d514c --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/getDocument.js @@ -0,0 +1,23 @@ +export default async function getDocument(request) { + const docId = request.params.docId; + const userId = request.params.userId; + if (docId && userId) { + try { + const query = new Parse.Query('contracts_Document'); + query.equalTo('objectId', docId); + query.equalTo('ACL', new Parse.ACL(userId)); + query.include('ExtUserPtr'); + query.include('CreatedBy'); + query.include('Signers'); + query.include('AuditTrail.UserPtr'); + query.include('Placeholders'); + const res = await query.first({ useMasterKey: true }); + return res; + } catch (err) { + console.log('err', err); + return err; + } + } else { + return { error: 'Please pass required parameters!' }; + } +} From 296f43101e56b7d668bf02fdd1b0e8a6c80612f9 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 20 Nov 2023 11:13:24 +0530 Subject: [PATCH 13/20] comment getinProgessReport --- apps/OpenSignServer/cloud/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 634677ed7..e7eca1022 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -15,7 +15,7 @@ import AuthLoginAsMail from './parsefunction/AuthLoginAsMail.js'; import getUserId from './parsefunction/getUserId.js'; import getUserDetails from './parsefunction/getUserDetails.js'; import getDocument from './parsefunction/getDocument.js'; -import getInProgressReport from './parsefunction/getInProgressReport.js'; +// import getInProgressReport from './parsefunction/getInProgressReport.js'; Parse.Cloud.define('AddUserToRole', addUserToGroups); Parse.Cloud.define('UserGroups', getUserGroups); From f678dd02cbd3519f18eb8a0474158440663dcd18 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 20 Nov 2023 11:54:04 +0530 Subject: [PATCH 14/20] change in getDoucment cloud function --- .../cloud/parsefunction/getDocument.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/OpenSignServer/cloud/parsefunction/getDocument.js b/apps/OpenSignServer/cloud/parsefunction/getDocument.js index e2e1d514c..81640f721 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getDocument.js +++ b/apps/OpenSignServer/cloud/parsefunction/getDocument.js @@ -5,14 +5,22 @@ export default async function getDocument(request) { try { const query = new Parse.Query('contracts_Document'); query.equalTo('objectId', docId); - query.equalTo('ACL', new Parse.ACL(userId)); query.include('ExtUserPtr'); query.include('CreatedBy'); query.include('Signers'); query.include('AuditTrail.UserPtr'); query.include('Placeholders'); const res = await query.first({ useMasterKey: true }); - return res; + if (res) { + const acl = res.getACL(); + if (acl && acl.getReadAccess(userId)) { + return res; + } else { + return { error: "You don't have access of this document!" }; + } + } else { + return { error: "You don't have access of this document!" }; + } } catch (err) { console.log('err', err); return err; From 0186c48d59130d56887a8d161c0e8a7e84a1aa13 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Mon, 20 Nov 2023 12:00:41 +0530 Subject: [PATCH 15/20] Update getDocument.js --- .../cloud/parsefunction/getDocument.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/OpenSignServer/cloud/parsefunction/getDocument.js b/apps/OpenSignServer/cloud/parsefunction/getDocument.js index e2e1d514c..81640f721 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getDocument.js +++ b/apps/OpenSignServer/cloud/parsefunction/getDocument.js @@ -5,14 +5,22 @@ export default async function getDocument(request) { try { const query = new Parse.Query('contracts_Document'); query.equalTo('objectId', docId); - query.equalTo('ACL', new Parse.ACL(userId)); query.include('ExtUserPtr'); query.include('CreatedBy'); query.include('Signers'); query.include('AuditTrail.UserPtr'); query.include('Placeholders'); const res = await query.first({ useMasterKey: true }); - return res; + if (res) { + const acl = res.getACL(); + if (acl && acl.getReadAccess(userId)) { + return res; + } else { + return { error: "You don't have access of this document!" }; + } + } else { + return { error: "You don't have access of this document!" }; + } } catch (err) { console.log('err', err); return err; From 4d3ed0232ed8ee927d1c8a6155a8e950e9225cc8 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 20 Nov 2023 14:11:32 +0530 Subject: [PATCH 16/20] security changes in getDocument function & add getDrive function --- apps/OpenSignServer/cloud/main.js | 2 + .../cloud/parsefunction/getDocument.js | 63 ++++++++++++------- .../cloud/parsefunction/getDrive.js | 51 +++++++++++++++ 3 files changed, 94 insertions(+), 22 deletions(-) create mode 100644 apps/OpenSignServer/cloud/parsefunction/getDrive.js diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index e7eca1022..2ecc0fbf1 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -15,6 +15,7 @@ import AuthLoginAsMail from './parsefunction/AuthLoginAsMail.js'; import getUserId from './parsefunction/getUserId.js'; import getUserDetails from './parsefunction/getUserDetails.js'; import getDocument from './parsefunction/getDocument.js'; +import getDrive from './parsefunction/getDrive.js'; // import getInProgressReport from './parsefunction/getInProgressReport.js'; Parse.Cloud.define('AddUserToRole', addUserToGroups); @@ -34,3 +35,4 @@ Parse.Cloud.define('AuthLoginAsMail', AuthLoginAsMail); Parse.Cloud.define('getUserId', getUserId); Parse.Cloud.define('getUserDetails', getUserDetails); Parse.Cloud.define('getDocument', getDocument); +Parse.Cloud.define('getDrive', getDrive) diff --git a/apps/OpenSignServer/cloud/parsefunction/getDocument.js b/apps/OpenSignServer/cloud/parsefunction/getDocument.js index 81640f721..9e4d71ff3 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getDocument.js +++ b/apps/OpenSignServer/cloud/parsefunction/getDocument.js @@ -1,31 +1,50 @@ +import axios from 'axios'; + export default async function getDocument(request) { + const serverUrl = process.env.SERVER_URL; const docId = request.params.docId; - const userId = request.params.userId; - if (docId && userId) { - try { - const query = new Parse.Query('contracts_Document'); - query.equalTo('objectId', docId); - query.include('ExtUserPtr'); - query.include('CreatedBy'); - query.include('Signers'); - query.include('AuditTrail.UserPtr'); - query.include('Placeholders'); - const res = await query.first({ useMasterKey: true }); - if (res) { - const acl = res.getACL(); - if (acl && acl.getReadAccess(userId)) { - return res; + + try { + const userRes = await axios.get(serverUrl + '/users/me', { + headers: { + 'X-Parse-Application-Id': process.env.APP_ID, + 'X-Parse-Session-Token': request.headers['sessiontoken'], + }, + }); + const userId = userRes.data && userRes.data.objectId; + if (docId && userId) { + try { + const query = new Parse.Query('contracts_Document'); + query.equalTo('objectId', docId); + query.include('ExtUserPtr'); + query.include('CreatedBy'); + query.include('Signers'); + query.include('AuditTrail.UserPtr'); + query.include('Placeholders'); + const res = await query.first({ useMasterKey: true }); + if (res) { + const acl = res.getACL(); + if (acl && acl.getReadAccess(userId)) { + return res; + } else { + return { error: "You don't have access of this document!" }; + } } else { return { error: "You don't have access of this document!" }; } - } else { - return { error: "You don't have access of this document!" }; + } catch (err) { + console.log('err', err); + return err; } - } catch (err) { - console.log('err', err); - return err; + } else { + return { error: 'Please pass required parameters!' }; + } + } catch (err) { + console.log('err'); + if (err.code == 209) { + return { error: 'Invalid session token' }; + } else { + return { error: "You don't have access of this document!" }; } - } else { - return { error: 'Please pass required parameters!' }; } } diff --git a/apps/OpenSignServer/cloud/parsefunction/getDrive.js b/apps/OpenSignServer/cloud/parsefunction/getDrive.js new file mode 100644 index 000000000..567d1b08f --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/getDrive.js @@ -0,0 +1,51 @@ +import axios from 'axios'; +export default async function getDrive(request) { + const serverUrl = process.env.SERVER_URL; + const appId = process.env.APP_ID; + + const classUrl = serverUrl + '/classes/contracts_Document'; + const docId = request.params.docId; + 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) { + let url; + if (docId) { + url = `${classUrl}?where={"Folder":{"__type":"Pointer","className":"contracts_Document","objectId":"${docId}"},"$or":[{"CreatedBy":{"$exists":false}},{"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${userId}"}}]}&include=ExtUserPtr,Signers,Folder`; + } else { + url = `${classUrl}?where={"Folder":{"$exists":false},"$or":[{"CreatedBy":{"$exists":false}},{"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${userId}"}}]}&include=ExtUserPtr,Signers`; + } + try { + const res = await axios.get(url, { + headers: { + 'X-Parse-Application-Id': appId, + 'X-Parse-Master-key': process.env.MASTER_KEY, + }, + }); + console.log('res.data.results ', res.data.results); + if (res.data && res.data.results) { + return res.data.results; + } else { + return []; + } + } catch (err) { + console.log('err', err); + return { error: "You don't have access to drive" }; + } + } else { + return { error: 'Please provide required parameter!' }; + } + } catch (err) { + console.log('err', err); + if (err.code == 209) { + return { error: 'Invalid session token' }; + } else { + return { error: "You don't have access!" }; + } + } +} From 910bd801ac3e80f4a044dd787e7106d2cc6e3b86 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 20 Nov 2023 16:46:27 +0530 Subject: [PATCH 17/20] remove contracts_Document & contracts_Users query from frontend and call cloud function --- .../src/Component/DraftDocument.js | 68 ++-- .../src/Component/LegaDrive/LegaDrive.js | 186 ++++----- .../src/Component/PdfRequestFiles.js | 293 +++++++-------- .../src/Component/SignYourselfPdf.js | 87 ++--- .../src/Component/placeHolderSign.js | 80 ++-- .../src/Component/recipientSignPdf.js | 354 +++++++++--------- .../SignDocuments/src/utils/Utils.js | 126 ++++--- 7 files changed, 557 insertions(+), 637 deletions(-) diff --git a/microfrontends/SignDocuments/src/Component/DraftDocument.js b/microfrontends/SignDocuments/src/Component/DraftDocument.js index 79806a94e..8c5884c87 100644 --- a/microfrontends/SignDocuments/src/Component/DraftDocument.js +++ b/microfrontends/SignDocuments/src/Component/DraftDocument.js @@ -1,61 +1,46 @@ import React, { useEffect, useState } from "react"; -import axios from "axios"; import { useNavigate } from "react-router-dom"; import Loader from "./component/loader"; -import { getHostUrl } from "../utils/Utils"; +import { contractDocument, getHostUrl } from "../utils/Utils"; function DraftDocument() { const navigate = useNavigate(); const [pdfDetails, setPdfDetails] = useState([]); const [isLoading, setIsLoading] = useState({ isLoad: true, - message: "This might take some time", + message: "This might take some time" }); const rowLevel = localStorage.getItem("rowlevel") && JSON.parse(localStorage.getItem("rowlevel")); - const signObjId = + const docId = rowLevel && rowLevel?.id ? rowLevel.id : rowLevel?.objectId && rowLevel.objectId; + useEffect(() => { - if (signObjId) { + if (docId) { getDocumentDetails(); } }, []); //get document details const getDocumentDetails = async () => { - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"objectId":"${signObjId}"}&include=ExtUserPtr,Signers`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken"), - }, - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; - - if (res[0] && res.length > 0) { - setPdfDetails(res); - const loadObj = { - isLoad: false, - }; - setIsLoading(loadObj); - } else { - alert("No data found!"); - } - }) - .catch((err) => { - console.log("axois err ", err); - }); + //getting document details + const documentData = await contractDocument(docId); + if (documentData && documentData !== "no data found!" && documentData[0]) { + if (documentData[0] && documentData.length > 0) { + setPdfDetails(documentData); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } + } else if (documentData === "no data found!") { + alert("No data found!"); + } else if (documentData === "Error: Something went wrong!") { + alert("Error: Something went wrong!"); + } }; //check document type and render on signyour self and placeholder route @@ -63,24 +48,25 @@ function DraftDocument() { const data = pdfDetails[0]; const checkSignerExist = pdfDetails[0] && pdfDetails[0].Signers && pdfDetails[0].Signers; - const isPlaceholder = + const isPlaceholder = pdfDetails[0].Placeholders && pdfDetails[0].Placeholders; const isDecline = data.IsDeclined && data.IsDeclined; const signUrl = data.SignedUrl && data.SignedUrl; - const expireDate = pdfDetails[0] && pdfDetails[0].ExpiryDate.iso && pdfDetails[0].ExpiryDate.iso; + const expireDate = + pdfDetails[0] && + pdfDetails[0].ExpiryDate.iso && + pdfDetails[0].ExpiryDate.iso; const expireUpdateDate = new Date(expireDate).getTime(); const currDate = new Date().getTime(); const hostUrl = getHostUrl(); //checking document is completed and signer exist then navigate to pdfRequestFiles file if (data.IsCompleted && checkSignerExist) { - navigate(`${hostUrl}pdfRequestFiles`); + navigate(`${hostUrl}pdfRequestFiles`); } //checking document is completed and signer does not exist then navigate to recipientSignPdf file else if (data.IsCompleted && !checkSignerExist) { - navigate( - `${hostUrl}signaturePdf` - ); + navigate(`${hostUrl}signaturePdf`); } //checking document is declined by someone then navigate to pdfRequestFiles file else if (isDecline) { diff --git a/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js b/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js index cd004168a..ed456ec96 100644 --- a/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js +++ b/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js @@ -6,6 +6,7 @@ import PdfFileComponent from "./FolderDrive/legaDriveComponent"; import Modal from "react-bootstrap/Modal"; import ModalHeader from "react-bootstrap/esm/ModalHeader"; import { themeColor, iconColor } from "../../utils/ThemeColor/backColor"; +import { getDrive } from "../../utils/Utils"; function PdfFile() { const scrollRef = useRef(null); @@ -22,22 +23,13 @@ function PdfFile() { const [isShowSort, setIsShowSort] = useState(false); const [isLoading, setIsLoading] = useState({ isLoad: true, - message: "This might take some time", + message: "This might take some time" }); const [docId, setDocId] = useState(); const [handleError, setHandleError] = useState(); const [folderName, setFolderName] = useState([]); - const senderUser = - localStorage.getItem( - `Parse/${localStorage.getItem("parseAppId")}/currentUser` - ) && - localStorage.getItem( - `Parse/${localStorage.getItem("parseAppId")}/currentUser` - ); - const jsonSender = JSON.parse(senderUser); - useEffect(() => { if (docId) { getPdfFolderDocumentList(); @@ -50,104 +42,59 @@ function PdfFile() { const getPdfDocumentList = async () => { const load = { isLoad: true, - message: "This might take some time", + message: "This might take some time" }; setIsLoading(load); - //?where={"Type":"Folder" }&include=ExtUserPtr,Signers - //?where={"$or":[{"Type":{"$exists":true}},{"Folder":{"$exists":false}}]}&include=ExtUserPtr,Signers - // "CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${jsonSender.objectId}"} - // where={"Folder":{"$exists":false} }&include=ExtUserPtr,Signers`, - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"Folder":{"$exists":false},"$or":[{"CreatedBy":{"$exists":false}},{"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${ - jsonSender.objectId - }"}}]}&include=ExtUserPtr,Signers`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken"), - }, - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; - // console.log("result", res); - if (res[0] && res.length > 0) { - setPdfData(res); - } + const driveDetails = await getDrive(); - const data = [ - { - name: "OpenSignDriveâ„¢", - objectId: "", - }, - ]; - setFolderName(data); - const loadObj = { - isLoad: false, - }; - setIsLoading(loadObj); - }) - .catch((err) => { - const loadObj = { - isLoad: false, - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); - }); + if (driveDetails) { + if (driveDetails && driveDetails.length > 0) { + setPdfData(driveDetails); + } + const data = [ + { + name: "OpenSignDriveâ„¢", + objectId: "" + } + ]; + setFolderName(data); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } else if (driveDetails === "Error: Something went wrong!") { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } }; //function for get parent folder document list const getPdfFolderDocumentList = async () => { const load = { isLoad: true, - message: "This might take some time", + message: "This might take some time" }; setIsLoading(load); - //{"$inQuery":{"where":{"objectId":"${docId}"},"className":"${appName}_Document"}} - //"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${jsonSender.objectId}"} - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"Folder":{"__type":"Pointer","className":"${localStorage.getItem( - "_appName" - )}_Document","objectId":"${docId}"},"$or":[{"CreatedBy":{"$exists":false}},{"CreatedBy":{"__type":"Pointer","className":"_User","objectId":"${ - jsonSender.objectId - }"}}]}&include=ExtUserPtr,Signers,Folder`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken"), - }, - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; - - if (res[0] && res.length > 0) { - setPdfData(res); - } else { - setPdfData([]); - } - - const loadObj = { - isLoad: false, - }; - setIsLoading(loadObj); - }) - .catch((err) => { - const loadObj = { - isLoad: false, - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); - }); + const driveDetails = await getDrive(docId); + if (driveDetails) { + if (driveDetails && driveDetails.length > 0) { + setPdfData(driveDetails); + } else { + setPdfData([]); + } + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } else if (driveDetails === "Error: Something went wrong!") { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } }; //function for get all pdf document list @@ -158,7 +105,7 @@ function PdfFile() { const handleRoute = (data) => { let loadObj = { isLoad: true, - message: "This might take some time", + message: "This might take some time" }; if (data.name === "LegaDriveâ„¢") { setIsLoading(loadObj); @@ -167,7 +114,7 @@ function PdfFile() { } else { setTimeout(() => { const loadObj = { - isLoad: false, + isLoad: false }; setIsLoading(loadObj); }, 1000); @@ -176,12 +123,11 @@ function PdfFile() { setIsLoading(loadObj); setTimeout(() => { const loadObj = { - isLoad: false, + isLoad: false }; setIsLoading(loadObj); }, 1000); } else { - // console.log("go here1",data.objectId) const findIndex = folderName.findIndex( (fold) => fold.objectId === data.objectId ); @@ -216,13 +162,13 @@ function PdfFile() { Folder: { __type: "Pointer", className: `${localStorage.getItem("_appName")}_Document`, - objectId: isParentId, - }, + objectId: isParentId + } }; } else { data = { Name: newFolderName, - Type: "Folder", + Type: "Folder" }; } @@ -237,8 +183,8 @@ function PdfFile() { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken"), - }, + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } } ) @@ -388,7 +334,7 @@ function PdfFile() { display: "flex", flexDirection: "column", justifyContent: "center", - alignItems: "center", + alignItems: "center" }} > <img @@ -406,7 +352,7 @@ function PdfFile() { style={{ margin: "10px 0px 10px 0px", fontSize: "15px", - fontWeight: "400", + fontWeight: "400" }} > Name* @@ -428,7 +374,7 @@ function PdfFile() { display: "flex", alignItems: "flex-end", justifyContent: "flex-end", - alignContent: "flex-end", + alignContent: "flex-end" }} > <button @@ -437,7 +383,7 @@ function PdfFile() { borderRadius: "0px", border: "1.5px solid #e3e2e1", fontWeight: "600", - color: "black", + color: "black" }} className="finishBtn" onClick={() => setIsFolder(false)} @@ -448,7 +394,7 @@ function PdfFile() { <button onClick={() => handleAddFolder()} style={{ - background: themeColor(), + background: themeColor() }} type="button" className="finishBtn" @@ -469,7 +415,7 @@ function PdfFile() { alignItems: "center", height: "100vh", width: "100%", - flexDirection: "column", + flexDirection: "column" }} > <img @@ -488,7 +434,7 @@ function PdfFile() { justifyContent: "center", alignItems: "center", height: "100vh", - width: "100%", + width: "100%" }} > <span style={{ fontSize: "20px", color: "gray" }}> @@ -502,7 +448,7 @@ function PdfFile() { onMouseEnter={(e) => handleMouseEnter(e)} ref={scrollRef} style={{ - width: "100%", + width: "100%" }} className="folderPath" > @@ -514,7 +460,7 @@ function PdfFile() { style={{ color: "#a64b4e", fontWeight: "400", - cursor: "pointer", + cursor: "pointer" }} > {data.name} @@ -523,7 +469,7 @@ function PdfFile() { color: "#a64b4e", fontWeight: "200", cursor: "pointer", - margin: "0 4px", + margin: "0 4px" }} > > @@ -545,13 +491,13 @@ function PdfFile() { style={{ marginRight: "5px", fontSize: "14px", - color: `${iconColor()}`, + color: `${iconColor()}` }} ></i> <span style={{ fontSize: "15px", - color: `${iconColor()}`, + color: `${iconColor()}` }} > {selectedSort} @@ -694,7 +640,7 @@ function PdfFile() { justifyContent: "center", alignItems: "center", height: "50vh", - width: "100%", + width: "100%" }} > <span style={{ fontWeight: "bold" }}>No Data Found!</span> diff --git a/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js b/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js index d741162d5..7a53c3b17 100644 --- a/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js +++ b/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js @@ -11,7 +11,11 @@ import { HTML5Backend } from "react-dnd-html5-backend"; import { useParams } from "react-router-dom"; import SignPad from "./component/signPad"; import RenderAllPdfPage from "./component/renderAllPdfPage"; -import { getBase64FromIMG, getBase64FromUrl } from "../utils/Utils"; +import { + contractDocument, + getBase64FromIMG, + getBase64FromUrl +} from "../utils/Utils"; import Loader from "./component/loader"; import HandleError from "./component/HandleError"; import Nodata from "./component/Nodata"; @@ -106,152 +110,132 @@ function PdfRequestFiles() { //function for get document details for perticular signer with signer'object id const getDocumentDetails = async () => { - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"objectId":"${documentId}"}&include=ExtUserPtr,Signers,UserPtr`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; + //getting document details + const documentData = await contractDocument(documentId); + if (documentData && documentData !== "no data found!" && documentData[0]) { + const isCompleted = + documentData[0].IsCompleted && documentData[0].IsCompleted; + const expireDate = documentData[0].ExpiryDate.iso; + const declined = documentData[0].IsDeclined && documentData[0].IsDeclined; + const expireUpdateDate = new Date(expireDate).getTime(); + const currDate = new Date().getTime(); + const getSigners = documentData[0].Signers; + const getCurrentSigner = + getSigners && + getSigners.filter( + (data) => data.UserId.objectId === jsonSender.objectId + ); - if (res[0] && res.length > 0) { - const isCompleted = res[0].IsCompleted && res[0].IsCompleted; - const expireDate = res[0].ExpiryDate.iso; - const declined = res[0].IsDeclined && res[0].IsDeclined; - const expireUpdateDate = new Date(expireDate).getTime(); - const currDate = new Date().getTime(); - const getSigners = res[0].Signers; - const getCurrentSigner = - getSigners && - getSigners.filter( - (data) => data.UserId.objectId === jsonSender.objectId - ); - - const currUserId = getCurrentSigner[0] - ? getCurrentSigner[0].objectId - : ""; - setSignerObjectId(currUserId); - if (res[0].SignedUrl) { - setPdfUrl(res[0].SignedUrl); - } else { - setPdfUrl(res[0].URL); - } - if (isCompleted) { - setIsSigned(true); - const data = { - isCertificate: true, - isModal: true - }; - setAlreadySign(true); - setIsCompleted(data); - } else if (declined) { - const currentDecline = { - currnt: "another", - isDeclined: true - }; - setIsDecline(currentDecline); - } else if (currDate > expireUpdateDate) { - setIsExpired(true); - } - - if (res.length > 0) { - const checkDocIdExist = - json.results[0].AuditTrail && - json.results[0].AuditTrail.length > 0 && - json.results[0].AuditTrail.filter( - (data) => data.Activity === "Signed" - ); - - const checkAlreadySign = - json.results[0].AuditTrail && - json.results[0].AuditTrail.length > 0 && - json.results[0].AuditTrail.filter( - (data) => - data.UserPtr.objectId === currUserId && - data.Activity === "Signed" - ); - if ( - checkAlreadySign && - checkAlreadySign[0] && - checkAlreadySign.length > 0 - ) { - setAlreadySign(true); - } - - let signers = []; - let unSignedSigner = []; - - //check document is signed or not - if (checkDocIdExist && checkDocIdExist.length > 0) { - setIsDocId(true); - const signerRes = res[0].Signers; - //comparison auditTrail user details with signers user details - for (let i = 0; i < signerRes.length; i++) { - const signerId = signerRes[i].objectId; - - let isSigned = false; - for (let j = 0; j < checkDocIdExist.length; j++) { - const signedExist = - checkDocIdExist[j] && checkDocIdExist[j].UserPtr.objectId; - //checking signerObjId and auditTrail User objId - // if match then add signed data in signer array and break loop - - if (signerId === signedExist) { - signers.push({ ...signerRes[i], ...signerRes[i] }); - isSigned = true; - break; - } - // if does not match then add unsigned data in unSignedSigner array - } - if (!isSigned) { - unSignedSigner.push({ ...signerRes[i], ...signerRes[i] }); - } - } - setSignedSigners(signers); - setUnSignedSigners(unSignedSigner); - - setSignerPos(res[0].Placeholders); - } else { - let unsigned = []; - for (let i = 0; i < res.length; i++) { - unsigned.push(res[i].Signers); - } - setUnSignedSigners(unsigned[0]); - setSignerPos(res[0].Placeholders); - } - - setPdfDetails(res); - - setIsUiLoading(false); - } else { - alert("No data found!"); - } - } else { - setNoData(true); - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - setIsUiLoading(false); - } - }) - .catch((err) => { - console.log("err", err); - const loadObj = { - isLoad: false + const currUserId = getCurrentSigner[0] + ? getCurrentSigner[0].objectId + : ""; + setSignerObjectId(currUserId); + if (documentData[0].SignedUrl) { + setPdfUrl(documentData[0].SignedUrl); + } else { + setPdfUrl(documentData[0].URL); + } + if (isCompleted) { + setIsSigned(true); + const data = { + isCertificate: true, + isModal: true }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); - }); + setAlreadySign(true); + setIsCompleted(data); + } else if (declined) { + const currentDecline = { + currnt: "another", + isDeclined: true + }; + setIsDecline(currentDecline); + } else if (currDate > expireUpdateDate) { + setIsExpired(true); + } + + if (documentData.length > 0) { + const checkDocIdExist = + documentData[0].AuditTrail && + documentData[0].AuditTrail.length > 0 && + documentData[0].AuditTrail.filter( + (data) => data.Activity === "Signed" + ); + + const checkAlreadySign = + documentData[0].AuditTrail && + documentData[0].AuditTrail.length > 0 && + documentData[0].AuditTrail.filter( + (data) => + data.UserPtr.objectId === currUserId && data.Activity === "Signed" + ); + if ( + checkAlreadySign && + checkAlreadySign[0] && + checkAlreadySign.length > 0 + ) { + setAlreadySign(true); + } + + let signers = []; + let unSignedSigner = []; + + //check document is signed or not + if (checkDocIdExist && checkDocIdExist.length > 0) { + setIsDocId(true); + const signerRes = documentData[0].Signers; + //comparison auditTrail user details with signers user details + for (let i = 0; i < signerRes.length; i++) { + const signerId = signerRes[i].objectId; + + let isSigned = false; + for (let j = 0; j < checkDocIdExist.length; j++) { + const signedExist = + checkDocIdExist[j] && checkDocIdExist[j].UserPtr.objectId; + //checking signerObjId and auditTrail User objId + // if match then add signed data in signer array and break loop + + if (signerId === signedExist) { + signers.push({ ...signerRes[i], ...signerRes[i] }); + isSigned = true; + break; + } + // if does not match then add unsigned data in unSignedSigner array + } + if (!isSigned) { + unSignedSigner.push({ ...signerRes[i], ...signerRes[i] }); + } + } + setSignedSigners(signers); + setUnSignedSigners(unSignedSigner); + + setSignerPos(documentData[0].Placeholders); + } else { + let unsigned = []; + for (let i = 0; i < documentData.length; i++) { + unsigned.push(documentData[i].Signers); + } + setUnSignedSigners(unsigned[0]); + setSignerPos(documentData[0].Placeholders); + } + setPdfDetails(documentData); + setIsUiLoading(false); + } else { + alert("No data found!"); + } + } else if (documentData === "no data found!") { + setNoData(true); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + setIsUiLoading(false); + } else if (documentData === "Error: Something went wrong!") { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } await axios .get( `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( @@ -293,7 +277,6 @@ function PdfRequestFiles() { const checkUser = signerPos.filter( (data) => data.signerObjId === signerObjectId ); - if (checkUser && checkUser.length > 0) { let checkSignUrl = []; const checkSign = checkUser[0].placeHolder.filter( @@ -596,12 +579,12 @@ function PdfRequestFiles() { if (isMobile) { //if pos.isMobile false -- placeholder saved from desktop view then handle position in mobile view divided by scale if (pos.isMobile) { - const y = pos.yPosition * (pos.scale / scale); + const y = pos.yBottom * (pos.scale / scale); yPosition = pos.isDrag ? y * scale - height : pos.firstYPos - ? y * scale - height + pos.firstYPos - : y * scale - height; + ? y * scale - height + pos.firstYPos + : y * scale - height; return yPosition; } else { const y = pos.yBottom / scale; @@ -609,8 +592,8 @@ function PdfRequestFiles() { yPosition = pos.isDrag ? y * scale - height : pos.firstYPos - ? y * scale - height + pos.firstYPos - : y * scale - height; + ? y * scale - height + pos.firstYPos + : y * scale - height; return yPosition; } } else { @@ -621,15 +604,15 @@ function PdfRequestFiles() { yPosition = pos.isDrag ? y - height : pos.firstYPos - ? y - height + pos.firstYPos - : y - height; + ? y - height + pos.firstYPos + : y - height; return yPosition; } else { yPosition = pos.isDrag ? pos.yBottom - height : pos.firstYPos - ? pos.yBottom - height + pos.firstYPos - : pos.yBottom - height; + ? pos.yBottom - height + pos.firstYPos + : pos.yBottom - height; return yPosition; } } diff --git a/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js b/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js index 6591667bc..e0284b4ed 100644 --- a/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js +++ b/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js @@ -15,7 +15,7 @@ import EmailComponent from "./component/emailComponent"; import FieldsComponent from "./component/fieldsComponent"; import Modal from "react-bootstrap/Modal"; import ModalHeader from "react-bootstrap/esm/ModalHeader"; -import { getBase64FromIMG } from "../utils/Utils"; +import { contractDocument, getBase64FromIMG } from "../utils/Utils"; import { useParams } from "react-router-dom"; import Tour from "reactour"; import { onSaveImage, onSaveSign } from "../utils/Utils"; @@ -173,55 +173,41 @@ function SignYourSelf() { //function for get document details for perticular signer with signer'object id const getDocumentDetails = async () => { - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"objectId":"${documentId}"}&include=ExtUserPtr,Signers`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; + //getting document details + const documentData = await contractDocument(documentId); - if (res[0] && res.length > 0) { - setPdfDetails(res); - const isCompleted = res[0].IsCompleted && res[0].IsCompleted; - if (isCompleted) { - const docStatus = { - isCompleted: isCompleted - }; - - setDocumentStatus(docStatus); - const alreadySign = { - status: true, - mssg: "You have successfully signed the document!" - }; - setShowAlreadySignDoc(alreadySign); - setPdfUrl(res[0].SignedUrl); - } - } else { - setNoData(true); - - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - } - }) - .catch((err) => { - const loadObj = { - isLoad: false + if (documentData && documentData !== "no data found!" && documentData[0]) { + setPdfDetails(documentData); + const isCompleted = + documentData[0].IsCompleted && documentData[0].IsCompleted; + if (isCompleted) { + const docStatus = { + isCompleted: isCompleted }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); - }); + + setDocumentStatus(docStatus); + const alreadySign = { + status: true, + mssg: "You have successfully signed the document!" + }; + setShowAlreadySignDoc(alreadySign); + setPdfUrl(documentData[0].SignedUrl); + } + } else if (documentData === "no data found!") { + setNoData(true); + + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } else if (documentData === "Error: Something went wrong!") { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } + await axios .get( `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( @@ -252,7 +238,8 @@ function SignYourSelf() { setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); }); - const contractUsersRes = await contractUsers(jsonSender.objectId); + + const contractUsersRes = await contractUsers(jsonSender.email); if ( contractUsersRes !== "Error: Something went wrong!" && @@ -287,12 +274,10 @@ function SignYourSelf() { const contractContactBook = await contactBook(jsonSender.objectId); if (contractContactBook && contractContactBook[0]) { setContractName("_Contactbook"); - setSignerUserId(contractContactBook[0].objectId); const tourstatuss = contractContactBook[0].TourStatus && contractContactBook[0].TourStatus; - if (tourstatuss && tourstatuss.length > 0) { setTourStatus(tourstatuss); const checkTourRecipients = tourstatuss.filter( diff --git a/microfrontends/SignDocuments/src/Component/placeHolderSign.js b/microfrontends/SignDocuments/src/Component/placeHolderSign.js index 93be3b571..bf998dea8 100644 --- a/microfrontends/SignDocuments/src/Component/placeHolderSign.js +++ b/microfrontends/SignDocuments/src/Component/placeHolderSign.js @@ -17,7 +17,12 @@ import HandleError from "./component/HandleError"; import Nodata from "./component/Nodata"; import SignerListPlace from "./component/signerListPlace"; import Header from "./component/header"; -import { contactBook, contractUsers, getHostUrl } from "../utils/Utils"; +import { + contactBook, + contractDocument, + contractUsers, + getHostUrl +} from "../utils/Utils"; import RenderPdf from "./component/renderPdf"; import ModalComponent from "./component/modalComponent"; import { useNavigate } from "react-router-dom"; @@ -169,56 +174,37 @@ function PlaceHolderSign() { //function for get document details const getDocumentDetails = async () => { - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"objectId":"${documentId}"}&include=ExtUserPtr,Signers`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; + //getting document details + const documentData = await contractDocument(documentId); + if (documentData && documentData !== "no data found!" && documentData[0]) { + setPdfDetails(documentData); - if (res[0] && res.length > 0) { - setPdfDetails(res); + const currEmail = documentData[0].ExtUserPtr.Email; + const filterCurrEmail = documentData[0].Signers.filter( + (data) => data.Email === currEmail + ); - const currEmail = res[0].ExtUserPtr.Email; - const filterCurrEmail = res[0].Signers.filter( - (data) => data.Email === currEmail - ); + setCurrentEmail(filterCurrEmail); + setSignersData(documentData[0]); - setCurrentEmail(filterCurrEmail); - setSignersData(res[0]); - - setSignerObjId(res[0].Signers[0].objectId); - setContractName(res[0].Signers[0].className); - setIsSelectId(0); - } else { - setNoData(true); - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - } - }) - .catch((err) => { - console.log("axois err ", err); - const loadObj = { - isLoad: false - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); - }); - - const res = await contractUsers(jsonSender.objectId); + setSignerObjId(documentData[0].Signers[0].objectId); + setContractName(documentData[0].Signers[0].className); + setIsSelectId(0); + } else if (documentData === "no data found!") { + setNoData(true); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } else if (documentData === "Error: Something went wrong!") { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } + const res = await contractUsers(jsonSender.email); if (res[0] && res.length) { setSignerUserId(res[0].objectId); const tourstatus = res[0].TourStatus && res[0].TourStatus; diff --git a/microfrontends/SignDocuments/src/Component/recipientSignPdf.js b/microfrontends/SignDocuments/src/Component/recipientSignPdf.js index 77b3de40e..98683fe8d 100644 --- a/microfrontends/SignDocuments/src/Component/recipientSignPdf.js +++ b/microfrontends/SignDocuments/src/Component/recipientSignPdf.js @@ -14,7 +14,9 @@ import DefaultSignature from "./component/defaultSignature"; import { getBase64FromUrl, getBase64FromIMG, - contactBookName + contractUsers, + contactBook, + contractDocument } from "../utils/Utils"; import Tour from "reactour"; import Signedby from "./component/signedby"; @@ -74,6 +76,15 @@ function EmbedPdfImage() { return object.pageNumber === pageNumber; }); const divRef = useRef(null); + const senderUser = localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ) + ? localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ) + : `${localStorage.getItem("UserInformation")}` && + `${localStorage.getItem("UserInformation")}`; + const jsonSender = JSON.parse(senderUser); //check isGuestSigner is present in local if yes than handle login flow header in mobile view const isGuestSigner = localStorage.getItem("isGuestSigner"); useEffect(() => { @@ -96,17 +107,17 @@ function EmbedPdfImage() { //function for get document details for perticular signer with signer'object id const getDocumentDetails = async () => { let currUserId, userObjectId; - const json = await contactBookName(contactBookId, "_Contactbook"); - if (json !== "Error: Something went wrong!" && json && json.results[0]) { + //getting contracts_contactBook details + const json = await contactBook(contactBookId); + if (json !== "Error: Something went wrong!" && json[0]) { setContractName("_Contactbook"); - if (json.results[0]) { - userObjectId = json.results[0].UserId.objectId; + if (json[0]) { + userObjectId = json[0].UserId.objectId; setUserObjectID(userObjectId); - currUserId = json.results[0].objectId; + currUserId = json[0].objectId; setSignerUserId(currUserId); - const tourstatus = - json.results[0].TourStatus && json.results[0].TourStatus; + const tourstatus = json[0].TourStatus && json[0].TourStatus; if (tourstatus && tourstatus.length > 0) { setTourStatus(tourstatus); @@ -131,18 +142,16 @@ function EmbedPdfImage() { setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); } else { - const json = await contactBookName(contactBookId, "_Users"); - - if (json !== "Error: Something went wrong!" && json && json.results[0]) { + const json = await contractUsers(jsonSender.email); + if (json !== "Error: Something went wrong!" && json && json[0]) { setContractName("_Users"); - if (json.results[0]) { - userObjectId = json.results[0].UserId.objectId; + if (json[0]) { + userObjectId = json[0].UserId.objectId; setUserObjectID(userObjectId); - currUserId = json.results[0].objectId; + currUserId = json[0].objectId; setSignerUserId(currUserId); - const tourstatus = - json.results[0].TourStatus && json.results[0].TourStatus; + const tourstatus = json[0].TourStatus && json[0].TourStatus; if (tourstatus && tourstatus.length > 0) { setTourStatus(tourstatus); @@ -169,168 +178,157 @@ function EmbedPdfImage() { } } - await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Document?where={"objectId":"${docId}"}&include=ExtUserPtr,Signers,AuditTrail - ,`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then((Listdata) => { - const json = Listdata.data; - const res = json.results; - if (res[0] && res.length > 0) { - const declined = res[0].IsDeclined && res[0].IsDeclined; - const isCompleted = res[0].IsCompleted && res[0].IsCompleted; - const expireDate = res[0].ExpiryDate.iso; + //getting document details + const documentData = await contractDocument(docId); + if (documentData && documentData !== "no data found!" && documentData[0]) { + const declined = documentData[0].IsDeclined && documentData[0].IsDeclined; + const isCompleted = + documentData[0].IsCompleted && documentData[0].IsCompleted; + const expireDate = documentData[0].ExpiryDate.iso; - const expireUpdateDate = new Date(expireDate).getTime(); - const currDate = new Date().getTime(); - if (isCompleted) { - //checking document is completed (signed by all requested signers) than isCompleted true - //then show alert with completed message + const expireUpdateDate = new Date(expireDate).getTime(); + const currDate = new Date().getTime(); + if (isCompleted) { + //checking document is completed (signed by all requested signers) than isCompleted true + //then show alert with completed message + const alreadySign = { + status: true, + mssg: "This document has been successfully signed!" + }; + setIsAlreadySign(alreadySign); + setPdfUrl(documentData[0].SignedUrl); + setSignedPdfData(documentData); + setCompletePdfData(documentData); + } else if (declined) { + const currentDecline = { + currnt: "another", + isDeclined: true + }; + setIsDecline(currentDecline); + + setSignedPdfData(documentData); + } else if (currDate > expireUpdateDate) { + setIsExpired(true); + const checkDocIdExist = + documentData[0].AuditTrail && + documentData[0].AuditTrail.length > 0 && + documentData[0].AuditTrail.filter( + (data) => data.Activity === "Signed" + ); + + //if signed by someone than go to in if condition + // and second signer could not be add documentId + //for that setIsDocId true + if (checkDocIdExist && checkDocIdExist.length > 0) { + setIsDocId(true); + const currUser = + documentData.Placeholders && + documentData.Placeholders.filter( + (data) => data.signerObjId === currUserId + ); + + setSignedPdfData(documentData); + + setXyPostion(currUser[0].placeHolder); + + const key = currUser[0].placeHolder[0].pos[0].key; + setSignKey(key); + } + //for show current requested signer's placeholder + else { + const currUser = + documentData[0].Placeholders && + documentData[0].Placeholders.filter( + (data) => data.signerObjId === currUserId + ); + + setSignedPdfData(documentData); + + setXyPostion(currUser[0].placeHolder); + + const key = currUser[0].placeHolder[0].pos[0].key; + setSignKey(key); + } + } else { + //checking document has signed by someone or not + + const checkDocIdExist = + documentData[0].AuditTrail && + documentData[0].AuditTrail.length > 0 && + documentData[0].AuditTrail.filter( + (data) => data.Activity === "Signed" + ); + + //if signed by someone than go to in if condition + // and second signer could not be add documentId + //for that setIsDocId true + + if (checkDocIdExist && checkDocIdExist.length > 0) { + setIsDocId(true); + + //condition for checking document signed by current requested user or not + const checkAlreadyBySigner = documentData[0].AuditTrail.filter( + (data) => + data.UserPtr.objectId === currUserId && data.Activity === "Signed" + ); + + // if checkAlreadyBySigner has some data that current user already sign this document + // then show alert with message + if (checkAlreadyBySigner && checkAlreadyBySigner.length > 0) { const alreadySign = { status: true, - mssg: "This document has been successfully signed!" + mssg: "You have successfully signed the document!" }; setIsAlreadySign(alreadySign); - setPdfUrl(res[0].SignedUrl); - setSignedPdfData(json.results); - setCompletePdfData(res); - } else if (declined) { - const currentDecline = { - currnt: "another", - isDeclined: true - }; - setIsDecline(currentDecline); - - setSignedPdfData(json.results); - } else if (currDate > expireUpdateDate) { - setIsExpired(true); - const checkDocIdExist = - json.results[0].AuditTrail && - json.results[0].AuditTrail.length > 0 && - json.results[0].AuditTrail.filter( - (data) => data.Activity === "Signed" + setPdfUrl(documentData[0].SignedUrl); + setSignedPdfData(documentData); + } + //else show placeholder of current requested signer + else { + const currUser = + documentData[0].Placeholders && + documentData[0].Placeholders.filter( + (data) => data.signerObjId === currUserId ); - //if signed by someone than go to in if condition - // and second signer could not be add documentId - //for that setIsDocId true - if (checkDocIdExist && checkDocIdExist.length > 0) { - setIsDocId(true); - const currUser = - json.results[0].Placeholders && - json.results[0].Placeholders.filter( - (data) => data.signerObjId === currUserId - ); + setSignedPdfData(documentData); - setSignedPdfData(json.results); + setXyPostion(currUser[0].placeHolder); - setXyPostion(currUser[0].placeHolder); - - const key = currUser[0].placeHolder[0].pos[0].key; - setSignKey(key); - } - //for show current requested signer's placeholder - else { - const currUser = - json.results[0].Placeholders && - json.results[0].Placeholders.filter( - (data) => data.signerObjId === currUserId - ); - - setSignedPdfData(json.results); - - setXyPostion(currUser[0].placeHolder); - - const key = currUser[0].placeHolder[0].pos[0].key; - setSignKey(key); - } - } else { - //checking document has signed by someone or not - - const checkDocIdExist = - json.results[0].AuditTrail && - json.results[0].AuditTrail.length > 0 && - json.results[0].AuditTrail.filter( - (data) => data.Activity === "Signed" - ); - - //if signed by someone than go to in if condition - // and second signer could not be add documentId - //for that setIsDocId true - - if (checkDocIdExist && checkDocIdExist.length > 0) { - setIsDocId(true); - - //condition for checking document signed by current requested user or not - const checkAlreadyBySigner = json.results[0].AuditTrail.filter( - (data) => - data.UserPtr.objectId === currUserId && - data.Activity === "Signed" - ); - - // if checkAlreadyBySigner has some data that current user already sign this document - // then show alert with message - if (checkAlreadyBySigner && checkAlreadyBySigner.length > 0) { - const alreadySign = { - status: true, - mssg: "You have successfully signed the document!" - }; - setIsAlreadySign(alreadySign); - setPdfUrl(res[0].SignedUrl); - setSignedPdfData(json.results); - } - //else show placeholder of current requested signer - else { - const currUser = - json.results[0].Placeholders && - json.results[0].Placeholders.filter( - (data) => data.signerObjId === currUserId - ); - - setSignedPdfData(json.results); - - setXyPostion(currUser[0].placeHolder); - - const key = currUser[0].placeHolder[0].pos[0].key; - setSignKey(key); - } - } - //for show current requested signer's placeholder - else { - const currUser = - json.results[0].Placeholders && - json.results[0].Placeholders.filter( - (data) => data.signerObjId === currUserId - ); - - setSignedPdfData(json.results); - - setXyPostion(currUser[0].placeHolder); - - const key = currUser[0].placeHolder[0].pos[0].key; - setSignKey(key); - } + const key = currUser[0].placeHolder[0].pos[0].key; + setSignKey(key); } } - }) - .catch((err) => { - const loadObj = { - isLoad: false - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); - console.log("err", err); - }); + //for show current requested signer's placeholder + else { + const currUser = + documentData[0].Placeholders && + documentData[0].Placeholders.filter( + (data) => data.signerObjId === currUserId + ); + + setSignedPdfData(documentData); + + setXyPostion(currUser[0].placeHolder); + + const key = currUser[0].placeHolder[0].pos[0].key; + setSignKey(key); + } + } + } else if (documentData === "no data found!") { + setNoData(true); + + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } else if (documentData === "Error: Something went wrong!") { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } await axios .get( `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( @@ -662,8 +660,8 @@ function EmbedPdfImage() { yPosition = pos.isDrag ? y * scale - height : pos.firstYPos - ? y * scale - height + pos.firstYPos - : y * scale - height; + ? y * scale - height + pos.firstYPos + : y * scale - height; return yPosition; } else { const y = pos.yBottom / scale; @@ -671,8 +669,8 @@ function EmbedPdfImage() { yPosition = pos.isDrag ? y * scale - height : pos.firstYPos - ? y * scale - height + pos.firstYPos - : y * scale - height; + ? y * scale - height + pos.firstYPos + : y * scale - height; return yPosition; } } else { @@ -683,15 +681,15 @@ function EmbedPdfImage() { yPosition = pos.isDrag ? y - height : pos.firstYPos - ? y - height + pos.firstYPos - : y - height; + ? y - height + pos.firstYPos + : y - height; return yPosition; } else { yPosition = pos.isDrag ? pos.yBottom - height : pos.firstYPos - ? pos.yBottom - height + pos.firstYPos - : pos.yBottom - height; + ? pos.yBottom - height + pos.firstYPos + : pos.yBottom - height; return yPosition; } } @@ -1083,7 +1081,7 @@ function EmbedPdfImage() { isShowHeader={true} currentSigner={true} decline={true} - alreadySign={pdfUrl ? true :false} + alreadySign={pdfUrl ? true : false} /> <RenderPdf @@ -1128,9 +1126,7 @@ function EmbedPdfImage() { )} </div> )} - </DndProvider> ); } - -export default EmbedPdfImage; \ No newline at end of file +export default EmbedPdfImage; diff --git a/microfrontends/SignDocuments/src/utils/Utils.js b/microfrontends/SignDocuments/src/utils/Utils.js index 0b915423d..bdd4786ac 100644 --- a/microfrontends/SignDocuments/src/utils/Utils.js +++ b/microfrontends/SignDocuments/src/utils/Utils.js @@ -57,7 +57,6 @@ export function onSaveImage(xyPostion, index, signKey, imgWH, image) { (data, ind) => data.key === signKey && data.Width && data.Height && data.SignUrl ); - if (updateFilter.length > 0) { let newWidth, newHeight; @@ -139,7 +138,7 @@ export function onSaveImage(xyPostion, index, signKey, imgWH, image) { ...url, Width: getPosData[0].Width ? getPosData[0].Width : newWidth, Height: getPosData[0].Height ? getPosData[0].Height : newHeight, - SignUrl: image.src, + SignUrl: image.src, ImageType: image.imgType }; } @@ -183,34 +182,97 @@ export function onSaveSign(xyPostion, index, signKey, signatureImg) { return newUpdateUrl; } -//function for getting contract_User details -export const contractUsers = async (objectId) => { - const result = await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}_Users?where={"UserId": {"__type": "Pointer","className": "_User", "objectId":"${objectId}"}}`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } +//function for getting document details from contract_Documents class +export const contractDocument = async (documentId) => { + const data = { + docId: documentId + }; + const documentDeatils = await axios + .post(`${localStorage.getItem("baseUrl")}functions/getDocument`, data, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") } - ) + }) .then((Listdata) => { const json = Listdata.data; - const res = json.results; - return res; + let data = []; + if (json && json.result) { + data.push(json.result); + return data; + } else { + return "no data found!"; + } }) .catch((err) => { return "Error: Something went wrong!"; }); - return result; + return documentDeatils; }; -//function for getting contrscts_contactbook details +//function for getting document details for getDrive +export const getDrive = async (documentId) => { + const data = { + docId: documentId && documentId + }; + const driveDeatils = await axios + .post(`${localStorage.getItem("baseUrl")}functions/getDrive`, data, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessiontoken: localStorage.getItem("accesstoken") + } + }) + .then((Listdata) => { + const json = Listdata.data; + + if (json && json.result) { + const data = json.result; + + return data; + } else { + return "no data found!"; + } + }) + .catch((err) => { + return "Error: Something went wrong!"; + }); + + return driveDeatils; +}; +//function for getting contract_User details +export const contractUsers = async (email) => { + const data = { + email: email + }; + const userDetails = await axios + .post(`${localStorage.getItem("baseUrl")}functions/getUserDetails`, data, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + } + }) + .then((Listdata) => { + const json = Listdata.data; + let data = []; + if (json && json.result) { + data.push(json.result); + return data; + } else { + return "no data found!"; + } + }) + .catch((err) => { + return "Error: Something went wrong!"; + }); + + return userDetails; +}; + +//function for getting contracts_contactbook details export const contactBook = async (objectId) => { const result = await axios .get( @@ -236,27 +298,3 @@ export const contactBook = async (objectId) => { }); return result; }; - -export const contactBookName = async (objectId, className) => { - const result = await axios - .get( - `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( - "_appName" - )}${className}?where={"objectId":"${objectId}"}`, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then((Listdata) => { - const json = Listdata.data; - return json; - }) - .catch((err) => { - return "Error: Something went wrong!"; - }); - return result; -}; From aed0b8a3db15a9dfc3d3b467bf3cd53fe9cb8332 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 20 Nov 2023 19:11:46 +0530 Subject: [PATCH 18/20] add getReport cloud function --- apps/OpenSign/src/routes/Report.js | 22 +- apps/OpenSignServer/cloud/main.js | 3 +- .../cloud/parsefunction/getDrive.js | 2 +- .../cloud/parsefunction/getReport.js | 51 +++++ .../cloud/parsefunction/pdf/PDF.min.js | 2 +- .../cloud/parsefunction/reportsJson.js | 204 ++++++++++++++++++ 6 files changed, 267 insertions(+), 17 deletions(-) create mode 100644 apps/OpenSignServer/cloud/parsefunction/getReport.js create mode 100644 apps/OpenSignServer/cloud/parsefunction/reportsJson.js diff --git a/apps/OpenSign/src/routes/Report.js b/apps/OpenSign/src/routes/Report.js index efec224ac..44ecb74ff 100644 --- a/apps/OpenSign/src/routes/Report.js +++ b/apps/OpenSign/src/routes/Report.js @@ -47,30 +47,24 @@ const Report = () => { if (json) { setActions(json.actions); setReportName(json.reportName); - const { className, params, keys, orderBy } = json; Parse.serverURL = localStorage.getItem("BaseUrl12"); Parse.initialize(localStorage.getItem("AppID12")); const currentUser = Parse.User.current().id; - const serverURL = - localStorage.getItem("BaseUrl12") + "classes/" + className; - const strParams = JSON.stringify(params); - const strKeys = keys.join(); const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("AppID12"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") + sessiontoken: localStorage.getItem("accesstoken") }; try { - const url = `${serverURL}?where=${strParams}&keys=${strKeys}&order=${orderBy}&skip=${skipUserRecord}&limit=${limit}&include=AuditTrail.UserPtr`; - const res = await axios.get(url, { + const params = { reportId: id, skip: skipUserRecord, limit: limit }; + const url = `${localStorage.getItem("BaseUrl12")}/functions/getReport`; + const res = await axios.post(url, params, { headers: headers, signal: abortController.signal // is used to cancel fetch query }); if (id === "4Hhwbp482K") { - const listData = res.data?.results.filter( - (x) => x.Signers.length > 0 - ); + const listData = res.data?.result.filter((x) => x.Signers.length > 0); let arr = []; for (const obj of listData) { const isSigner = obj.Signers.some( @@ -101,7 +95,7 @@ const Report = () => { prevRecord.length > 0 ? [...prevRecord, ...arr] : arr ); } else { - if (res.data.results.length === 10) { + if (res.data.result.length === 10) { setIsMoreDocs(true); console.log("here"); } else { @@ -110,8 +104,8 @@ const Report = () => { setIsNextRecord(false); setList((prevRecord) => prevRecord.length > 0 - ? [...prevRecord, ...res.data.results] - : res.data.results + ? [...prevRecord, ...res.data.result] + : res.data.result ); } setIsLoader(false); diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 2ecc0fbf1..e42ee38e5 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -16,7 +16,7 @@ import getUserId from './parsefunction/getUserId.js'; import getUserDetails from './parsefunction/getUserDetails.js'; import getDocument from './parsefunction/getDocument.js'; import getDrive from './parsefunction/getDrive.js'; -// import getInProgressReport from './parsefunction/getInProgressReport.js'; +import getReport from './parsefunction/getReport.js'; Parse.Cloud.define('AddUserToRole', addUserToGroups); Parse.Cloud.define('UserGroups', getUserGroups); @@ -36,3 +36,4 @@ Parse.Cloud.define('getUserId', getUserId); Parse.Cloud.define('getUserDetails', getUserDetails); Parse.Cloud.define('getDocument', getDocument); Parse.Cloud.define('getDrive', getDrive) +Parse.Cloud.define('getReport', getReport) \ No newline at end of file diff --git a/apps/OpenSignServer/cloud/parsefunction/getDrive.js b/apps/OpenSignServer/cloud/parsefunction/getDrive.js index 567d1b08f..5c0d31a8e 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getDrive.js +++ b/apps/OpenSignServer/cloud/parsefunction/getDrive.js @@ -27,7 +27,7 @@ export default async function getDrive(request) { 'X-Parse-Master-key': process.env.MASTER_KEY, }, }); - console.log('res.data.results ', res.data.results); + // console.log('res.data.results ', res.data.results); if (res.data && res.data.results) { return res.data.results; } else { diff --git a/apps/OpenSignServer/cloud/parsefunction/getReport.js b/apps/OpenSignServer/cloud/parsefunction/getReport.js new file mode 100644 index 000000000..1f2c6f1f1 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/getReport.js @@ -0,0 +1,51 @@ +import reportJson from './reportsJson.js'; +import axios from 'axios' + +export default async function getReport(request) { + const reportId = request.params.reportId; + const limit = request.params.limit; + const skip = request.params.skip; + + const serverUrl = process.env.SERVER_URL; + const appId = process.env.APP_ID; + + 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 json = reportId && reportJson(reportId, userId); + if (json) { + const { params, keys } = json; + const orderBy = '-updatedAt'; + const strParams = JSON.stringify(params); + const strKeys = keys.join(); + const headers = { + 'Content-Type': 'application/json', + 'X-Parse-Application-Id': appId, + 'X-Parse-Master-Key': process.env.MASTER_KEY, + }; + const url = `${serverUrl}/classes/contracts_Document?where=${strParams}&keys=${strKeys}&order=${orderBy}&skip=${skip}&limit=${limit}&include=AuditTrail.UserPtr`; + const res = await axios.get(url, { headers: headers }); + if (res.data && res.data.results) { + return res.data.results; + } else { + return []; + } + } else { + return { error: 'Report is not available!' }; + } + } + } catch (err) { + console.log('err', err); + if (err.code == 209) { + return { error: 'Invalid session token' }; + } else { + return { error: "You don't have access!" }; + } + } +} diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js index 6e0bb6658..ba3f1ab97 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js @@ -105,7 +105,7 @@ async function PDF(s, r) { headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APPID, - 'X-Parse-Session-Token': s.headers.sessiontoken, + 'X-Parse-Master-Key': masterKEY, }, }), d = await axios.get(serverUrl + '/users/me', { diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js new file mode 100644 index 000000000..83c295d74 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -0,0 +1,204 @@ +export default function reportJson(id, userId) { + const currentUserId = userId; + + switch (id) { + // draft documents report + case 'ByHuevtCFY': + return { + reportName: 'Draft Documents', + params: { + Type: null, + $or: [ + { Signers: null, SignedUrl: null }, + { Signers: { $exists: true }, Placeholders: null }, + ], + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + }, + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + // Need your sign report + case '4Hhwbp482K': + return { + reportName: 'Need your sign', + params: { + Type: { $ne: 'Folder' }, + IsCompleted: { $ne: true }, + IsDeclined: { $ne: true }, + ExpiryDate: { + $gt: { __type: 'Date', iso: new Date().toISOString() }, + }, + Placeholders: { $ne: null }, + }, + keys: [ + 'Name', + 'Note', + 'Folder.Name', + 'URL', + 'ExtUserPtr.Name', + 'Signers.Name', + 'Signers.UserId', + 'AuditTrail', + ], + }; + // In progess report + case '1MwEuxLEkF': + return { + reportName: 'In-progress documents', + params: { + Type: { $ne: 'Folder' }, + Signers: { $ne: null }, + Placeholders: { $ne: null }, + IsCompleted: { $ne: true }, + IsDeclined: { $ne: true }, + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + ExpiryDate: { + $gt: { __type: 'Date', iso: new Date().toISOString() }, + }, + }, + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + // completed documents report + case 'kQUoW4hUXz': + return { + reportName: 'Completed Documents', + params: { + Type: null, + IsCompleted: true, + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + IsDeclined: { $ne: true }, + }, + keys: [ + 'Name', + 'Note', + 'Folder.Name', + 'URL', + 'ExtUserPtr.Name', + 'Signers.Name', + 'TimeToCompleteDays', + ], + }; + + // declined documents report + case 'UPr2Fm5WY3': + return { + reportName: 'Declined Documents', + params: { + Type: null, + IsDeclined: true, + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + }, + + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + // Expired Documents report + case 'zNqBHXHsYH': + return { + reportName: 'Expired Documents', + params: { + IsCompleted: { $ne: true }, + IsDeclined: { $ne: true }, + Type: { $ne: 'Folder' }, + $and: [ + { + $or: [ + { Signers: { $ne: null }, SignedUrl: { $ne: null } }, + { Placeholders: { $ne: null } }, + ], + }, + { + ExpiryDate: { + $lt: { __type: 'Date', iso: new Date().toISOString() }, + }, + }, + ], + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + }, + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + // Recently sent for signatures report show on dashboard + case 'd9k3UfYHBc': + return { + reportName: 'Recently sent for signatures', + params: { + Type: { $ne: 'Folder' }, + Signers: { $ne: null }, + Placeholders: { $ne: null }, + IsCompleted: { $ne: true }, + IsDeclined: { $ne: true }, + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + ExpiryDate: { + $gt: { __type: 'Date', iso: new Date().toISOString() }, + }, + }, + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + // Recent signature requests report show on dashboard + case '5Go51Q7T8r': + return { + reportName: 'Recent signature requests', + params: { + Type: { $ne: 'Folder' }, + IsCompleted: { $ne: true }, + IsDeclined: { $ne: true }, + ExpiryDate: { + $gt: { __type: 'Date', iso: new Date().toISOString() }, + }, + Placeholders: { $ne: null }, + }, + keys: [ + 'Name', + 'Note', + 'Folder.Name', + 'URL', + 'ExtUserPtr.Name', + 'Signers.Name', + 'Signers.UserId', + 'AuditTrail', + ], + }; + // Drafts report show on dashboard + case 'kC5mfynCi4': + return { + reportName: 'Drafts', + params: { + Type: null, + $or: [ + { Signers: null, SignedUrl: null }, + { Signers: { $exists: true }, Placeholders: null }, + ], + CreatedBy: { + __type: 'Pointer', + className: '_User', + objectId: currentUserId, + }, + }, + keys: ['Name', 'Note', 'Folder.Name', 'URL', 'ExtUserPtr.Name', 'Signers.Name'], + }; + default: + return null; + } +} From b178a3c91e55e2bba922beb2d9058cf563b46a58 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Mon, 20 Nov 2023 21:57:26 +0530 Subject: [PATCH 19/20] handle condition of no data for contracts_Document and contracts_ContactBook classes --- .../src/Component/DraftDocument.js | 23 +++---- .../src/Component/LegaDrive/LegaDrive.js | 6 +- .../src/Component/PdfRequestFiles.js | 19 +++--- .../src/Component/SignYourselfPdf.js | 31 +++++---- .../src/Component/placeHolderSign.js | 19 +++--- .../src/Component/recipientSignPdf.js | 63 ++++++++++--------- .../SignDocuments/src/utils/Utils.js | 17 ++--- 7 files changed, 93 insertions(+), 85 deletions(-) diff --git a/microfrontends/SignDocuments/src/Component/DraftDocument.js b/microfrontends/SignDocuments/src/Component/DraftDocument.js index 8c5884c87..95ab370b9 100644 --- a/microfrontends/SignDocuments/src/Component/DraftDocument.js +++ b/microfrontends/SignDocuments/src/Component/DraftDocument.js @@ -28,18 +28,19 @@ function DraftDocument() { const getDocumentDetails = async () => { //getting document details const documentData = await contractDocument(docId); - if (documentData && documentData !== "no data found!" && documentData[0]) { - if (documentData[0] && documentData.length > 0) { - setPdfDetails(documentData); - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - } - } else if (documentData === "no data found!") { - alert("No data found!"); - } else if (documentData === "Error: Something went wrong!") { + if (documentData && documentData.length > 0) { + setPdfDetails(documentData); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); + } else if ( + documentData === "Error: Something went wrong!" || + (documentData.result && documentData.result.error) + ) { alert("Error: Something went wrong!"); + } else { + alert("No data found!"); } }; diff --git a/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js b/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js index ed456ec96..db0c94425 100644 --- a/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js +++ b/microfrontends/SignDocuments/src/Component/LegaDrive/LegaDrive.js @@ -16,8 +16,6 @@ function PdfFile() { const [pdfData, setPdfData] = useState([]); const [isFolder, setIsFolder] = useState(false); const [newFolderName, setNewFolderName] = useState(); - // const [parentFolderName, setParentFolderName] = useState(); - // const [parentFolder, setParentFolder] = useState([]); const [error, setError] = useState(); const [folderLoader, setIsFolderLoader] = useState(false); const [isShowSort, setIsShowSort] = useState(false); @@ -48,7 +46,7 @@ function PdfFile() { const driveDetails = await getDrive(); if (driveDetails) { - if (driveDetails && driveDetails.length > 0) { + if (driveDetails.length > 0) { setPdfData(driveDetails); } const data = [ @@ -79,7 +77,7 @@ function PdfFile() { setIsLoading(load); const driveDetails = await getDrive(docId); if (driveDetails) { - if (driveDetails && driveDetails.length > 0) { + if (driveDetails.length > 0) { setPdfData(driveDetails); } else { setPdfData([]); diff --git a/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js b/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js index 7a53c3b17..9adca6778 100644 --- a/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js +++ b/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js @@ -112,7 +112,7 @@ function PdfRequestFiles() { const getDocumentDetails = async () => { //getting document details const documentData = await contractDocument(documentId); - if (documentData && documentData !== "no data found!" && documentData[0]) { + if (documentData && documentData.length > 0) { const isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted; const expireDate = documentData[0].ExpiryDate.iso; @@ -222,19 +222,22 @@ function PdfRequestFiles() { } else { alert("No data found!"); } - } else if (documentData === "no data found!") { + } else if ( + documentData === "Error: Something went wrong!" || + (documentData.result && documentData.result.error) + ) { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } else { setNoData(true); const loadObj = { isLoad: false }; setIsLoading(loadObj); setIsUiLoading(false); - } else if (documentData === "Error: Something went wrong!") { - const loadObj = { - isLoad: false - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); } await axios .get( diff --git a/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js b/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js index e0284b4ed..2b5eebdc8 100644 --- a/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js +++ b/microfrontends/SignDocuments/src/Component/SignYourselfPdf.js @@ -176,7 +176,7 @@ function SignYourSelf() { //getting document details const documentData = await contractDocument(documentId); - if (documentData && documentData !== "no data found!" && documentData[0]) { + if (documentData && documentData.length > 0) { setPdfDetails(documentData); const isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted; @@ -193,21 +193,22 @@ function SignYourSelf() { setShowAlreadySignDoc(alreadySign); setPdfUrl(documentData[0].SignedUrl); } - } else if (documentData === "no data found!") { - setNoData(true); - - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - } else if (documentData === "Error: Something went wrong!") { + } else if ( + documentData === "Error: Something went wrong!" || + (documentData.result && documentData.result.error) + ) { const loadObj = { isLoad: false }; setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); + } else { + setNoData(true); + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); } - await axios .get( `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( @@ -241,11 +242,7 @@ function SignYourSelf() { const contractUsersRes = await contractUsers(jsonSender.email); - if ( - contractUsersRes !== "Error: Something went wrong!" && - contractUsersRes && - contractUsersRes[0] - ) { + if (contractUsersRes[0] && contractUsersRes.length > 0) { setContractName("_Users"); setSignerUserId(contractUsersRes[0].objectId); const tourstatuss = @@ -272,7 +269,7 @@ function SignYourSelf() { setIsLoading(loadObj); } else if (contractUsersRes.length === 0) { const contractContactBook = await contactBook(jsonSender.objectId); - if (contractContactBook && contractContactBook[0]) { + if (contractContactBook && contractContactBook.length > 0) { setContractName("_Contactbook"); setSignerUserId(contractContactBook[0].objectId); const tourstatuss = @@ -287,6 +284,8 @@ function SignYourSelf() { setCheckTourStatus(checkTourRecipients[0].signyourself); } } + } else { + setNoData(true); } const loadObj = { isLoad: false diff --git a/microfrontends/SignDocuments/src/Component/placeHolderSign.js b/microfrontends/SignDocuments/src/Component/placeHolderSign.js index bf998dea8..a9464269a 100644 --- a/microfrontends/SignDocuments/src/Component/placeHolderSign.js +++ b/microfrontends/SignDocuments/src/Component/placeHolderSign.js @@ -176,7 +176,7 @@ function PlaceHolderSign() { const getDocumentDetails = async () => { //getting document details const documentData = await contractDocument(documentId); - if (documentData && documentData !== "no data found!" && documentData[0]) { + if (documentData && documentData.length > 0) { setPdfDetails(documentData); const currEmail = documentData[0].ExtUserPtr.Email; @@ -190,19 +190,22 @@ function PlaceHolderSign() { setSignerObjId(documentData[0].Signers[0].objectId); setContractName(documentData[0].Signers[0].className); setIsSelectId(0); - } else if (documentData === "no data found!") { + } else if ( + documentData === "Error: Something went wrong!" || + (documentData.result && documentData.result.error) + ) { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } else { setNoData(true); const loadObj = { isLoad: false }; setIsLoading(loadObj); - } else if (documentData === "Error: Something went wrong!") { - const loadObj = { - isLoad: false - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); } const res = await contractUsers(jsonSender.email); if (res[0] && res.length) { diff --git a/microfrontends/SignDocuments/src/Component/recipientSignPdf.js b/microfrontends/SignDocuments/src/Component/recipientSignPdf.js index 98683fe8d..0b9a106c9 100644 --- a/microfrontends/SignDocuments/src/Component/recipientSignPdf.js +++ b/microfrontends/SignDocuments/src/Component/recipientSignPdf.js @@ -109,31 +109,24 @@ function EmbedPdfImage() { let currUserId, userObjectId; //getting contracts_contactBook details const json = await contactBook(contactBookId); - if (json !== "Error: Something went wrong!" && json[0]) { + if (json && json.length > 0) { setContractName("_Contactbook"); - if (json[0]) { - userObjectId = json[0].UserId.objectId; - setUserObjectID(userObjectId); - currUserId = json[0].objectId; - setSignerUserId(currUserId); - const tourstatus = json[0].TourStatus && json[0].TourStatus; + userObjectId = json[0].UserId.objectId; + setUserObjectID(userObjectId); + currUserId = json[0].objectId; - if (tourstatus && tourstatus.length > 0) { - setTourStatus(tourstatus); - const checkTourRecipients = tourstatus.filter( - (data) => data.recipientssign - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].recipientssign); - } + setSignerUserId(currUserId); + const tourstatus = json[0].TourStatus && json[0].TourStatus; + + if (tourstatus && tourstatus.length > 0) { + setTourStatus(tourstatus); + const checkTourRecipients = tourstatus.filter( + (data) => data.recipientssign + ); + if (checkTourRecipients && checkTourRecipients.length > 0) { + setCheckTourStatus(checkTourRecipients[0].recipientssign); } - } else { - setNoData(true); - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); } } else if (json === "Error: Something went wrong!") { const loadObj = { @@ -143,7 +136,7 @@ function EmbedPdfImage() { setIsLoading(loadObj); } else { const json = await contractUsers(jsonSender.email); - if (json !== "Error: Something went wrong!" && json && json[0]) { + if (json && json.length > 0) { setContractName("_Users"); if (json[0]) { userObjectId = json[0].UserId.objectId; @@ -175,12 +168,19 @@ function EmbedPdfImage() { }; setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); + } else { + setNoData(true); + + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); } } //getting document details const documentData = await contractDocument(docId); - if (documentData && documentData !== "no data found!" && documentData[0]) { + if (documentData && documentData.length > 0) { const declined = documentData[0].IsDeclined && documentData[0].IsDeclined; const isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted; @@ -315,19 +315,22 @@ function EmbedPdfImage() { setSignKey(key); } } - } else if (documentData === "no data found!") { + } else if ( + documentData === "Error: Something went wrong!" || + (documentData.result && documentData.result.error) + ) { + const loadObj = { + isLoad: false + }; + setHandleError("Error: Something went wrong!"); + setIsLoading(loadObj); + } else { setNoData(true); const loadObj = { isLoad: false }; setIsLoading(loadObj); - } else if (documentData === "Error: Something went wrong!") { - const loadObj = { - isLoad: false - }; - setHandleError("Error: Something went wrong!"); - setIsLoading(loadObj); } await axios .get( diff --git a/microfrontends/SignDocuments/src/utils/Utils.js b/microfrontends/SignDocuments/src/utils/Utils.js index bdd4786ac..9274d9235 100644 --- a/microfrontends/SignDocuments/src/utils/Utils.js +++ b/microfrontends/SignDocuments/src/utils/Utils.js @@ -152,7 +152,6 @@ export function onSaveImage(xyPostion, index, signKey, imgWH, image) { return obj; }); return newUpdateUrl; - // setXyPostion(newUpdateUrl); } } @@ -198,11 +197,13 @@ export const contractDocument = async (documentId) => { .then((Listdata) => { const json = Listdata.data; let data = []; - if (json && json.result) { + if (json && json.result.error) { + return json; + } else if (json && json.result) { data.push(json.result); return data; } else { - return "no data found!"; + return []; } }) .catch((err) => { @@ -228,12 +229,13 @@ export const getDrive = async (documentId) => { .then((Listdata) => { const json = Listdata.data; - if (json && json.result) { + if (json && json.result.error) { + return json; + } else if (json && json.result) { const data = json.result; - return data; } else { - return "no data found!"; + return []; } }) .catch((err) => { @@ -258,11 +260,10 @@ export const contractUsers = async (email) => { .then((Listdata) => { const json = Listdata.data; let data = []; + if (json && json.result) { data.push(json.result); return data; - } else { - return "no data found!"; } }) .catch((err) => { From 359d86e17b8f4d54deb62a4e864d9ce805ebcfdf Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Mon, 20 Nov 2023 23:00:07 +0530 Subject: [PATCH 20/20] fix: sendmail functionality not working --- apps/OpenSign/.gitignore | 1 + .../cloud/parsefunction/sendMail.js | 26 +++++++++---------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/apps/OpenSign/.gitignore b/apps/OpenSign/.gitignore index cc964cb27..b96e769c8 100644 --- a/apps/OpenSign/.gitignore +++ b/apps/OpenSign/.gitignore @@ -10,6 +10,7 @@ # production /build +/mfbuild # misc .env diff --git a/apps/OpenSignServer/cloud/parsefunction/sendMail.js b/apps/OpenSignServer/cloud/parsefunction/sendMail.js index fb964e28f..c607c2822 100644 --- a/apps/OpenSignServer/cloud/parsefunction/sendMail.js +++ b/apps/OpenSignServer/cloud/parsefunction/sendMail.js @@ -55,29 +55,27 @@ async function sendmail(req) { const file = { filename: pdfName || 'exported.pdf', content: process.env.SMTP_ENABLE ? PdfBuffer : undefined, //fs.readFileSync('./exports/exported_file_1223.pdf'), - data: process.env.SMTP_ENABLE ? undefined : PdfBuffer, + data: process.env.SMTP_ENABLE ? undefined : PdfBuffer, }; // const html = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body style='text-align: center;'> <p style='font-weight: bolder; font-size: large;'>Hello!</p> <p>This is a html checking mail</p><p><button style='background-color: lightskyblue; cursor: pointer; border-radius: 5px; padding: 10px; border-style: solid; border-width: 2px; text-decoration: none; font-weight: bolder; color:blue'>Verify email</button></p></body></html>" const from = req.params.from || ''; + const mailsender = process.env.SMTP_ENABLE + ? process.env.SMTP_USER_EMAIL + : process.env.MAILGUN_SENDER; const messageParams = { - from: - from + ' <' + process.env.SMTP_ENABLE - ? process.env.SMTP_USER_EMAIL - : process.env.MAILGUN_SENDER + '>', + from: from + ' <' + mailsender + '>', to: req.params.recipient, subject: req.params.subject, text: req.params.text || 'mail', html: req.params.html || '', - attachments: process.env.SMTP_ENABLE ? [file] : undefined, - attachment: process.env.SMTP_ENABLE ? undefined : file, + attachments: process.env.SMTP_ENABLE ? [file] : undefined, + attachment: process.env.SMTP_ENABLE ? undefined : file, }; - if (transporterSMTP) { const res = await transporterSMTP.sendMail(messageParams); - console.log('Res ', res); if (!res.err) { return { @@ -96,11 +94,12 @@ async function sendmail(req) { } } else { const from = req.params.from || ''; + const mailsender = process.env.SMTP_ENABLE + ? process.env.SMTP_USER_EMAIL + : process.env.MAILGUN_SENDER; + const messageParams = { - from: - from + ' <' + process.env.SMTP_ENABLE - ? process.env.SMTP_USER_EMAIL - : process.env.MAILGUN_SENDER + '>', + from: from + ' <' + mailsender + '>', to: req.params.recipient, subject: req.params.subject, text: req.params.text || 'mail', @@ -109,7 +108,6 @@ async function sendmail(req) { if (transporterSMTP) { const res = await transporterSMTP.sendMail(messageParams); - console.log('Res ', res); if (!res.err) { return {