From db4494c463a8bc9756576ba096a22249abb980e9 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 9 Nov 2023 17:08:57 +0530 Subject: [PATCH 01/11] 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/11] 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/11] change cloud function name getContractUser to getUserDetails --- apps/OpenSign/src/components/LoginFacebook.js | 2 +- apps/OpenSign/src/components/LoginGoogle.js | 2 +- apps/OpenSign/src/routes/Pgsignup.js | 2 +- apps/OpenSign/src/routes/Signup.js | 2 +- apps/OpenSignServer/cloud/main.js | 4 ++-- .../parsefunction/{getContractUser.js => getUserDetails.js} | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) rename apps/OpenSignServer/cloud/parsefunction/{getContractUser.js => getUserDetails.js} (78%) diff --git a/apps/OpenSign/src/components/LoginFacebook.js b/apps/OpenSign/src/components/LoginFacebook.js index d158a96aa..442fcb3e7 100644 --- a/apps/OpenSign/src/components/LoginFacebook.js +++ b/apps/OpenSign/src/components/LoginFacebook.js @@ -46,7 +46,7 @@ const LoginFacebook = ({ // extUser.equalTo("Email", details.Email); // const extRes = await extUser.first(); const params = { email: details.Email }; - const extRes = await Parse.Cloud.run("getContractUser", params); + const extRes = await Parse.Cloud.run("getUserDetails", params); // console.log("extRes ", extRes); if (extRes) { const params = { ...details, Phone: extRes.get("Phone") }; diff --git a/apps/OpenSign/src/components/LoginGoogle.js b/apps/OpenSign/src/components/LoginGoogle.js index 2a19f7c8f..7e00b8e8c 100644 --- a/apps/OpenSign/src/components/LoginGoogle.js +++ b/apps/OpenSign/src/components/LoginGoogle.js @@ -70,7 +70,7 @@ const GoogleSignInBtn = ({ // extUser.equalTo("Email", details.Gmail); // const extRes = await extUser.first(); const params = { email: details.Gmail }; - const extRes = await Parse.Cloud.run("getContractUser", params); + const extRes = await Parse.Cloud.run("getUserDetails", params); // console.log("extRes ", extRes); if (extRes) { const params = { ...details, Phone: extRes.get("Phone") }; diff --git a/apps/OpenSign/src/routes/Pgsignup.js b/apps/OpenSign/src/routes/Pgsignup.js index ab215844c..c47adbfcf 100644 --- a/apps/OpenSign/src/routes/Pgsignup.js +++ b/apps/OpenSign/src/routes/Pgsignup.js @@ -68,7 +68,7 @@ const PgSignUp = (props) => { const extClass = userSettings[0].extended_class; // console.log("extClass ", extClass); const params = { email: userDetails.email }; - const res = await Parse.Cloud.run("getContractUser", params); + const res = await Parse.Cloud.run("getUserDetails", params); // console.log("res", res); if (res) { const checkUser = new Parse.Query(extClass); diff --git a/apps/OpenSign/src/routes/Signup.js b/apps/OpenSign/src/routes/Signup.js index 137c76b21..280e5f9a3 100644 --- a/apps/OpenSign/src/routes/Signup.js +++ b/apps/OpenSign/src/routes/Signup.js @@ -102,7 +102,7 @@ const Signup = (props) => { .catch(async (err) => { if (err.code === 202) { const params = { email: email }; - const res = await Parse.Cloud.run("getContractUser", params); + const res = await Parse.Cloud.run("getUserDetails", params); // console.log("Res ", res); if (res) { alert("User already exists with this username!"); diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index ed4396a9f..2facd600c 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -13,7 +13,7 @@ import sendMailOTPv1 from './parsefunction/SendMailOTPv1.js'; import SendMailv1 from './parsefunction/SendMailv1.js'; import AuthLoginAsMail from './parsefunction/AuthLoginAsMail.js'; import getUserId from './parsefunction/getUserId.js'; -import getContractUser from './parsefunction/getContractUser.js'; +import getUserDetails from './parsefunction/getUserDetails.js'; Parse.Cloud.define('AddUserToRole', addUserToGroups); Parse.Cloud.define('UserGroups', getUserGroups); @@ -30,4 +30,4 @@ Parse.Cloud.define('SendOTPMailV1', sendMailOTPv1); Parse.Cloud.define('sendmail', SendMailv1); Parse.Cloud.define('AuthLoginAsMail', AuthLoginAsMail); Parse.Cloud.define('getUserId', getUserId); -Parse.Cloud.define('getContractUser', getContractUser); +Parse.Cloud.define('getUserDetails', getUserDetails); diff --git a/apps/OpenSignServer/cloud/parsefunction/getContractUser.js b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js similarity index 78% rename from apps/OpenSignServer/cloud/parsefunction/getContractUser.js rename to apps/OpenSignServer/cloud/parsefunction/getUserDetails.js index 96f403be4..970d50f22 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getContractUser.js +++ b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js @@ -1,4 +1,4 @@ -async function getContractUser(request) { +async function getUserDetails(request) { try { const userQuery = new Parse.Query('contracts_Users'); userQuery.equalTo('Email', request.params.email); @@ -9,4 +9,4 @@ async function getContractUser(request) { return err; } } -export default getContractUser; +export default getUserDetails; From 2b67af609755a26d9738f70329f718ceef112f6e Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 16 Nov 2023 11:09:56 +0530 Subject: [PATCH 04/11] change create, update clp of contracts_Users class --- .../migrations/20231110174122-create_setclp.cjs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs b/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs index b3a670318..786c506af 100644 --- a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs +++ b/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs @@ -18,22 +18,21 @@ exports.up = async Parse => { schema.addString('Next_billing_date'); schema.addBoolean('IsContactEntry'); schema.addBoolean('ShareWithTeam'); - schema.addPointer('TenantId', "partners_Tenant") - schema.addPointer('UserId', "_User") - schema.addPointer("CreatedBy", "_User") + schema.addPointer('TenantId', 'partners_Tenant'); + schema.addPointer('UserId', '_User'); + schema.addPointer('CreatedBy', '_User'); schema.setCLP({ get: {}, find: {}, count: {}, - create: {}, - update: {}, + create: { '*': true }, + update: { '*': true }, delete: {}, addField: {}, }); return schema.save(); - // const config = new Config(process.env.APP_ID, process.env.PARSE_MOUNT); // const schema = await config.database.loadSchema(); // await schema.setPermissions('myclass', { From 3ad58ee52bc2b438d440a75ced8a75a661b1c49f Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 16 Nov 2023 11:16:28 +0530 Subject: [PATCH 05/11] 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 4a3276f4e3768b38e8bf7caacea02abf788c1778 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 Nov 2023 18:07:26 +0530 Subject: [PATCH 06/11] 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 07/11] rename file from create_setclp to update_setclp --- ...0174122-create_setclp.cjs => 20231110174122-update_setclp.cjs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/OpenSignServer/databases/migrations/{20231110174122-create_setclp.cjs => 20231110174122-update_setclp.cjs} (100%) diff --git a/apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs b/apps/OpenSignServer/databases/migrations/20231110174122-update_setclp.cjs similarity index 100% rename from apps/OpenSignServer/databases/migrations/20231110174122-create_setclp.cjs rename to apps/OpenSignServer/databases/migrations/20231110174122-update_setclp.cjs From 11d3e6c696b9710821f7c1a98e556f7393050411 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 Nov 2023 19:36:11 +0530 Subject: [PATCH 08/11] migration db changes --- apps/OpenSignServer/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 676d7ce31..16445d99c 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -183,7 +183,7 @@ if (!process.env.TESTING) { httpServer.headersTimeout = 100000; // in milliseconds httpServer.listen(port, function () { console.log('parse-server-example running on port ' + port + '.'); - const migrate = `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=${process.env.SERVER_URL} MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; + const migrate = `APPLICATION_ID=${process.env.APP_ID} SERVER_URL=http://localhost:8080/app MASTER_KEY=${process.env.MASTER_KEY} npx parse-dbtool migrate`; exec(migrate, (error, stdout, stderr) => { if (error) { From cdfc952a3fdacd6270bbad93a25206b9161c8d3c Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 17 Nov 2023 20:00:43 +0530 Subject: [PATCH 09/11] 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 ed6f44fd6247c3840da9058d0fc0419694263183 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Mon, 20 Nov 2023 10:42:20 +0530 Subject: [PATCH 10/11] 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 11/11] 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);