From db4494c463a8bc9756576ba096a22249abb980e9 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 9 Nov 2023 17:08:57 +0530 Subject: [PATCH 01/35] 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/35] 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/35] 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 dead3088d6476280fe57208424bb72e0cd50edc5 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Thu, 16 Nov 2023 11:02:38 +0530 Subject: [PATCH 04/35] security improvement (#190) --- apps/OpenSign/src/components/LoginFacebook.js | 12 ++-- apps/OpenSign/src/components/LoginGoogle.js | 8 ++- apps/OpenSign/src/routes/Login.js | 72 ++++++++----------- apps/OpenSign/src/routes/Pgsignup.js | 12 +--- apps/OpenSign/src/routes/Signup.js | 5 +- apps/OpenSignServer/cloud/main.js | 2 + .../cloud/parsefunction/ZohoDetails.js | 2 +- .../cloud/parsefunction/getUserDetails.js | 12 ++++ .../20231110174122-create_setclp.cjs | 60 ++++++++++++++++ apps/OpenSignServer/index.js | 22 +++++- apps/OpenSignServer/runmigrate.js | 37 ++++++++++ .../default-data/legadraGCva.w_dashboard.json | 2 +- 12 files changed, 177 insertions(+), 69 deletions(-) create mode 100644 apps/OpenSignServer/cloud/parsefunction/getUserDetails.js create mode 100644 apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs create mode 100644 apps/OpenSignServer/runmigrate.js diff --git a/apps/OpenSign/src/components/LoginFacebook.js b/apps/OpenSign/src/components/LoginFacebook.js index e6b77eed3..442fcb3e7 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("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 5fbf3309c..7e00b8e8c 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("getUserDetails", 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 6da17e83c..25ea70907 100644 --- a/apps/OpenSign/src/routes/Login.js +++ b/apps/OpenSign/src/routes/Login.js @@ -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 @@ -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 @@ -716,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..c47adbfcf 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("getUserDetails", 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 d688eaacc..280e5f9a3 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("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 45cc0efae..2facd600c 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 getUserDetails from './parsefunction/getUserDetails.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('getUserDetails', getUserDetails); 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/cloud/parsefunction/getUserDetails.js b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js new file mode 100644 index 000000000..970d50f22 --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js @@ -0,0 +1,12 @@ +async function getUserDetails(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 getUserDetails; 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 13814d3cc..14ca95558 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -17,11 +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 { createTransport } from 'nodemailer'; +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, @@ -184,4 +184,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}`); +// }); 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 2b67af609755a26d9738f70329f718ceef112f6e Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 16 Nov 2023 11:09:56 +0530 Subject: [PATCH 05/35] 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 06/35] 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 a20ebbf08f5d07fcf5c722314579e2ed7a7b0f3d Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Thu, 16 Nov 2023 11:19:34 +0530 Subject: [PATCH 07/35] change in in class level permission of contracts_User class (#192) --- .../migrations/20231110174122-create_setclp.cjs | 11 +++++------ apps/OpenSignServer/index.js | 11 ++++++----- 2 files changed, 11 insertions(+), 11 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', { 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 6bee566d8db03f8a8cb5e695f7ae1b0ee02ec89f Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Thu, 16 Nov 2023 19:25:57 +0530 Subject: [PATCH 08/35] fix: sendmail cloud function is not working (#194) --- apps/OpenSignServer/cloud/parsefunction/sendMail.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/OpenSignServer/cloud/parsefunction/sendMail.js b/apps/OpenSignServer/cloud/parsefunction/sendMail.js index 3465332c1..fb964e28f 100644 --- a/apps/OpenSignServer/cloud/parsefunction/sendMail.js +++ b/apps/OpenSignServer/cloud/parsefunction/sendMail.js @@ -6,7 +6,7 @@ import { createTransport } from 'nodemailer'; let transporterSMTP; let mailgunClient; - +let mailgunDomain; if (process.env.SMTP_ENABLE) { transporterSMTP = createTransport({ host: process.env.SMTP_HOST, @@ -23,6 +23,7 @@ if (process.env.SMTP_ENABLE) { username: 'api', key: process.env.MAILGUN_API_KEY, }); + mailgunDomain = process.env.MAILGUN_DOMAIN; } async function sendmail(req) { From 939a67b2c5e6da3510afcfdc402403419ac91707 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Fri, 17 Nov 2023 14:03:33 +0530 Subject: [PATCH 09/35] fix: resolve user not able to login/signup (#195) --- apps/OpenSign/src/components/TreeWidget.js | 33 +++++----- .../src/components/dashboard/DashboardCard.js | 45 +++++++------- .../src/components/fields/HiddenField.js | 59 +++++++++++------- .../src/components/fields/Level1Dropdown.js | 12 ++-- apps/OpenSign/src/layout/HomeLayout.js | 21 ++----- apps/OpenSign/src/redux/actions/index.js | 20 +++--- apps/OpenSign/src/routes/Login.js | 62 ++++++++++++------- apps/OpenSign/src/routes/Pgsignup.js | 16 +++-- apps/OpenSign/src/routes/Signup.js | 24 +++---- .../cloud/parsefunction/getUserDetails.js | 2 + 10 files changed, 150 insertions(+), 144 deletions(-) diff --git a/apps/OpenSign/src/components/TreeWidget.js b/apps/OpenSign/src/components/TreeWidget.js index 24aa61689..b028ffb62 100644 --- a/apps/OpenSign/src/components/TreeWidget.js +++ b/apps/OpenSign/src/components/TreeWidget.js @@ -49,12 +49,9 @@ const TreeWidget = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - var emp = Parse.Object.extend( - localStorage.getItem("extended_class") - ); - var q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - res = await q.first(); + res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); if (res) res = res.toJSON(); } if (res) { @@ -79,12 +76,9 @@ const TreeWidget = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - emp = Parse.Object.extend( - localStorage.getItem("extended_class") - ); - q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - res = await q.first(); + res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); if (res) res = res.toJSON(); } @@ -121,10 +115,15 @@ const TreeWidget = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - emp = Parse.Object.extend(localStorage.getItem("extended_class")); - q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - res = await q.first(); + // emp = Parse.Object.extend(localStorage.getItem("extended_class")); + // q = new Parse.Query(emp); + // q.equalTo("UserId", currentUser); + // res = await q.first(); + // if (res) res = res.toJSON(); + const currentUser = Parse.User.current(); + res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); if (res) res = res.toJSON(); } @@ -532,7 +531,7 @@ const TreeWidget = (props) => { padding: 0 }, overlay: { - width:"100%", + width: "100%", backgroundColor: "rgba(0, 0, 0, 0.75)", zIndex: 50 } diff --git a/apps/OpenSign/src/components/dashboard/DashboardCard.js b/apps/OpenSign/src/components/dashboard/DashboardCard.js index c51f7ba42..0c432c4e1 100644 --- a/apps/OpenSign/src/components/dashboard/DashboardCard.js +++ b/apps/OpenSign/src/components/dashboard/DashboardCard.js @@ -35,14 +35,9 @@ const DashboardCard = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - var emp = Parse.Object.extend(localStorage.getItem("extended_class")); - var q = new Parse.Query(emp); - q.equalTo("UserId", { - __type: "Pointer", - className: "_User", - objectId: currentUser + res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") }); - res = await q.first(); if (res) res = res.toJSON(); } if (res) { @@ -110,13 +105,17 @@ const DashboardCard = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); resr = data[0]; } else { - let emp = Parse.Object.extend( - localStorage.getItem("extended_class") - ); - let q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - let t = await q.first(); - resr = t.toJSON(); + // let emp = Parse.Object.extend( + // localStorage.getItem("extended_class") + // ); + // let q = new Parse.Query(emp); + // q.equalTo("UserId", currentUser); + // let t = await q.first(); + // resr = t.toJSON(); + resr = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); + if (resr) resr = resr.toJSON(); } let json = resr; @@ -227,13 +226,17 @@ const DashboardCard = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - var emp = Parse.Object.extend( - localStorage.getItem("extended_class") - ); - var q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - let resr = await q.first(); - res = resr.toJSON(); + // var emp = Parse.Object.extend( + // localStorage.getItem("extended_class") + // ); + // var q = new Parse.Query(emp); + // q.equalTo("UserId", currentUser); + // let resr = await q.first(); + // res = resr.toJSON(); + let resr = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); + if (res) res = resr.toJSON(); } let json = res; diff --git a/apps/OpenSign/src/components/fields/HiddenField.js b/apps/OpenSign/src/components/fields/HiddenField.js index 20b16d453..09d582ed4 100644 --- a/apps/OpenSign/src/components/fields/HiddenField.js +++ b/apps/OpenSign/src/components/fields/HiddenField.js @@ -1,6 +1,6 @@ import React, { Component } from "react"; import Parse from "parse"; -import axios from "axios"; +// import axios from "axios"; export class HiddenField extends Component { state = { @@ -37,31 +37,46 @@ export class HiddenField extends Component { this.setState({ _fields: custome_Filed }); } else { if (currentUser) { - let url = `${this.state.baseUrl}classes/${localStorage.getItem( - "extended_class" - )}?where={"UserId":{"__type":"Pointer","className":"_User","objectId":"${ - currentUser.id - }"}}&keys=${this.props.schema.data.valueKey}`; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": this.state.parseAppId - }; - await axios.get(url, { headers: headers }).then((res) => { - let custome_Filed = ""; - let _rdata = res.data.results; - let splitArray = this.props.schema.data.valueKey.split("."); - if (splitArray.length > 1) { - custome_Filed = _rdata[0][splitArray[0]][splitArray[1]]; - } else { - console.log(_rdata[0][splitArray[0]]); - custome_Filed = _rdata[0][splitArray[0]]; - } - this.setState({ _fields: custome_Filed }); + // let url = `${this.state.baseUrl}classes/${localStorage.getItem( + // "extended_class" + // )}?where={"UserId":{"__type":"Pointer","className":"_User","objectId":"${ + // currentUser.id + // }"}}&keys=${this.props.schema.data.valueKey}`; + // const headers = { + // "Content-Type": "application/json", + // "X-Parse-Application-Id": this.state.parseAppId + // }; + // await axios.get(url, { headers: headers }).then((res) => { + // let custome_Filed = ""; + // let _rdata = res.data.results; + // let splitArray = this.props.schema.data.valueKey.split("."); + // if (splitArray.length > 1) { + // custome_Filed = _rdata[0][splitArray[0]][splitArray[1]]; + // } else { + // console.log(_rdata[0][splitArray[0]]); + // custome_Filed = _rdata[0][splitArray[0]]; + // } + // this.setState({ _fields: custome_Filed }); + // }); + + const res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") }); + let custome_Filed = ""; + const result = res.toJSON(); + let _rdata = [result]; + let splitArray = this.props.schema.data.valueKey.split("."); + if (splitArray.length > 1) { + custome_Filed = _rdata[0][splitArray[0]][splitArray[1]]; + } else { + console.log(_rdata[0][splitArray[0]]); + custome_Filed = _rdata[0][splitArray[0]]; + } + this.setState({ _fields: custome_Filed }); } } } catch (error) { - console.log('err', error) + console.log("err", error); } } }; diff --git a/apps/OpenSign/src/components/fields/Level1Dropdown.js b/apps/OpenSign/src/components/fields/Level1Dropdown.js index 1b25c33fb..42228a6f6 100644 --- a/apps/OpenSign/src/components/fields/Level1Dropdown.js +++ b/apps/OpenSign/src/components/fields/Level1Dropdown.js @@ -120,12 +120,10 @@ const Level1Dropdown = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - var emp = Parse.Object.extend( - localStorage.getItem("extended_class") - ); - var q = new Parse.Query(emp); - q.equalTo("UserId", currentUser); - res = await q.first(); + const currentUser = Parse.User.current(); + res = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); if (res) res = res.toJSON(); } @@ -339,7 +337,7 @@ const Level1Dropdown = (props) => { x.className = x.className.replace("show", ""); }, 5000); } catch (error) { - console.log("Err", error) + console.log("Err", error); } } }; diff --git a/apps/OpenSign/src/layout/HomeLayout.js b/apps/OpenSign/src/layout/HomeLayout.js index eaa479716..f2df02822 100644 --- a/apps/OpenSign/src/layout/HomeLayout.js +++ b/apps/OpenSign/src/layout/HomeLayout.js @@ -6,7 +6,7 @@ import { useWindowSize } from "../hook/useWindowSize"; import Tour from "reactour"; import axios from "axios"; import { useSelector } from "react-redux"; - +import Parse from "parse"; const HomeLayout = ({ children }) => { const { width } = useWindowSize(); const [isOpen, setIsOpen] = useState(false); @@ -124,20 +124,11 @@ const HomeLayout = ({ children }) => { }; async function checkTourStatus() { - const serverUrl = localStorage.getItem("baseUrl"); - const appId = localStorage.getItem("AppID12"); - const extUserClass = localStorage.getItem("extended_class"); - const json = JSON.parse(localStorage.getItem("Extand_Class")); - const extUserId = json && json.length > 0 && json[0].objectId; - // console.log("extUserId ", extUserId); - const res = await axios.get( - serverUrl + "classes/" + extUserClass + "/" + extUserId, - { - headers: { - "X-Parse-Application-Id": appId - } - } - ); + const currentUser = Parse.User.current(); + const cloudRes = await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }); + const res = { data: cloudRes.toJSON() }; if (res.data && res.data.TourStatus && res.data.TourStatus.length > 0) { const tourStatus = res.data.TourStatus; // console.log("res ", res.data.TourStatus); diff --git a/apps/OpenSign/src/redux/actions/index.js b/apps/OpenSign/src/redux/actions/index.js index b0aab4247..afec8161d 100644 --- a/apps/OpenSign/src/redux/actions/index.js +++ b/apps/OpenSign/src/redux/actions/index.js @@ -11,7 +11,8 @@ export const fetchAppInfo = (str, burl, app_id) => async (dispatch) => { let _base = ""; // Define _base here and initialize it to an empty string if (response && response.baseurl) { _base = response.baseurl.charAt(response.baseurl.length - 1); - } localStorage.removeItem("baseUrl"); + } + localStorage.removeItem("baseUrl"); localStorage.setItem("_appName", response.appname); localStorage.setItem("_app_objectId", response.objectId); if (_base === "/") { @@ -120,16 +121,11 @@ export const login = (username, password) => async (dispatch) => { localStorage.setItem("_user_role", _role); } try { - const tour = Parse.Object.extend( - localStorage.getItem("extended_class") - ); - let _tour = new Parse.Query(tour); - _tour.equalTo("UserId", { - __type: "Pointer", - className: "_User", - objectId: resultjson.objectId - }); - await _tour.first().then( + const currentUser = Parse.User.current(); + await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }) + .then( (results) => { let userinfo = results.toJSON(); if (userinfo.TenantId) { @@ -142,7 +138,7 @@ export const login = (username, password) => async (dispatch) => { } ); } catch (error) { - console.log("err ", error) + console.log("err ", error); } } }); diff --git a/apps/OpenSign/src/routes/Login.js b/apps/OpenSign/src/routes/Login.js index 25ea70907..35d93185a 100644 --- a/apps/OpenSign/src/routes/Login.js +++ b/apps/OpenSign/src/routes/Login.js @@ -162,15 +162,13 @@ function Login(props) { element.userpointer ); - const extendedClass = Parse.Object.extend( - element.extended_class - ); - let query = new Parse.Query(extendedClass); - query.equalTo("UserId", Parse.User.current()); - query.include("TenantId"); - await query.find().then( - (results) => { + const currentUser = Parse.User.current(); + await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }).then( + (result) => { let tenentInfo = []; + const results = [result]; if (results) { let extendedInfo_stringify = JSON.stringify(results); @@ -280,10 +278,14 @@ function Login(props) { `/${element.pageType}/${element.pageId}` ); } else { - navigate(`/subscription`); + navigate(`/subscription`, { + replace: true + }); } } else { - navigate(`/subscription`); + navigate(`/subscription`, { + replace: true + }); } } else { navigate( @@ -320,7 +322,9 @@ function Login(props) { ); const billingDate = ""; if (billingDate) { - navigate(`/subscription`); + navigate(`/subscription`, { + replace: true + }); } } else { navigate( @@ -586,10 +590,12 @@ function Login(props) { `/${element.pageType}/${element.pageId}` ); } else { - navigate(`/subscription`); + navigate(`/subscription`, { + replace: true + }); } } else { - navigate(`/subscription`); + navigate(`/subscription`, { replace: true }); } } } @@ -610,10 +616,10 @@ function Login(props) { `/${element.pageType}/${element.pageId}` ); } else { - navigate(`/subscription`); + navigate(`/subscription`, { replace: true }); } } else { - navigate(`/subscription`); + navigate(`/subscription`, { replace: true }); } } } @@ -750,15 +756,21 @@ function Login(props) { element.extended_class ); - const extendedClass = Parse.Object.extend( - element.extended_class - ); - let query = new Parse.Query(extendedClass); - query.equalTo("UserId", Parse.User.current()); - query.include("TenantId"); - await query.find().then( - (results) => { + // const extendedClass = Parse.Object.extend( + // element.extended_class + // ); + // let query = new Parse.Query(extendedClass); + // query.equalTo("UserId", Parse.User.current()); + // query.include("TenantId"); + // await query.find() + + const currentUser = Parse.User.current(); + await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }).then( + (result) => { let tenentInfo = []; + const results = [result]; if (results) { let extendedInfo_stringify = JSON.stringify(results); let extendedInfo = JSON.parse(extendedInfo_stringify); @@ -1154,7 +1166,9 @@ function Login(props) {
-
Additional Info
+
+ Additional Info +
diff --git a/apps/OpenSign/src/routes/Pgsignup.js b/apps/OpenSign/src/routes/Pgsignup.js index c47adbfcf..75a34c253 100644 --- a/apps/OpenSign/src/routes/Pgsignup.js +++ b/apps/OpenSign/src/routes/Pgsignup.js @@ -285,14 +285,12 @@ const PgSignUp = (props) => { ); localStorage.setItem("userpointer", element.userpointer); - const extendedClass = Parse.Object.extend( - element.extended_class - ); - let query = new Parse.Query(extendedClass); - query.equalTo("UserId", Parse.User.current()); - query.include("TenantId"); - await query.find().then( - (results) => { + const currentUser = Parse.User.current(); + await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }).then( + (result) => { + const results = [result]; let tenentInfo = []; if (results) { let extendedInfo_stringify = @@ -407,7 +405,7 @@ const PgSignUp = (props) => { } }) .catch((err) => { - console.log('err', err) + console.log("err", err); setIsLoader(false); }); } diff --git a/apps/OpenSign/src/routes/Signup.js b/apps/OpenSign/src/routes/Signup.js index 280e5f9a3..3ae28e34c 100644 --- a/apps/OpenSign/src/routes/Signup.js +++ b/apps/OpenSign/src/routes/Signup.js @@ -207,13 +207,6 @@ const Signup = (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", @@ -221,15 +214,12 @@ const Signup = (props) => { ); localStorage.setItem("userpointer", element.userpointer); - const extendedClass = Parse.Object.extend( - element.extended_class - ); - let query = new Parse.Query(extendedClass); - query.equalTo("UserId", Parse.User.current()); - query.include("TenantId"); - await query.find().then( - (results) => { + await Parse.Cloud.run("getUserDetails", { + email: email + }).then( + (result) => { let tenentInfo = []; + const results = [result]; if (results) { let extendedInfo_stringify = JSON.stringify(results); @@ -317,7 +307,7 @@ const Signup = (props) => { ); setState({ loading: false }); if (process.env.REACT_APP_ENABLE_SUBSCRIPTION) { - navigate("/subscription"); + navigate(`/subscription`, { replace: true }); } else { alert("Registered user successfully"); navigate( @@ -335,7 +325,7 @@ const Signup = (props) => { localStorage.setItem("pageType", element.pageType); setState({ loading: false }); if (process.env.REACT_APP_ENABLE_SUBSCRIPTION) { - navigate("/subscription"); + navigate(`/subscription`, { replace: true }); } else { navigate( `/${element.pageType}/${element.pageId}` diff --git a/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js index 970d50f22..2e50b25a8 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js +++ b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js @@ -2,6 +2,8 @@ async function getUserDetails(request) { try { const userQuery = new Parse.Query('contracts_Users'); userQuery.equalTo('Email', request.params.email); + userQuery.include('TenantId'); + userQuery.include('UserId') const res = await userQuery.first({ useMasterKey: true }); return res; } catch (err) { 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 10/35] #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 823e6a9e2fa21b3655b4a7d17116bb6c64d79f87 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Fri, 17 Nov 2023 15:39:18 +0530 Subject: [PATCH 11/35] update schema of contracts_users (#196) --- .../20231110174122-create_setclp.cjs | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs b/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs index 786c506af..8db57d426 100644 --- a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs +++ b/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs @@ -4,23 +4,23 @@ */ exports.up = async Parse => { // TODO: set className here - const className = 'Contracts_Users'; + 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.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: {}, @@ -31,7 +31,7 @@ exports.up = async Parse => { addField: {}, }); - return schema.save(); + return schema.update(); // const config = new Config(process.env.APP_ID, process.env.PARSE_MOUNT); // const schema = await config.database.loadSchema(); @@ -52,7 +52,7 @@ exports.up = async Parse => { */ exports.down = async Parse => { // TODO: set className here - const className = 'Contracts_Users'; + const className = 'contracts_Users'; const schema = new Parse.Schema(className); return schema.purge().then(() => schema.delete()); From 4a3276f4e3768b38e8bf7caacea02abf788c1778 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 Nov 2023 18:07:26 +0530 Subject: [PATCH 12/35] 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 13/35] 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 3cfa2639e5899584e0f89642dca2549778f398fb Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Fri, 17 Nov 2023 18:29:41 +0530 Subject: [PATCH 14/35] migrate db changes (#199) --- .../cloud/parsefunction/pdf/PDF.min.js | 4 +-- ...p.cjs => 20231110174122-update_setclp.cjs} | 12 ------- .../OpenSignServer/databases/seeders/.gitkeep | 0 apps/OpenSignServer/index.js | 31 +++++++++---------- 4 files changed, 16 insertions(+), 31 deletions(-) rename apps/OpenSignServer/databases/migrations/{20231110174122-create_setclp.cjs => 20231110174122-update_setclp.cjs} (70%) 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-update_setclp.cjs similarity index 70% rename from apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs rename to apps/OpenSignServer/databases/migrations/20231110174122-update_setclp.cjs index 8db57d426..83f059ef1 100644 --- a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs +++ b/apps/OpenSignServer/databases/migrations/20231110174122-update_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 11d3e6c696b9710821f7c1a98e556f7393050411 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 Nov 2023 19:36:11 +0530 Subject: [PATCH 15/35] 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 47bb4cac3879a20ab611141c509478398686e9be Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Fri, 17 Nov 2023 19:37:44 +0530 Subject: [PATCH 16/35] migration db changes (#200) --- 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 17/35] 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 bda31de3455d4c7171de0162ac5f7d8910ddf7c2 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <93375423+prafull-opensignlabs@users.noreply.github.com> Date: Fri, 17 Nov 2023 20:12:51 +0530 Subject: [PATCH 18/35] add parse-dbtool package (#201) --- 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 83ce3a1c21cba7020f82f10e3f569e9aa33af6ca Mon Sep 17 00:00:00 2001 From: nxglabs Date: Sat, 18 Nov 2023 01:52:20 +0530 Subject: [PATCH 19/35] update local cert setup --- .env.local_dev | 123 ++++++++++++++++++-------------------- cert/local-dev_base64_pfx | 109 +++++++++++++++++---------------- cert/local_dev.crt | 40 +++++++------ cert/local_dev.key | 60 +++++++++---------- cert/local_dev.pfx | Bin 2611 -> 2573 bytes 5 files changed, 163 insertions(+), 169 deletions(-) diff --git a/.env.local_dev b/.env.local_dev index 807d61ec0..7884fb0b9 100644 --- a/.env.local_dev +++ b/.env.local_dev @@ -42,75 +42,68 @@ DO_SECRET_ACCESS_KEY= # Digital ocean spaces region or AWS s3 region DO_REGION=us-west # local storage -USE_LOCAL=FALSE +USE_LOCAL=TRUE -# Email using Mailgun or SMTP if set enable config (The app will not initialize if any of these variables are not set) ********************************************************************************************************************* -MAILGUN_API_KEY= +# Email mailgun config (The app will not initialize if any of these 3 variables are not set) ********************************************************************************************************************* +MAILGUN_API_KEY=XXXXX MAILGUN_DOMAIN=mail.yourdomain.com MAILGUN_SENDER=postmaster@mail.yourdomain.com -SMTP_ENABLE= -SMTP_HOST= -SMTP_PORT= -SMTP_USER_EMAIL= -SMTP_PASS= - # Base64 encoded PFX or p12 document signing certificate file ********************************************************************************************************************* -PFX_BASE64='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 -c6yryFgECIld0S5kDk7JAgIIAA==' +PFX_BASE64='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' # Provide Pass pharse of above PFX or p12 document -PASS_PHRASE= \ No newline at end of file +PASS_PHRASE=opensign diff --git a/cert/local-dev_base64_pfx b/cert/local-dev_base64_pfx index 85e11a24d..fba113ca1 100644 --- a/cert/local-dev_base64_pfx +++ b/cert/local-dev_base64_pfx @@ -1,55 +1,54 @@ -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 -c6yryFgECIld0S5kDk7JAgIIAA== +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 diff --git a/cert/local_dev.crt b/cert/local_dev.crt index b04e8924b..7137d99fc 100644 --- a/cert/local_dev.crt +++ b/cert/local_dev.crt @@ -1,21 +1,23 @@ -----BEGIN CERTIFICATE----- -MIIDXTCCAkWgAwIBAgIUdpdDPiNqilWn26oMvcpT9qmMtoswDQYJKoZIhvcNAQEL -BQAwPjELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAk5JMQowCAYDVQQHDAFOMQowCAYD -VQQKDAFTMQowCAYDVQQLDAFTMB4XDTIzMTEwNTEzMDg1OFoXDTI0MTEwNDEzMDg1 -OFowPjELMAkGA1UEBhMCSU4xCzAJBgNVBAgMAk5JMQowCAYDVQQHDAFOMQowCAYD -VQQKDAFTMQowCAYDVQQLDAFTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAzT30t7Adb6XdXWywzC4RF03r3piTt5MF4MZClvorsl8bySNKrYkl7i5+igpz -36SfLp090Dal0cUZ7it9QCxaxrWv3m8OFAwfwK5ePuzUryF6/QJcoF560Sq4k3Pb -640PJ5UlFwvUqsXQN8A/pAA6S96MqpwCrPQE0u5OcRQuVIsZxBL2s17lv5eROjX+ -Ufx/6qtmuZscn9xKDP6GNO8aa6X0YZMoVXlll14iEn4bg0yagiY7QhvVCzK8q7nB -9yKCLvw/28eSoD08yJnHnUZnIOoNrn+cZKTkl8VcyKW55IeOiUilb5h3a07JD6bj -Q/VroPQE5UtveajB9CBa3eUCiwIDAQABo1MwUTAdBgNVHQ4EFgQUIQGrIwhvSNkG -L3ATZra96d4cDE4wHwYDVR0jBBgwFoAUIQGrIwhvSNkGL3ATZra96d4cDE4wDwYD -VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAp2mCfhRf6Jft6lSgL4hi -I8xHfqcUjG+XnDM1Pi7gKVxxclwVQ67vVtfO0rU1SBPWUO3nIaaLN9Wyzcx+LXPV -4e3pyHlq2T6Z6ENuozOsMhHeY9+ows6wPBcxq57KLLHnBpx3lJiKHKOp0ueiAbkz -LaI+Mm+VQo0MbzhCw7KXs8VPFt8YO+S3XircVMWaa007VgGY/NjYF62hlG35fD/v -CTHccRj5Y3coQ2MjosTUQTd4u3N5VhgxdRbyMdpjpwDxu0u9BE7ISXKMBhnBLV/w -+/mxoF2bqExBuPiZS8vT6yW9rehdi/KR9c26GUreTsKLtjXyveeP6VLoTJ60T3D9 -Jg== +MIIDxTCCAq2gAwIBAgIUAZQ9QST2eBZz5k9pCa//mHQVm1QwDQYJKoZIhvcNAQEL +BQAwcjELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQKDA1P +cGVuU2lnbiBMYWJzMREwDwYDVQQDDAhPcGVuU2lnbjElMCMGCSqGSIb3DQEJARYW +aGVsbG9Ab3BlbnNpZ25sYWJzLmNvbTAeFw0yMzExMTcxOTQ0MzZaFw0yNDExMTYx +OTQ0MzZaMHIxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazEWMBQGA1UE +CgwNT3BlblNpZ24gTGFiczERMA8GA1UEAwwIT3BlblNpZ24xJTAjBgkqhkiG9w0B +CQEWFmhlbGxvQG9wZW5zaWdubGFicy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDLRKLjCSrvV1zAY2leWxCvdKTUaThpQO8nWPE/4v5ilMU2aRON +krAnli0LUfQ/tIRWNurxwVjJ7HrW3ICLn05GBLjm2AUCfuMbJCvOEEdmFJqRY04n +12fBZWz2KtzbZEIBVxLhc4E4g+Rz68hQA2fqwNuFdyGkkIbhVXpZIePEppqRmw+2 +uuDvIzJ77rdDaLqwwPoHWenZ2uZTedKXx7PGYs98psg35GvcpssqAJGAIAi9Rzg/ +ZV4oSpGXCjn/TJy61zTDbmPFCS/rC1XBWzBQfwDeBPDI18W6gPVX6N4dp0Ao+n8Q +txeI6g4FzMH91KPbdbZXxm8rZqXj87VQs9trAgMBAAGjUzBRMB0GA1UdDgQWBBRN +NtRPagnqovdmbrdhSUON9Rwd3TAfBgNVHSMEGDAWgBRNNtRPagnqovdmbrdhSUON +9Rwd3TAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBrcPyA7GHq ++ol9qjy9HijpoU5MaEiV9v9H8/0v7KoXUND3rMl37yFyjxGN8uda8WxpEhE2eFnk +Xjtm2NgPrv8qeYHor/A3y5RfQhnlCY4kE1bREZGhcuKihR4rOtmComwFjx4Ibwwj +4nKsflj6rXcWKSfSNHLkXFXHPYwyqRsKdtClrD/8YJn6LeeMlMjIYGGP4qyi2WwS +Z8hExWGEMaMWiA9rxTMX6iu/parGH/pWU/55Os3WlcHPhlvqchBkQFJ+f8b+NYz0 +vIHQgwn4K5WMsZVLxoiUcU7cSqE/qhnP+pzBf8lRaYwd+zUznDvzpKKz6nFgeHok +s8BK7JAKkIsl -----END CERTIFICATE----- diff --git a/cert/local_dev.key b/cert/local_dev.key index 9b8949775..034959f76 100644 --- a/cert/local_dev.key +++ b/cert/local_dev.key @@ -1,30 +1,30 @@ ------BEGIN ENCRYPTED PRIVATE KEY----- -MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIJvntFBuTIWACAggA -MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECEE+1CDDu5XvBIIEyEwR/61HhjJ0 -P6oGr1E+uDTKVcUqK++fbsrhqxYq+oEoj+w5C1KOgUxQYQTm2he6PhfGkPh56V9w -OaArJ+QrGrSFRUdTtLZG+qBbfyWKQyah9VxwYhmG9Ptf6RyQXDJnup4WtgJWI2sw -fAcJ6QqPQkSFUq/0cn0s/RLNCy6P8qKfUjdVugEv0K9dsc7dFNWZQEQlpyKeZdbY -rJfKjf85qSmDpFfRnP1B0n//vzlPWK03fNH2be4EnBTFW7l1sDnju6iwasLSP7P+ -EuGq8Bw9YGlf3I/STWGgfxWWLZACCjgVDiRjLakstkodLqC1tZAWawOKcDQGPyKG -nRrF/yF4H0ChmcMBA9Ur4zxBd4uayWujwqIPehfWU+ODYYaVDluSVrxiTaSHGAP2 -XnT6vrOnR5sg/uzgsbuApHTbHCW+lplof/R0swvwyt15fKaD8HsngNMN6R75e0ar -6+ltI/BLgcSbu0f7Fe8qMumBNrJiU5j09EdvDKaIEe3+Ko2HWCV/zLgxvL8BwGyB -K9RSMw1YzivO/CahWE3cQcS4GQSX84+y8VXF43CxpmTRf3Hmdpj4JBGB0fOvGHzA -hv+st5E+hhSOOv2ZZ00XtEaUi3d2uQFYApxEoXubz2QG481M7ulNXaVd74DZf/Fr -J+R7BmCa633rEw34sXFKUcfdfVOzUfMnMGvO5danSrov6k/cFfLPH56ORb9Ep30a -U1fXHP+pcFQohR/kjAk5gjDUr8pjkOJ0/JHv106rptT4SNCznvJa8BvWtP9wDXDv -UZDA/UCLlnl20mJUjLtb0iM5vtqhi7XOxDoS8AauOimSEh+M0uLEZ7HOQvtGchLl -tDLd/DVew/WzPBhL4eNTmhwwno9JL21nPBEaFAa58djoiZXgzUdLQbBDbo/7nsRA -UJ9imt0HmhDU+xrimnMZJD051KcbohHjPvTnTb4qvd0Rt7u/dpL9NT07rQlVIe3u -qGl4sEe+1vEueRdHt5QCSGbxnwPPHdE9XMsK8et3M/DOYN+ToB9QmDm72lLsJNkm -0nxdYVpfXHUiPmMorkJgb9YXfY+j0UEWuT0l4bl7a5+mzGm/Zy9FCoLaW7MTWNJd -fyDSYsVotOhRdCBi0Osho21GldKmfX6XoqHYENVqsh7x9bgvjNwvLNgpCWXYh7/Q -K6N3iDQ3G3A6x9nOgeKpXYREd8fx8byM6u7FAttVTtcV71QaWU3TSn7Oice1Bklg -osIhUJydHny856D/WCD6EmnPBuukx9Tht8NKtJVS0XoXqbz69mx4xfq987HGkJJa -nvCgkZOr/LhcVylmRjg9ZVfiUrwim4Gp42gV3JtsZpOGE1m+1twSXShtr/PQ2FdF -jD41LOEG1OGdZ5XIDLxAI4085jwVD/WIRo/AZELENog1XKtjeXSqJ/H7njauB30w -MeNv0VRTIItVA0eXRDwoqjpqyGSdn9YF2SQ/qDR6WU+Y2bVD38m6ZJlsy/zHx9uc -sH1DK7hbbRRSuZ9Sx/TjD19DWJ4qNPTpUZTd0+dxsG/HGQKpkbpXI5f3aQ6nTWWM -MjlWF6mUI06iLIRhLyNwBrtEjJHL1k8fIOvO/MUKtj72VBGt/fnoutS0WifZLvfn -mFXB4iaMX0hGcgzpK4iNcg== ------END ENCRYPTED PRIVATE KEY----- +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,5932FA9F02938D1B + +6gkkZP80WrVnR3dVwkimtfirSeYNXZlrXXBv+Ddjyq7FScqca7svJFd8ObC0xXjg +nbxChDKS8SXcSjsNCTzixG0QReO5vaqovrpQoYbkSQ9GRMIVV8WuWNzlyMnypNJ4 +Z6hdpd5nkc1hIP8A6WcY3lA8msyHceU9IidEEb75CE743qsvUMko+XvqntZx/LNe +0uK8Bs+cXeDzolpNX8ORKBTAOMii+WPlN2l+9ldsWTECEk4GmWa51QfpKouLxz5E +u7fuGuku/nPKGb4Yj7sCgaD91UabRksDLS9UGDBqeNL+mogG3gY/Iu0/q2cUs6XR +x1W6KW1eJHnOf1pAp7+G/zNqzdsxI3pnoR+nsV6/G0glBLar+Xqc99B568lnUWWv +5NGN3Buz1axx1jPKIknDcT4Skmvt6TcmgrjoCQ9XvmNKVClpExQ+dKPmJI/EVNoU +jjDZyfghcJ6BEMcTgoOBDiUrPM0273sb89u/AzyUA1tTciW2KARz6cOUTPWVRSRn +4yXpkA4BJDpxRmK68BXorZLNxtvHk+on80c9tu5e+IVa3Gu1K7gc269TPmlIolAM +v//i+jpwJ4Pe2IGVYdojMr15useUv7JC6/Kconnkx4q9rkMriguuXoQt8qW3kvEs +Ur8KuibtDqhz2zGbsKboQFMOd6cdd+63dJCGAUqk4hFrSikTw3LhkXNcg9GZHq1z +WFAfaA3x2jd+kJJ5xg8xMVEHax5IAOXDL2ektyPFpI1UZOuTc2i7FK6Y0NnXPkSN +G/+DsKdLWT943mPfZj01mTRi3MgseDXsHMHGmmPxW9J4jv+WW4OdpHvd474QzJ8b +vQmyiKq4XPHsuQUkzHVPbTrGe1B9z4p97YQKdEfXP2ChGFsUHCYQdpHyXwie2+pq +E2rc7Bai0OuL0anYMSIvDrJ0DE8mVVaFur1b2Uz6ieCDlrOXnzD1BrcleiZem7og +on/3oCUK+qxibCCcd5Hg2HtPusa43U0/UbCrqb2sww9iN36DLdtef/jlozKNiBx9 +e8ZztF6GtAKhIdgGW/M9TXMUZOYr7aaXO71MsqhwpVWZ5dNqagOBzhmd7Etokf1H +O0WxJZ5XPDsnlKwYq86ssK+2RCNYAuvZoM3dRCysPvXoBFmsmHDzKdbKcckd8Vxr +6P1yaCkB/iX55dUqwKfIuqxY3m4MA2Us9DD0BRxZOSUqHhzHHSogsLhqLQEQENA4 +U9N/v/za81UaU8nfkAswsGlTdTKjWH6Fzc0NeagbEFtpUaG/WIHPesUzU7ZNvMzR +SQACVWl62Dley2g2eAgcrsIn78MbwNJI2YN5eXIw0K2MiMlGXWOEvkjIIVfjc0/d +QxLFJwqShZBVO+jnAJ8jti7mP6PgskjtfHNAIphRJ4fm9h/Ns1YMpipBRVBDhbwY +AOVT4bRw9Q3O5I0pe10ZdViAhexegQ8yGt3pUlKaUf9GRwIFEknjZ5Pc98V/R/wC +INSIOZzDHj2uyZ3p7ToF1Z6kVVbbyfqDOnxUiV2ykR8ZqQMXNWcEJKH8qRqI+VHf +oszD2BQvXgkWdrJtHuHjJCdDl03Y+daS5yP8IKTDucHvRv4ZSMghZ34SJTw5MaBP +-----END RSA PRIVATE KEY----- diff --git a/cert/local_dev.pfx b/cert/local_dev.pfx index fecfe55316ab18e467ec99d66d73ebc1f2754021..facc99d5d02baeb5d82654e9b8520f80812bd219 100644 GIT binary patch literal 2573 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 literal 2611 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 EKi6E!1ONa4 From db9268e1afa38269d58e9dc2711cfa0af4033e8f Mon Sep 17 00:00:00 2001 From: rishabjasrotia Date: Sat, 18 Nov 2023 20:21:17 +0530 Subject: [PATCH 20/35] 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 21/35] 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 22/35] 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 23/35] 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 24/35] 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 25/35] 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 26/35] 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 27/35] 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 28/35] 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 29/35] 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 { From 6bb353fd1f9421414bf5427ed3f824b291c0a19a Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Tue, 21 Nov 2023 10:22:16 +0530 Subject: [PATCH 30/35] fix spelling mistake of email message beeen to been after signed by all parties --- apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js index ba3f1ab97..3bbabdad2 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.min.js @@ -79,7 +79,7 @@ async function sendCompletedMail(e) { url: a, from: 'OpenSign™', recipient: e.receiver, - subject: `Document ${s} has beeen signed by all parties`, + subject: `Document ${s} has been signed by all parties`, pdfName: s, html: "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body> <div style='background-color:#f5f5f5;padding:20px'> <div style='box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 12px;background-color:white;'> <div><img src=https://qikinnovation.ams3.digitaloceanspaces.com/logo.png height='50' style='padding:20px'/> </div><div style='padding:2px;font-family:system-ui; background-color: #47a3ad;'> <p style='font-size:20px;font-weight:400;color:white;padding-left:20px',> Document sign successfully</p></div><div><p style='padding:20px;font-family:system-ui;font-size:14px'>All parties have successfully signed the document" + From 2a55c0378815f2ef357e8e6bcc3acf53cd983704 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Tue, 21 Nov 2023 13:36:42 +0530 Subject: [PATCH 31/35] fix no data found on signers login page --- .../SignDocuments/src/Component/PdfRequestFiles.js | 2 +- .../SignDocuments/src/Component/placeHolderSign.js | 2 +- microfrontends/SignDocuments/src/utils/Utils.js | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js b/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js index 9adca6778..bfcfd7cb3 100644 --- a/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js +++ b/microfrontends/SignDocuments/src/Component/PdfRequestFiles.js @@ -1033,7 +1033,7 @@ function PdfRequestFiles() { <Modal.Body> <p className="pTagBody"> - This document has been signed by all Sigers. + This document has been signed by all Signers. </p> </Modal.Body> diff --git a/microfrontends/SignDocuments/src/Component/placeHolderSign.js b/microfrontends/SignDocuments/src/Component/placeHolderSign.js index a9464269a..c7161193b 100644 --- a/microfrontends/SignDocuments/src/Component/placeHolderSign.js +++ b/microfrontends/SignDocuments/src/Component/placeHolderSign.js @@ -231,7 +231,7 @@ function PlaceHolderSign() { setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); } else if (res.length === 0) { - const res = await contactBook(jsonSender.objectId); + const res = await contactBook(jsonSender.objectId, true); if (res[0] && res.length) { setSignerUserId(res[0].objectId); const tourstatus = res[0].TourStatus && res[0].TourStatus; diff --git a/microfrontends/SignDocuments/src/utils/Utils.js b/microfrontends/SignDocuments/src/utils/Utils.js index 9274d9235..9aaeb777a 100644 --- a/microfrontends/SignDocuments/src/utils/Utils.js +++ b/microfrontends/SignDocuments/src/utils/Utils.js @@ -274,12 +274,15 @@ export const contractUsers = async (email) => { }; //function for getting contracts_contactbook details -export const contactBook = async (objectId) => { +export const contactBook = async (objectId, isUser) => { + const condition = isUser + ? `{"UserId": {"__type": "Pointer","className": "_User", "objectId":"${objectId}"}}` + : `{"objectId":"${objectId}"}`; const result = await axios .get( `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( "_appName" - )}_Contactbook?where={"UserId": {"__type": "Pointer","className": "_User", "objectId":"${objectId}"}}`, + )}_Contactbook?where=${condition}`, { headers: { "Content-Type": "application/json", From f7bd439df51d32066e41bd81840a1f019f639c85 Mon Sep 17 00:00:00 2001 From: RaktimaNXG <raktima.c@nxglabs.com> Date: Tue, 21 Nov 2023 14:14:01 +0530 Subject: [PATCH 32/35] remove contracts_contactbook class query from placeholderSign.js --- .../src/Component/placeHolderSign.js | 24 +++++-------------- .../SignDocuments/src/utils/Utils.js | 7 ++---- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/microfrontends/SignDocuments/src/Component/placeHolderSign.js b/microfrontends/SignDocuments/src/Component/placeHolderSign.js index c7161193b..298ee3633 100644 --- a/microfrontends/SignDocuments/src/Component/placeHolderSign.js +++ b/microfrontends/SignDocuments/src/Component/placeHolderSign.js @@ -231,24 +231,12 @@ function PlaceHolderSign() { setHandleError("Error: Something went wrong!"); setIsLoading(loadObj); } else if (res.length === 0) { - const res = await contactBook(jsonSender.objectId, true); - if (res[0] && res.length) { - setSignerUserId(res[0].objectId); - const tourstatus = res[0].TourStatus && res[0].TourStatus; - if (tourstatus && tourstatus.length > 0) { - setTourStatus(tourstatus); - const checkTourRecipients = tourstatus.filter( - (data) => data.placeholder - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].placeholder); - } - } - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); - } + setNoData(true); + + const loadObj = { + isLoad: false + }; + setIsLoading(loadObj); } }; diff --git a/microfrontends/SignDocuments/src/utils/Utils.js b/microfrontends/SignDocuments/src/utils/Utils.js index 9aaeb777a..ecf6d0359 100644 --- a/microfrontends/SignDocuments/src/utils/Utils.js +++ b/microfrontends/SignDocuments/src/utils/Utils.js @@ -274,15 +274,12 @@ export const contractUsers = async (email) => { }; //function for getting contracts_contactbook details -export const contactBook = async (objectId, isUser) => { - const condition = isUser - ? `{"UserId": {"__type": "Pointer","className": "_User", "objectId":"${objectId}"}}` - : `{"objectId":"${objectId}"}`; +export const contactBook = async (objectId) => { const result = await axios .get( `${localStorage.getItem("baseUrl")}classes/${localStorage.getItem( "_appName" - )}_Contactbook?where=${condition}`, + )}_Contactbook?where={"objectId":"${objectId}"}`, { headers: { "Content-Type": "application/json", From 03e660527df5f2bf1dd6953b576e82e7ca32f2bc Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Tue, 21 Nov 2023 15:23:26 +0530 Subject: [PATCH 33/35] security improvement --- apps/OpenSign/src/components/LoginFacebook.js | 3 +- apps/OpenSign/src/components/LoginGoogle.js | 4 +- .../src/components/dashboard/DashboardCard.js | 108 +++--- .../components/dashboard/DashboardReport.js | 79 +++- .../src/components/dashboard/GetDashboard.js | 336 +----------------- apps/OpenSign/src/constant/searchQuery.js | 210 ----------- apps/OpenSign/src/json/ReportJson.js | 245 ------------- .../src/primitives/GetReportDisplay.js | 10 +- apps/OpenSign/src/routes/Report.js | 7 +- apps/OpenSign/src/routes/UserProfile.js | 29 +- 10 files changed, 147 insertions(+), 884 deletions(-) delete mode 100644 apps/OpenSign/src/constant/searchQuery.js diff --git a/apps/OpenSign/src/components/LoginFacebook.js b/apps/OpenSign/src/components/LoginFacebook.js index 1aeef2c73..1dd0297a4 100644 --- a/apps/OpenSign/src/components/LoginFacebook.js +++ b/apps/OpenSign/src/components/LoginFacebook.js @@ -213,6 +213,7 @@ const LoginFacebook = ({ type="button" onClick={() => handleSubmitbtn()} className="btn btn-info" + style={{ marginRight: 10 }} > Sign up </button> @@ -220,7 +221,7 @@ const LoginFacebook = ({ type="button" className="btn btn-secondary" onClick={() => setIsModal(false)} - style={{ marginRight: 10, width: 90 }} + style={{ width: 90 }} > Cancel </button> diff --git a/apps/OpenSign/src/components/LoginGoogle.js b/apps/OpenSign/src/components/LoginGoogle.js index 1038b21bb..4e464d11c 100644 --- a/apps/OpenSign/src/components/LoginGoogle.js +++ b/apps/OpenSign/src/components/LoginGoogle.js @@ -287,7 +287,7 @@ const GoogleSignInBtn = ({ <div> <button type="button" - className="bg-[#17a2b8] p-2 text-white rounded" + className="bg-[#17a2b8] p-2 text-white rounded mr-2" onClick={() => handleSubmitbtn()} > Sign up @@ -296,7 +296,7 @@ const GoogleSignInBtn = ({ type="button" className="bg-[#6c757d] p-2 text-white rounded" onClick={handleCloseModal} - style={{ marginRight: 10, width: 90 }} + style={{ width: 90 }} > Cancel </button> diff --git a/apps/OpenSign/src/components/dashboard/DashboardCard.js b/apps/OpenSign/src/components/dashboard/DashboardCard.js index 0c432c4e1..08d2a8904 100644 --- a/apps/OpenSign/src/components/dashboard/DashboardCard.js +++ b/apps/OpenSign/src/components/dashboard/DashboardCard.js @@ -1,7 +1,6 @@ import React, { useState, useEffect } from "react"; import axios from "axios"; import Parse from "parse"; -import onSearchFilter from "../../constant/searchQuery"; import getReplacedHashQuery from "../../constant/getReplacedHashQuery"; import "../../styles/loader.css"; import { useNavigate } from "react-router-dom"; @@ -45,12 +44,7 @@ const DashboardCard = (props) => { var reg = /(\#.*?\#)/gi; // eslint-disable-line var str = props.Data.query; var test = ""; - if (str.includes("#filterCondition#")) { - str = str.replace( - "#filterCondition#", - onSearchFilter(props.DefaultQuery) - ); - } + if (props.Data.extendkey) { let a = props.Data.extendkey.split("."); if (a.length > 0) { @@ -105,13 +99,6 @@ const DashboardCard = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); resr = data[0]; } else { - // let emp = Parse.Object.extend( - // localStorage.getItem("extended_class") - // ); - // let q = new Parse.Query(emp); - // q.equalTo("UserId", currentUser); - // let t = await q.first(); - // resr = t.toJSON(); resr = await Parse.Cloud.run("getUserDetails", { email: currentUser.get("email") }); @@ -149,47 +136,65 @@ const DashboardCard = (props) => { "X-Parse-Application-Id": parseAppId, "X-Parse-Session-Token": localStorage.getItem("accesstoken") }; - await axios.get(url, { headers: headers }).then((res) => { - if (res.data.results.length > 0) { - setLoading(false); - if (props.Data.key !== "count") { - setresponse(res.data.results[0][props.Data.key]); - } else { - if (props.Label === "Need your Signature") { - const listData = res.data?.results.filter( - (x) => x.Signers.length > 0 + // handle need your sign report count + if (props.Data.Redirect_id === "4Hhwbp482K") { + const params = { + reportId: props.Data.Redirect_id, + skip: 0, + limit: 200 + }; + const url = `${parseBaseUrl}/functions/getReport`; + await axios + .post(url, params, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": parseAppId, + sessiontoken: localStorage.getItem("accesstoken") + } + }) + .then((res) => { + const listData = res.data?.result.filter( + (x) => x.Signers.length > 0 + ); + let arr = []; + for (const obj of listData) { + const isSigner = obj.Signers.some( + (item) => item.UserId.objectId === currentUser.id ); - let arr = []; - for (const obj of listData) { - const isSigner = obj.Signers.some( - (item) => item.UserId.objectId === currentUser.id - ); - if (isSigner) { - let isRecord; - if (obj?.AuditTrail && obj?.AuditTrail.length > 0) { - isRecord = obj?.AuditTrail.some( - (item) => - item?.UserPtr?.UserId?.objectId === currentUser.id && - item.Activity === "Signed" - ); - } else { - isRecord = false; - } - if (isRecord === false) { - arr.push(obj); - } + if (isSigner) { + let isRecord; + if (obj?.AuditTrail && obj?.AuditTrail.length > 0) { + isRecord = obj?.AuditTrail.some( + (item) => + item?.UserPtr?.UserId?.objectId === currentUser.id && + item.Activity === "Signed" + ); + } else { + isRecord = false; + } + if (isRecord === false) { + arr.push(obj); } } - setresponse(arr.length); + } + setresponse(arr.length); + setLoading(false); + }); + } else { + await axios.get(url, { headers: headers }).then((res) => { + if (res.data.results.length > 0) { + setLoading(false); + if (props.Data.key !== "count") { + setresponse(res.data.results[0][props.Data.key]); } else { setresponse(res.data[props.Data.key]); } + } else { + setresponse(0); + setLoading(false); } - } else { - setresponse(0); - setLoading(false); - } - }); + }); + } } catch (e) { console.error("Problem", e); setLoading(false); @@ -226,13 +231,6 @@ const DashboardCard = (props) => { let data = JSON.parse(localStorage.getItem("Extand_Class")); res = data[0]; } else { - // var emp = Parse.Object.extend( - // localStorage.getItem("extended_class") - // ); - // var q = new Parse.Query(emp); - // q.equalTo("UserId", currentUser); - // let resr = await q.first(); - // res = resr.toJSON(); let resr = await Parse.Cloud.run("getUserDetails", { email: currentUser.get("email") }); diff --git a/apps/OpenSign/src/components/dashboard/DashboardReport.js b/apps/OpenSign/src/components/dashboard/DashboardReport.js index 4a0575f14..985d55c28 100644 --- a/apps/OpenSign/src/components/dashboard/DashboardReport.js +++ b/apps/OpenSign/src/components/dashboard/DashboardReport.js @@ -9,39 +9,58 @@ function DashboardReport(props) { const [isLoader, setIsLoader] = useState(true); const [reportName, setReportName] = useState(""); const [actions, setActions] = useState([]); + const [isNextRecord, setIsNextRecord] = useState(false); + const [isMoreDocs, setIsMoreDocs] = useState(true); + const abortController = new AbortController(); + const docPerPage = 5; + useEffect(() => { setReportName(""); getReportData(props.Record.reportId); + + // Function returned from useEffect is called on unmount + return () => { + setIsLoader(true); + setList([]); + setIsNextRecord(false); + // Here it'll abort the fetch + abortController.abort(); + }; + // eslint-disable-next-line }, [props.Record.reportId]); - const getReportData = async (id) => { + // below useEffect call when isNextRecord state is true and fetch next record + useEffect(() => { + if (isNextRecord) { + getReportData(props.Record.reportId, List.length, 200); + } + // eslint-disable-next-line + }, [isNextRecord]); + + const getReportData = async (id, skipUserRecord = 0, limit = 200) => { setIsLoader(true); const json = reportJson(id); 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 serverURL = - localStorage.getItem("BaseUrl12") + "classes/" + className; + const currentUser = Parse.User.current().id; - 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}&include=AuditTrail.UserPtr`; - const res = await axios.get(url, { headers: headers }); - // console.log("res ", res.data?.results); + 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 === "5Go51Q7T8r") { - const currentUser = Parse.User.current().id; - 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( @@ -63,14 +82,34 @@ function DashboardReport(props) { } } } - setList(arr); + if (arr.length === docPerPage) { + setIsMoreDocs(true); + } else { + setIsMoreDocs(false); + } + setList((prevRecord) => + prevRecord.length > 0 ? [...prevRecord, ...arr] : arr + ); } else { - setList(res.data?.results); + if (res.data.result.length === docPerPage) { + setIsMoreDocs(true); + } else { + setIsMoreDocs(false); + } + setIsNextRecord(false); + setList((prevRecord) => + prevRecord.length > 0 + ? [...prevRecord, ...res.data.result] + : res.data.result + ); } setIsLoader(false); } catch (err) { - console.log("err ", err); - setIsLoader(false); + const isCancel = axios.isCancel(err); + if (!isCancel) { + console.log("err ", err); + setIsLoader(false); + } } } else { setIsLoader(false); @@ -101,8 +140,10 @@ function DashboardReport(props) { <ReportTable ReportName={reportName} List={List} - act={"Sign"} actions={actions} + setIsNextRecord={setIsNextRecord} + isMoreDocs={isMoreDocs} + docPerPage={docPerPage} /> ) : ( <div className="flex items-center justify-center h-[100px] w-full bg-white rounded"> diff --git a/apps/OpenSign/src/components/dashboard/GetDashboard.js b/apps/OpenSign/src/components/dashboard/GetDashboard.js index 8133f6f59..144505ef9 100644 --- a/apps/OpenSign/src/components/dashboard/GetDashboard.js +++ b/apps/OpenSign/src/components/dashboard/GetDashboard.js @@ -1,5 +1,4 @@ -import React, { useState, Suspense, lazy } from "react"; -import moment from "moment"; +import React, { Suspense, lazy } from "react"; import ErrorBoundary from "../ErrorBoundary"; const DashboardCard = lazy(() => import("./DashboardCard")); @@ -7,258 +6,6 @@ const DashboardCard = lazy(() => import("./DashboardCard")); const DashboardReport = lazy(() => import("./DashboardReport")); const GetDashboard = (props) => { - const [filter, setfilter] = useState(""); - const [option, setoption] = useState(""); - - const onSearchFilter = (e) => { - let _search = e.target.value; - localStorage.setItem("DashboardDefaultFilter", _search); - switch (_search) { - case "Today": { - let d = new Date(); - let formDate = new Date( - Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0) - ).toISOString(); - let Todate = new Date( - Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59) - ).toISOString(); - let Query = `'$gte':'${formDate}','$lte':'${Todate}'`; - setfilter(Query); - setoption(_search); - break; - } - case "Yesterday": { - let d1 = new Date(); - d1.setDate(d1.getDate() - 1); - let yesFrDate = new Date( - Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate(), 0, 0, 0) - ).toISOString(); - - let YesTodate = new Date( - Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate(), 23, 59, 59) - ).toISOString(); - let Query1 = `'$gte':'${yesFrDate}','$lte':'${YesTodate}'`; - setfilter(Query1); - setoption(_search); - break; - } - case "This week": { - let oneDay = 24 * 60 * 60 * 1000; - let curr = new Date(); // get current date - let first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week - - let firstday = new Date( - new Date( - Date.UTC( - curr.getFullYear(), - curr.getMonth(), - curr.getDate(), - 0, - 0, - 0 - ) - ).setDate(first) - ).toISOString(); - let diffDays = Math.round( - Math.abs( - (new Date( - Date.UTC( - curr.getFullYear(), - curr.getMonth(), - curr.getDate(), - 23, - 59, - 59 - ) - ) - - new Date(firstday)) / - oneDay - ) - ); //Days since last week - let last = first + diffDays; - let lastday = new Date( - new Date( - Date.UTC( - curr.getFullYear(), - curr.getMonth(), - curr.getDate(), - 23, - 59, - 59 - ) - ).setDate(last) - ).toISOString(); - let Query2 = `'$gte':'${firstday}','$lte':'${lastday}'`; - setfilter(Query2); - setoption(_search); - break; - } - case "Last 7 days": { - let d7 = new Date(); - let d7l = new Date(); - d7.setDate(d7.getDate() - 7); - let l7t = new Date( - Date.UTC(d7l.getFullYear(), d7l.getMonth(), d7l.getDate(), 23, 59, 59) - ).toISOString(); - let date7 = new Date( - Date.UTC(d7.getFullYear(), d7.getMonth(), d7.getDate(), 0, 0, 0) - ).toISOString(); - let Query7 = `'$gte':'${date7}','$lte':'${l7t}'`; - setfilter(Query7); - setoption(_search); - break; - } - case "Last 14 days": { - let d14 = new Date(); - let d14l = new Date(); - let l14t = new Date( - Date.UTC( - d14l.getFullYear(), - d14l.getMonth(), - d14l.getDate(), - 23, - 59, - 59 - ) - ).toISOString(); - d14.setDate(d14.getDate() - 14); - let date14 = new Date( - Date.UTC(d14.getFullYear(), d14.getMonth(), d14.getDate(), 0, 0, 0) - ).toISOString(); - - let Query14 = `'$gte':'${date14}','$lte':'${l14t}'`; - setfilter(Query14); - setoption(_search); - break; - } - case "Last 30 days": { - let d30 = new Date(); - let d30l = new Date(); - let l30t = new Date( - Date.UTC( - d30l.getFullYear(), - d30l.getMonth(), - d30l.getDate(), - 23, - 59, - 59 - ) - ).toISOString(); - d30.setDate(d30.getDate() - 30); - let date30 = new Date( - Date.UTC(d30.getFullYear(), d30.getMonth(), d30.getDate(), 0, 0, 0) - ).toISOString(); - let Query30 = `'$gte':'${date30}','$lte':'${l30t}'`; - setfilter(Query30); - setoption(_search); - break; - } - case "Last week": { - const from_date = moment().startOf("week").subtract(7, "days"); - const to_date = moment().endOf("week").subtract(7, "days"); - let Queryl = `'$gte':'${from_date.toISOString()}','$lte':'${to_date.toISOString()}'`; - setfilter(Queryl); - setoption(_search); - break; - } - case "This month": { - const tdate = new Date(); - let tfirstDay = new Date( - tdate.getFullYear(), - tdate.getMonth(), - 1 - ).toISOString(); - let tlastDay = new Date( - tdate.getFullYear(), - tdate.getMonth() + 1, - 0 - ).toISOString(); - let Querylt = `'$gte':'${tfirstDay}','$lte':'${tlastDay}'`; - setfilter(Querylt); - setoption(_search); - break; - } - case "Last month": { - const ldate = new Date(); - var lfirstDay = new Date( - ldate.getFullYear(), - ldate.getMonth() - 1, - 2 - ).toISOString(); - var llastDay = new Date( - ldate.getFullYear(), - ldate.getMonth(), - 1 - ).toISOString(); - let Queryltl = `'$gte':'${lfirstDay}','$lte':'${llastDay}'`; - setfilter(Queryltl); - setoption(_search); - break; - } - case "All": { - let fall = new Date( - new Date().getFullYear() - 100, - 0, - 1, - 0, - 0, - 0 - ).toISOString(); - let fall_year = `'$gte':'${fall}'`; - setfilter(fall_year); - setoption(_search); - break; - } - case "This year": { - let fcy = new Date( - new Date().getFullYear(), - 0, - 1, - 0, - 0, - 0 - ).toISOString(); - let lcy = new Date( - new Date().getFullYear(), - 11, - 31, - 23, - 59, - 59 - ).toISOString(); - let cur_year = `'$gte':'${fcy}','$lte':'${lcy}'`; - setfilter(cur_year); - setoption(_search); - break; - } - case "Last year": { - let fly = new Date( - new Date().getFullYear() - 1, - 0, - 1, - 0, - 0, - 0 - ).toISOString(); - let lly = new Date( - new Date().getFullYear() - 1, - 11, - 31, - 23, - 59, - 59 - ).toISOString(); - let last_year = `'$gte':'${fly}','$lte':'${lly}'`; - setfilter(last_year); - setoption(_search); - break; - } - default: { - setoption(_search); - break; - } - } - }; const renderSwitchWithTour = (col) => { switch (col.widget.type) { case "Card": @@ -272,7 +19,6 @@ const GetDashboard = (props) => { <DashboardCard Icon={col.widget.icon} Label={col.widget.label} - Filter={filter} Format={col.widget.format && col.widget.format} Data={col.widget.data} FilterData={col.widget.filter} @@ -281,50 +27,12 @@ const GetDashboard = (props) => { </Suspense> </div> ); - case "customeHtml": - return ( - <div data-tut={col.widget.data.tourSection}> - <select - id="searchFiltr" - className="form-control" - value={ - option || - localStorage.getItem("DashboardDefaultFilter") || - col.widget.data[0].default - } - onChange={onSearchFilter} - > - {col.widget.data[0].options.map((opt) => ( - <option key={opt} value={opt}> - {opt} - </option> - ))} - </select> - - <br /> - </div> - ); - - case "customeTag": - return ( - <h3 - data-tut={col.widget.data.tourSection} - style={{ - marginBottom: "4px", - color: "currentColor", - marginLeft: "4px" - }} - > - {col.widget.label} - </h3> - ); case "report": { - let _filter = `${col.widget.filterKey}:${filter}`; return ( <div data-tut={col.widget.data.tourSection}> <Suspense fallback={<div>please wait</div>}> <div className="mb-4 md:mb-0"> - <DashboardReport Filter={_filter} Record={col.widget} /> + <DashboardReport Record={col.widget} /> </div> </Suspense> </div> @@ -346,7 +54,6 @@ const GetDashboard = (props) => { <DashboardCard Icon={col.widget.icon} Label={col.widget.label} - Filter={filter} Format={col.widget.format && col.widget.format} Data={col.widget.data} FilterData={col.widget.filter} @@ -355,48 +62,11 @@ const GetDashboard = (props) => { </Suspense> </div> ); - case "customeHtml": - return ( - <div> - <select - id="searchFiltr" - className="form-control" - value={ - option || - localStorage.getItem("DashboardDefaultFilter") || - col.widget.data[0].default - } - onChange={onSearchFilter} - > - {col.widget.data[0].options.map((opt) => ( - <option key={opt} value={opt}> - {opt} - </option> - ))} - </select> - - <br /> - </div> - ); - - case "customeTag": - return ( - <h3 - style={{ - marginBottom: "4px", - color: "currentColor", - marginLeft: "4px" - }} - > - {col.widget.label} - </h3> - ); case "report": { - let _filter = `${col.widget.filterKey}:${filter}`; return ( <Suspense fallback={<div>please wait</div>}> <div className="mb-4 md:mb-0"> - <DashboardReport Filter={_filter} Record={col.widget} /> + <DashboardReport Record={col.widget} /> </div> </Suspense> ); diff --git a/apps/OpenSign/src/constant/searchQuery.js b/apps/OpenSign/src/constant/searchQuery.js deleted file mode 100644 index d9d5531bf..000000000 --- a/apps/OpenSign/src/constant/searchQuery.js +++ /dev/null @@ -1,210 +0,0 @@ -import moment from "moment"; - -export default function onSearchFilter(_search) { - switch (_search) { - case "Today": { - let d = new Date(); - let formDate = new Date( - Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0) - ).toISOString(); - let Todate = new Date( - Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59) - ).toISOString(); - let Query = `'$gte':'${formDate}','$lte':'${Todate}'`; - return Query; - } - case "Yesterday": { - let d1 = new Date(); - d1.setDate(d1.getDate() - 1); - let yesFrDate = new Date( - Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate(), 0, 0, 0) - ).toISOString(); - - let YesTodate = new Date( - Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate(), 23, 59, 59) - ).toISOString(); - let Query1 = `'$gte':'${yesFrDate}','$lte':'${YesTodate}'`; - return Query1; - } - - case "This week": { - let oneDay = 24 * 60 * 60 * 1000; - let curr = new Date(); // get current date - let first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week - - let firstday = new Date( - new Date( - Date.UTC(curr.getFullYear(), curr.getMonth(), curr.getDate(), 0, 0, 0) - ).setDate(first) - ).toISOString(); - let diffDays = Math.round( - Math.abs( - (new Date( - Date.UTC( - curr.getFullYear(), - curr.getMonth(), - curr.getDate(), - 23, - 59, - 59 - ) - ) - - new Date(firstday)) / - oneDay - ) - ); //Days since last week - let last = first + diffDays; - let lastday = new Date( - new Date( - Date.UTC( - curr.getFullYear(), - curr.getMonth(), - curr.getDate(), - 23, - 59, - 59 - ) - ).setDate(last) - ).toISOString(); - let Query2 = `'$gte':'${firstday}','$lte':'${lastday}'`; - return Query2; - } - - case "Last 7 days": { - let d7 = new Date(); - let d7l = new Date(); - d7.setDate(d7.getDate() - 7); - let l7t = new Date( - Date.UTC(d7l.getFullYear(), d7l.getMonth(), d7l.getDate(), 23, 59, 59) - ).toISOString(); - let date7 = new Date( - Date.UTC(d7.getFullYear(), d7.getMonth(), d7.getDate(), 0, 0, 0) - ).toISOString(); - let Query7 = `'$gte':'${date7}','$lte':'${l7t}'`; - return Query7; - } - case "Last 14 days": { - let d14 = new Date(); - let d14l = new Date(); - let l14t = new Date( - Date.UTC( - d14l.getFullYear(), - d14l.getMonth(), - d14l.getDate(), - 23, - 59, - 59 - ) - ).toISOString(); - d14.setDate(d14.getDate() - 14); - let date14 = new Date( - Date.UTC(d14.getFullYear(), d14.getMonth(), d14.getDate(), 0, 0, 0) - ).toISOString(); - - let Query14 = `'$gte':'${date14}','$lte':'${l14t}'`; - return Query14; - } - - case "Last 30 days": { - let d30 = new Date(); - let d30l = new Date(); - let l30t = new Date( - Date.UTC( - d30l.getFullYear(), - d30l.getMonth(), - d30l.getDate(), - 23, - 59, - 59 - ) - ).toISOString(); - d30.setDate(d30.getDate() - 30); - let date30 = new Date( - Date.UTC(d30.getFullYear(), d30.getMonth(), d30.getDate(), 0, 0, 0) - ).toISOString(); - return `'$gte':'${date30}','$lte':'${l30t}'`; - } - case "Last week": { - const from_date = moment().startOf("week").subtract(7, "days"); - const to_date = moment().endOf("week").subtract(7, "days"); - return `'$gte':'${from_date.toISOString()}','$lte':'${to_date.toISOString()}'`; - } - case "This month": { - var tdate = new Date(); - var tfirstDay = new Date( - tdate.getFullYear(), - tdate.getMonth(), - 1 - ).toISOString(); - var tlastDay = new Date( - tdate.getFullYear(), - tdate.getMonth() + 1, - 0 - ).toISOString(); - let Querylt = `'$gte':'${tfirstDay}','$lte':'${tlastDay}'`; - return Querylt; - } - case "Last month": { - var ldate = new Date(); - var lfirstDay = new Date( - ldate.getFullYear(), - ldate.getMonth() - 1, - 2 - ).toISOString(); - var llastDay = new Date( - ldate.getFullYear(), - ldate.getMonth(), - 1 - ).toISOString(); - let Queryltl = `'$gte':'${lfirstDay}','$lte':'${llastDay}'`; - return Queryltl; - } - case "All": { - let fall = new Date( - new Date().getFullYear() - 100, - 0, - 1, - 0, - 0, - 0 - ).toISOString(); - let fall_year = `'$gte':'${fall}'`; - return fall_year; - } - case "This year": { - let fcy = new Date(new Date().getFullYear(), 0, 1, 0, 0, 0).toISOString(); - let lcy = new Date( - new Date().getFullYear(), - 11, - 31, - 23, - 59, - 59 - ).toISOString(); - let cur_year = `'$gte':'${fcy}','$lte':'${lcy}'`; - return cur_year; - } - case "Last year": { - let fly = new Date( - new Date().getFullYear() - 1, - 0, - 1, - 0, - 0, - 0 - ).toISOString(); - let lly = new Date( - new Date().getFullYear() - 1, - 11, - 31, - 23, - 59, - 59 - ).toISOString(); - let last_year = `'$gte':'${fly}','$lte':'${lly}'`; - return last_year; - } - default: - return ""; - } -} diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index 960559938..364b0af2d 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -1,6 +1,4 @@ -import Parse from "parse"; export default function reportJson(id) { - const currentUserId = Parse.User.current().id; // console.log("json ", json); switch (id) { @@ -8,28 +6,6 @@ export default function reportJson(id) { case "ByHuevtCFY": return { reportName: "Draft Documents", - className: "contracts_Document", - 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" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "sign", @@ -45,27 +21,6 @@ export default function reportJson(id) { case "4Hhwbp482K": return { reportName: "Need your sign", - className: "contracts_Document", - 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" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "sign", @@ -81,31 +36,6 @@ export default function reportJson(id) { case "1MwEuxLEkF": return { reportName: "In-progress documents", - className: "contracts_Document", - 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" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "View", @@ -121,27 +51,6 @@ export default function reportJson(id) { case "kQUoW4hUXz": return { reportName: "Completed Documents", - className: "contracts_Document", - 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" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "View", @@ -153,63 +62,10 @@ export default function reportJson(id) { } ] }; - // OpenSignDrive™ documents Drafts - case "VRFDmUmw5B": - return { - reportName: "OpenSignDrive™ Drafts", - className: "contracts_Document", - params: { - Type: "AIDoc", - $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" - ], - orderBy: "-updatedAt", - actions: [ - { - btnLabel: "edit", - btnColor: "#3ac9d6", - textColor: "white", - btnIcon: "fa fa-plus", - redirectUrl: - "remoteUrl=aHR0cHM6Ly9xaWstYWktb3JnLmdpdGh1Yi5pby9MZWdhR2VuaWUtTWljcm9hcHBWMi9yZW1vdGVFbnRyeS5qcw==&moduleToLoad=AppRoutes&remoteName=legageniemicroapp/legagenie" - } - ] - }; // declined documents report case "UPr2Fm5WY3": return { reportName: "Declined Documents", - className: "contracts_Document", - params: { Type: null, IsDeclined: true }, - CreatedBy: { - __type: "Pointer", - className: "_User", - objectId: currentUserId - }, - keys: [ - "Name", - "Note", - "Folder.Name", - "URL", - "ExtUserPtr.Name", - "Signers.Name" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "View", @@ -225,39 +81,6 @@ export default function reportJson(id) { case "zNqBHXHsYH": return { reportName: "Expired Documents", - className: "contracts_Document", - 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" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "View", @@ -273,31 +96,6 @@ export default function reportJson(id) { case "d9k3UfYHBc": return { reportName: "Recently sent for signatures", - className: "contracts_Document", - 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" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "View", @@ -313,27 +111,6 @@ export default function reportJson(id) { case "5Go51Q7T8r": return { reportName: "Recent signature requests", - className: "contracts_Document", - 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" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "Sign", @@ -349,28 +126,6 @@ export default function reportJson(id) { case "kC5mfynCi4": return { reportName: "Drafts", - className: "contracts_Document", - 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" - ], - orderBy: "-updatedAt", actions: [ { btnLabel: "sign", diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index 4bf02a818..676230a25 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -7,11 +7,11 @@ const ReportTable = ({ List, actions, setIsNextRecord, - isMoreDocs + isMoreDocs, + docPerPage }) => { const navigate = useNavigate(); const [currentPage, setCurrentPage] = useState(1); - const docPerPage = 10; // const pageNumbers = []; // For loop is used to calculate page numbers visible below table @@ -22,7 +22,7 @@ const ReportTable = ({ calculatedPageNumbers.push(i); } return calculatedPageNumbers; - }, [List]); + }, [List, docPerPage]); // below useEffect reset currenpage to 1 if user change route useEffect(() => { return () => setCurrentPage(1); @@ -154,7 +154,7 @@ const ReportTable = ({ </tbody> </table> <div className="flex flex-wrap items-center gap-2 p-2 "> - {List.length > 10 && ( + {List.length > docPerPage && ( <> {currentPage > 1 && ( <button @@ -178,7 +178,7 @@ const ReportTable = ({ {isMoreDocs && ( <button className="text-black rounded px-1 py-2">...</button> )} - {List.length > 10 && ( + {List.length > docPerPage && ( <> {pageNumbers.includes(currentPage + 1) && ( <button diff --git a/apps/OpenSign/src/routes/Report.js b/apps/OpenSign/src/routes/Report.js index 44ecb74ff..c1e8d7689 100644 --- a/apps/OpenSign/src/routes/Report.js +++ b/apps/OpenSign/src/routes/Report.js @@ -15,6 +15,7 @@ const Report = () => { const [isNextRecord, setIsNextRecord] = useState(false); const [isMoreDocs, setIsMoreDocs] = useState(true); const abortController = new AbortController(); + const docPerPage = 10; // below useEffect is call when id param change useEffect(() => { @@ -86,7 +87,7 @@ const Report = () => { } } } - if (arr.length === 10) { + if (arr.length === docPerPage) { setIsMoreDocs(true); } else { setIsMoreDocs(false); @@ -95,9 +96,8 @@ const Report = () => { prevRecord.length > 0 ? [...prevRecord, ...arr] : arr ); } else { - if (res.data.result.length === 10) { + if (res.data.result.length === docPerPage) { setIsMoreDocs(true); - console.log("here"); } else { setIsMoreDocs(false); } @@ -149,6 +149,7 @@ const Report = () => { actions={actions} setIsNextRecord={setIsNextRecord} isMoreDocs={isMoreDocs} + docPerPage={docPerPage} /> ) : ( <div className="flex items-center justify-center h-screen w-full bg-white rounded"> diff --git a/apps/OpenSign/src/routes/UserProfile.js b/apps/OpenSign/src/routes/UserProfile.js index f252f3644..ea450c94f 100644 --- a/apps/OpenSign/src/routes/UserProfile.js +++ b/apps/OpenSign/src/routes/UserProfile.js @@ -5,7 +5,7 @@ import { SaveFileSize } from "../constant/saveFileSize"; import dp from "../assets/images/dp.png"; import Title from "../components/Title"; import sanitizeFileName from "../primitives/sanitizeFileName"; - +import axios from "axios"; function UserProfile() { const navigate = useNavigate(); let UserProfile = JSON.parse(localStorage.getItem("UserInformation")); @@ -64,18 +64,24 @@ function UserProfile() { const extClass = localStorage.getItem("extended_class"); const extData = JSON.parse(localStorage.getItem("Extand_Class")); const ExtUserId = extData[0].objectId; - // console.log("extData ", extData); // console.log("UserId ", ExtUserId); + const body = { Phone: obj.Phone, Name: obj.Name }; + await axios.put( + parseBaseUrl + "classes/" + extClass + "/" + ExtUserId, + body, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": parseAppId, + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + } + ); + const res = await Parse.Cloud.run("getUserDetails", { + email: extData[0].Email + }); - const extQuery = new Parse.Query(extClass); - const update = await extQuery.get(ExtUserId); - // console.log("update ", update); - - update.set("Phone", obj.Phone); - update.set("Name", obj.Name); - const updateRes = await update.save(); - - const json = JSON.parse(JSON.stringify([updateRes])); + const json = JSON.parse(JSON.stringify([res])); const extRes = JSON.stringify(json); localStorage.setItem("Extand_Class", extRes); @@ -154,6 +160,7 @@ function UserProfile() { <input type="file" className="max-w-[270px] text-sm py-1 px-2 mt-4 border-[1px] border-[#15b4e9] text-black rounded" + accept="image/png, image/gif, image/jpeg" onChange={(e) => { let files = e.target.files; fileUpload(files[0]); From ef50aaa417eeaea3b986d1ed4806dc344ac64c9b Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Tue, 21 Nov 2023 19:34:11 +0530 Subject: [PATCH 34/35] fix google sign in --- apps/OpenSign/src/components/LoginGoogle.js | 3 ++- apps/OpenSign/src/routes/Login.js | 23 ++++++--------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/apps/OpenSign/src/components/LoginGoogle.js b/apps/OpenSign/src/components/LoginGoogle.js index 4e464d11c..19c6fd594 100644 --- a/apps/OpenSign/src/components/LoginGoogle.js +++ b/apps/OpenSign/src/components/LoginGoogle.js @@ -287,8 +287,9 @@ const GoogleSignInBtn = ({ <div> <button type="button" - className="bg-[#17a2b8] p-2 text-white rounded mr-2" + className="bg-[#17a2b8] p-2 text-white rounded" onClick={() => handleSubmitbtn()} + style={{ marginRight: 10 }} > Sign up </button> diff --git a/apps/OpenSign/src/routes/Login.js b/apps/OpenSign/src/routes/Login.js index 35d93185a..4a472cb95 100644 --- a/apps/OpenSign/src/routes/Login.js +++ b/apps/OpenSign/src/routes/Login.js @@ -489,16 +489,13 @@ function Login(props) { element.extended_class ); localStorage.setItem("userpointer", element.userpointer); - - const extendedClass = Parse.Object.extend( - element.extended_class - ); - let query = new Parse.Query(extendedClass); - query.equalTo("UserId", Parse.User.current()); - query.include("TenantId"); - await query.find().then( - (results) => { + const currentUser = Parse.User.current(); + await Parse.Cloud.run("getUserDetails", { + email: currentUser.get("email") + }).then( + (result) => { let tenentInfo = []; + const results = [result]; if (results) { let extendedInfo_stringify = JSON.stringify(results); @@ -756,14 +753,6 @@ function Login(props) { element.extended_class ); - // const extendedClass = Parse.Object.extend( - // element.extended_class - // ); - // let query = new Parse.Query(extendedClass); - // query.equalTo("UserId", Parse.User.current()); - // query.include("TenantId"); - // await query.find() - const currentUser = Parse.User.current(); await Parse.Cloud.run("getUserDetails", { email: currentUser.get("email") From d11dff2987fea05f7467a65ea69b886a7f1ad23e Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs <prafull.navkar@nxglabs.com> Date: Wed, 22 Nov 2023 00:09:28 +0530 Subject: [PATCH 35/35] fix: google sign in mobile & add progress in profile pic upload --- apps/OpenSign/src/components/LoginGoogle.js | 35 +++++++++++++++++++++ apps/OpenSign/src/routes/Login.js | 30 +++++++----------- apps/OpenSign/src/routes/Signup.js | 23 +++----------- apps/OpenSign/src/routes/UserProfile.js | 27 ++++++++++++++-- 4 files changed, 76 insertions(+), 39 deletions(-) diff --git a/apps/OpenSign/src/components/LoginGoogle.js b/apps/OpenSign/src/components/LoginGoogle.js index 19c6fd594..7cc01c213 100644 --- a/apps/OpenSign/src/components/LoginGoogle.js +++ b/apps/OpenSign/src/components/LoginGoogle.js @@ -42,7 +42,42 @@ const GoogleSignInBtn = ({ width: "187px" }); }); + const clearStorage = async () => { + await Parse.User.logOut(); + + let baseUrl = localStorage.getItem("BaseUrl12"); + let appid = localStorage.getItem("AppID12"); + let applogo = localStorage.getItem("appLogo"); + let domain = localStorage.getItem("domain"); + let appversion = localStorage.getItem("appVersion"); + let appTitle = localStorage.getItem("appTitle"); + let defaultmenuid = localStorage.getItem("defaultmenuid"); + let PageLanding = localStorage.getItem("PageLanding"); + let _appName = localStorage.getItem("_appName"); + let _app_objectId = localStorage.getItem("_app_objectId"); + let appName = localStorage.getItem("appName"); + let userSettings = localStorage.getItem("userSettings"); + + localStorage.clear(); + + localStorage.setItem("BaseUrl12", baseUrl); + localStorage.setItem("AppID12", appid); + localStorage.setItem("appLogo", applogo); + localStorage.setItem("domain", domain); + localStorage.setItem("appversion", appversion); + localStorage.setItem("appTitle", appTitle); + localStorage.setItem("defaultmenuid", defaultmenuid); + localStorage.setItem("PageLanding", PageLanding); + localStorage.setItem("_appName", _appName); + localStorage.setItem("_app_objectId", _app_objectId); + localStorage.setItem("appName", appName); + localStorage.setItem("userSettings", userSettings); + localStorage.setItem("baseUrl", baseUrl); + localStorage.setItem("parseAppId", appid); + + }; const responseGoogle = async (response) => { + clearStorage(); setThirdpartyLoader(true); // console.log("response ", response); if (response.credential) { diff --git a/apps/OpenSign/src/routes/Login.js b/apps/OpenSign/src/routes/Login.js index 4a472cb95..bfb6e813c 100644 --- a/apps/OpenSign/src/routes/Login.js +++ b/apps/OpenSign/src/routes/Login.js @@ -10,9 +10,11 @@ import GoogleSignInBtn from "../components/LoginGoogle"; // import LoginFacebook from "../components/LoginFacebook"; import { NavLink, useNavigate } from "react-router-dom"; import login_img from "../assets/images/login_img.svg"; +import { useWindowSize } from "../hook/useWindowSize"; function Login(props) { const navigate = useNavigate(); + const { width } = useWindowSize(); const [state, setState] = useState({ email: "", toastColor: "#5cb85c", @@ -21,7 +23,6 @@ function Login(props) { passwordVisible: false, mobile: "", phone: "", - hideNav: "", scanResult: "", baseUrl: localStorage.getItem("baseUrl"), parseAppId: localStorage.getItem("parseAppId"), @@ -47,26 +48,11 @@ function Login(props) { ); // eslint-disable-next-line }, []); - useEffect(() => { - resize(); - window.addEventListener("resize", resize()); - return () => { - window.removeEventListener("resize", resize()); - }; - // eslint-disable-next-line - }, []); const handleChange = (event) => { const { name, value } = event.target; setState({ ...state, [name]: value }); }; - const resize = () => { - let currentHideNav = window.innerWidth <= 760; - if (currentHideNav !== state.hideNav) { - setState({ ...state, hideNav: currentHideNav }); - } - }; - const handleSubmit = async (event) => { localStorage.removeItem("accesstoken"); event.preventDefault(); @@ -594,6 +580,10 @@ function Login(props) { } else { navigate(`/subscription`, { replace: true }); } + } else { + navigate( + `/${element.pageType}/${element.pageId}` + ); } } } else { @@ -618,6 +608,10 @@ function Login(props) { } else { navigate(`/subscription`, { replace: true }); } + } else { + navigate( + `/${element.pageType}/${element.pageId}` + ); } } }, @@ -1050,7 +1044,7 @@ function Login(props) { <NavLink className="rounded-sm cursor-pointer bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] w-full py-3 shadow uppercase" to="/signup" - style={state.hideNav ? { textAlign: "center" } : {}} + style={width < 768 ? { textAlign: "center" } : {}} > Create Account </NavLink> @@ -1118,7 +1112,7 @@ function Login(props) { </div> </div> </div> - {!state.hideNav && ( + {width >= 768 && ( <div className="self-center"> <div className="mx-auto md:w-[300px] lg:w-[400px] xl:w-[500px]"> <img diff --git a/apps/OpenSign/src/routes/Signup.js b/apps/OpenSign/src/routes/Signup.js index 8c7332a16..72a80588e 100644 --- a/apps/OpenSign/src/routes/Signup.js +++ b/apps/OpenSign/src/routes/Signup.js @@ -6,8 +6,10 @@ import Title from "../components/Title"; import { fetchAppInfo, showTenantName } from "../redux/actions"; import { useNavigate, NavLink } from "react-router-dom"; import login_img from "../assets/images/login_img.svg"; +import { useWindowSize } from "../hook/useWindowSize"; const Signup = (props) => { + const { width } = useWindowSize(); const navigate = useNavigate(); const [name, setName] = useState(""); const [phone, setPhone] = useState(""); @@ -18,7 +20,6 @@ const Signup = (props) => { const [company, setCompany] = useState(""); const [jobTitle, setJobTitle] = useState(""); const [state, setState] = useState({ - hideNav: "", loading: false, toastColor: "#5cb85c", toastDescription: "" @@ -387,24 +388,14 @@ const Signup = (props) => { } }; useEffect(() => { - window.addEventListener("resize", resize); props.fetchAppInfo( localStorage.getItem("domain"), localStorage.getItem("BaseUrl12"), localStorage.getItem("AppID12") ); - return () => { - window.removeEventListener("resize", resize); - }; // eslint-disable-next-line }, []); - const resize = () => { - let currentHideNav = window.innerWidth <= 760; - if (currentHideNav !== state.hideNav) { - setState({ hideNav: currentHideNav }); - } - }; return ( <div className="bg-white"> {state.loading && ( @@ -438,11 +429,7 @@ const Signup = (props) => { <div> <div className="md:m-10 lg:m-16 md:p-4 lg:p-10 p-5 bg-[#ffffff] md:border-[1px] md:border-gray-400 "> <div className="w-[250px] h-[66px] inline-block"> - {state.hideNav ? ( - <img src={image} width="100%" alt="" /> - ) : ( - <img src={image} width="100%" alt="" /> - )} + <img src={image} width="100%" alt="" /> </div> <div className="grid grid-cols-1 md:grid-cols-2 gap-x-2"> <div className=""> @@ -550,14 +537,14 @@ const Signup = (props) => { <NavLink className="rounded-sm cursor-pointer bg-white border-[1px] border-[#15b4e9] text-[#15b4e9] w-full py-3 shadow uppercase" to="/" - style={state.hideNav ? { textAlign: "center" } : {}} + style={width < 768 ? { textAlign: "center" } : {}} > Login </NavLink> </div> </form> </div> - {!state.hideNav && ( + {width >= 768 && ( <div className="self-center"> <div className="mx-auto md:w-[300px] lg:w-[400px] xl:w-[500px]"> <img src={login_img} alt="bisec" width="100%" /> diff --git a/apps/OpenSign/src/routes/UserProfile.js b/apps/OpenSign/src/routes/UserProfile.js index ea450c94f..5dc747329 100644 --- a/apps/OpenSign/src/routes/UserProfile.js +++ b/apps/OpenSign/src/routes/UserProfile.js @@ -16,6 +16,8 @@ function UserProfile() { const [Phone, SetPhone] = useState(UserProfile && UserProfile.phone); const [Image, setImage] = useState(localStorage.getItem("profileImg")); const [isLoader, setIsLoader] = useState(false); + const [percentage, setpercentage] = useState(0); + Parse.serverURL = parseBaseUrl; Parse.initialize(parseAppId); const handleSubmit = async (e) => { @@ -44,7 +46,7 @@ function UserProfile() { await updateExtUser({ Name: res.name, Phone: res.phone }); alert("Profile updated successfully."); setEditMode(false); - navigate("/"); + navigate("/dashboard/35KBoSgoAK"); } }, (error) => { @@ -102,7 +104,15 @@ function UserProfile() { const parseFile = new Parse.File(name, pdfFile); try { - const response = await parseFile.save(); + const response = await parseFile.save({ + progress: (progressValue, loaded, total, { type }) => { + if (type === "upload" && progressValue !== null) { + const percentCompleted = Math.round((loaded * 100) / total); + // console.log("percentCompleted ", percentCompleted); + setpercentage(percentCompleted); + } + } + }); // // The response object will contain information about the uploaded file // console.log("File uploaded:", response); @@ -111,6 +121,7 @@ function UserProfile() { if (response.url()) { setImage(response.url()); localStorage.setItem("profileImg", response.url()); + setpercentage(0); SaveFileSize(size, response.url()); return response.url(); } @@ -167,8 +178,18 @@ function UserProfile() { }} /> )} + {percentage !== 0 && ( + <div className="flex items-center gap-x-2"> + <div className="h-2 rounded-full w-[200px] md:w-[400px] bg-gray-200"> + <div + className="h-2 rounded-full bg-blue-500" + style={{ width: `${percentage}%` }} + ></div> + </div> + <span className="text-black text-sm">{percentage}%</span> + </div> + )} <div className="text-base font-semibold pt-4"> - {" "} {localStorage.getItem("_user_role")} </div> </div>