Skip to content

Commit f7b3940

Browse files
Merge pull request #1692 from OpenSignLabs/updates-14590419587
fix: normalize emails, migrate user logic to cloud function
2 parents 216288f + 6283524 commit f7b3940

File tree

6 files changed

+154
-153
lines changed

6 files changed

+154
-153
lines changed

apps/OpenSign/src/components/AddSigner.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const AddSigner = (props) => {
2424
if (savedUserDetails && addYourself) {
2525
setName(savedUserDetails.name);
2626
setPhone(savedUserDetails?.phone || "");
27-
setEmail(savedUserDetails.email);
27+
setEmail(savedUserDetails.email?.toLowerCase()?.replace(/\s/g, ""));
2828
}
2929
}, [addYourself]);
3030

apps/OpenSign/src/components/AddUser.js

Lines changed: 35 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -75,156 +75,46 @@ const AddUser = (props) => {
7575
setIsFormLoader(false);
7676
} else {
7777
if (localStorage.getItem("TenantId")) {
78+
const timezone = usertimezone;
7879
try {
79-
const extUser = new Parse.Object("contracts_Users");
80-
extUser.set("Name", formdata.name);
81-
if (formdata.phone) {
82-
extUser.set("Phone", formdata.phone);
83-
}
84-
extUser.set("Email", formdata.email);
85-
extUser.set("UserRole", `contracts_${formdata.role}`);
86-
if (formdata?.team) {
87-
extUser.set("TeamIds", [
88-
{
89-
__type: "Pointer",
90-
className: "contracts_Teams",
91-
objectId: formdata.team
92-
}
93-
]);
94-
}
95-
if (localUser && localUser.OrganizationId) {
96-
extUser.set("OrganizationId", {
97-
__type: "Pointer",
98-
className: "contracts_Organizations",
99-
objectId: localUser.OrganizationId.objectId
100-
});
101-
}
102-
if (localUser && localUser.Company) {
103-
extUser.set("Company", localUser.Company);
104-
}
105-
106-
if (localStorage.getItem("TenantId")) {
107-
extUser.set("TenantId", {
108-
__type: "Pointer",
109-
className: "partners_Tenant",
110-
objectId: localStorage.getItem("TenantId")
111-
});
112-
}
113-
const timezone = usertimezone;
114-
if (timezone) {
115-
extUser.set("Timezone", timezone);
116-
}
117-
try {
118-
const _users = Parse.Object.extend("User");
119-
const _user = new _users();
120-
_user.set("name", formdata.name);
121-
_user.set("username", formdata.email);
122-
_user.set("email", formdata.email);
123-
_user.set("password", formdata.password);
124-
if (formdata.phone) {
125-
_user.set("phone", formdata.phone);
80+
const params = {
81+
name: formdata.name,
82+
email: formdata.email,
83+
phone: formdata.phone,
84+
password: formdata.password,
85+
role: formdata.role,
86+
team: formdata.team,
87+
timezone: timezone,
88+
tenantId: localStorage.getItem("TenantId"),
89+
organization: {
90+
objectId: localUser?.OrganizationId?.objectId,
91+
company: localUser?.Company
12692
}
127-
128-
const user = await _user.save();
129-
if (user) {
130-
const currentUser = Parse.User.current();
131-
extUser.set(
132-
"CreatedBy",
133-
Parse.User.createWithoutData(currentUser.id)
134-
);
135-
136-
extUser.set("UserId", user);
137-
const acl = new Parse.ACL();
138-
acl.setPublicReadAccess(true);
139-
acl.setPublicWriteAccess(true);
140-
acl.setReadAccess(currentUser.id, true);
141-
acl.setWriteAccess(currentUser.id, true);
142-
143-
extUser.setACL(acl);
144-
145-
const res = await extUser.save();
146-
147-
const parseData = JSON.parse(JSON.stringify(res));
148-
149-
if (props.closePopup) {
150-
props.closePopup();
151-
}
152-
if (props.handleUserData) {
153-
if (formdata?.team) {
154-
const team = teamList.find(
155-
(x) => x.objectId === formdata.team
156-
);
157-
parseData.TeamIds = parseData.TeamIds.map((y) =>
158-
y.objectId === team.objectId ? team : y
159-
);
160-
}
161-
props.handleUserData(parseData);
162-
}
163-
164-
setIsFormLoader(false);
165-
setFormdata({
166-
name: "",
167-
email: "",
168-
phone: "",
169-
team: "",
170-
role: ""
171-
});
172-
props.showAlert("success", t("user-created-successfully"));
173-
}
174-
} catch (err) {
175-
console.log("err ", err);
176-
if (err.code === 202) {
177-
const params = { email: formdata.email };
178-
const userRes = await Parse.Cloud.run("getUserId", params);
179-
const currentUser = Parse.User.current();
180-
extUser.set(
181-
"CreatedBy",
182-
Parse.User.createWithoutData(currentUser.id)
93+
};
94+
const res = await Parse.Cloud.run("adduser", params);
95+
const parseData = JSON.parse(JSON.stringify(res));
96+
console.log("parseData ", parseData);
97+
if (props.closePopup) {
98+
props.closePopup();
99+
}
100+
if (props.handleUserData) {
101+
if (formdata?.team) {
102+
const team = teamList.find((x) => x.objectId === formdata.team);
103+
parseData.TeamIds = parseData.TeamIds.map((y) =>
104+
y.objectId === team.objectId ? team : y
183105
);
184-
185-
extUser.set("UserId", {
186-
__type: "Pointer",
187-
className: "_User",
188-
objectId: userRes.id
189-
});
190-
const acl = new Parse.ACL();
191-
acl.setPublicReadAccess(true);
192-
acl.setPublicWriteAccess(true);
193-
acl.setReadAccess(currentUser.id, true);
194-
acl.setWriteAccess(currentUser.id, true);
195-
196-
extUser.setACL(acl);
197-
const res = await extUser.save();
198-
199-
const parseData = JSON.parse(JSON.stringify(res));
200-
if (props.closePopup) {
201-
props.closePopup();
202-
}
203-
if (props.handleUserData) {
204-
if (formdata?.team) {
205-
const team = teamList.find(
206-
(x) => x.objectId === formdata.team
207-
);
208-
parseData.TeamIds = parseData.TeamIds.map((y) =>
209-
y.objectId === team.objectId ? team : y
210-
);
211-
}
212-
props.handleUserData(parseData);
213-
}
214-
setIsFormLoader(false);
215-
setFormdata({
216-
name: "",
217-
email: "",
218-
phone: "",
219-
team: "",
220-
role: ""
221-
});
222-
props.showAlert("success", t("user-created-successfully"));
223-
} else {
224-
setIsFormLoader(false);
225-
props.showAlert("danger", t("something-went-wrong-mssg"));
226106
}
107+
props.handleUserData(parseData);
227108
}
109+
setIsFormLoader(false);
110+
setFormdata({
111+
name: "",
112+
email: "",
113+
phone: "",
114+
team: "",
115+
role: ""
116+
});
117+
props.showAlert("success", t("user-created-successfully"));
228118
} catch (err) {
229119
console.log("err", err);
230120
setIsFormLoader(false);

apps/OpenSign/src/pages/AddAdmin.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ import { useTranslation } from "react-i18next";
1616
import { emailRegex } from "../constant/const";
1717

1818
const AddAdmin = () => {
19-
const appName =
20-
"OpenSign™";
19+
const appName = "OpenSign™";
2120
const { t, i18n } = useTranslation();
2221
const navigate = useNavigate();
2322
const dispatch = useDispatch();
@@ -96,7 +95,7 @@ const AddAdmin = () => {
9695
setState({ loading: true });
9796
const userDetails = {
9897
name: name,
99-
email: email,
98+
email: email?.toLowerCase()?.replace(/\s/g, ""),
10099
phone: phone,
101100
company: company,
102101
jobTitle: jobTitle
@@ -106,18 +105,18 @@ const AddAdmin = () => {
106105
event.preventDefault();
107106
const user = new Parse.User();
108107
user.set("name", name);
109-
user.set("email", email);
108+
user.set("email", email?.toLowerCase()?.replace(/\s/g, ""));
110109
user.set("password", password);
111110
user.set("phone", phone);
112-
user.set("username", email);
111+
user.set("username", email?.toLowerCase()?.replace(/\s/g, ""));
113112
const userRes = await user.save();
114113
if (userRes) {
115114
const params = {
116115
userDetails: {
117116
jobTitle: jobTitle,
118117
company: company,
119118
name: name,
120-
email: email,
119+
email: email?.toLowerCase()?.replace(/\s/g, ""),
121120
phone: phone,
122121
role: "contracts_Admin",
123122
timezone: usertimezone

apps/OpenSignServer/auth/authadapter.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ export const SSOAuth = {
1111
Authorization: `Bearer ${authData.access_token}`,
1212
},
1313
});
14-
if (response.data && response.data.id && response.data.email === authData.id) {
14+
if (
15+
response.data &&
16+
response.data.id &&
17+
response.data.email?.toLowerCase()?.replace(/\s/g, '') === authData.id
18+
) {
1519
return;
1620
}
1721
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'SSO auth is invalid for this user.');

apps/OpenSignServer/cloud/main.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import forwardDoc from './parsefunction/ForwardDoc.js';
5252
import saveAsTemplate from './parsefunction/saveAsTemplate.js';
5353
import updateTenant from './parsefunction/updateTenant.js';
5454
import recreateDocument from './parsefunction/recreateDocument.js';
55+
import addUser from './parsefunction/addUser.js';
5556

5657
// This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic.
5758
Parse.Cloud.afterSave('contracts_Document', DocumentAftersave);
@@ -114,3 +115,4 @@ Parse.Cloud.define('forwarddoc', forwardDoc);
114115
Parse.Cloud.define('saveastemplate', saveAsTemplate);
115116
Parse.Cloud.define('updatetenant', updateTenant);
116117
Parse.Cloud.define('recreatedoc', recreateDocument);
118+
Parse.Cloud.define('adduser', addUser);
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
export default async function addUser(request) {
2+
const { phone, name, password, organization, team, tenantId, timezone, role } = request.params;
3+
const email = request.params?.email?.toLowerCase()?.replace(/\s/g, '');
4+
if (!request.user) {
5+
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'Invalid session token.');
6+
}
7+
const currentUser = { __type: 'Pointer', className: '_User', objectId: request.user.id };
8+
if (name && email && password && organization && team && role && tenantId) {
9+
try {
10+
const extUser = new Parse.Object('contracts_Users');
11+
extUser.set('Name', name);
12+
if (phone) {
13+
extUser.set('Phone', phone);
14+
}
15+
extUser.set('Email', email);
16+
extUser.set('UserRole', `contracts_${role}`);
17+
if (team) {
18+
extUser.set('TeamIds', [
19+
{
20+
__type: 'Pointer',
21+
className: 'contracts_Teams',
22+
objectId: team,
23+
},
24+
]);
25+
}
26+
if (organization.objectId) {
27+
extUser.set('OrganizationId', {
28+
__type: 'Pointer',
29+
className: 'contracts_Organizations',
30+
objectId: organization.objectId,
31+
});
32+
}
33+
if (organization.company) {
34+
extUser.set('Company', organization.company);
35+
}
36+
37+
if (tenantId) {
38+
extUser.set('TenantId', {
39+
__type: 'Pointer',
40+
className: 'partners_Tenant',
41+
objectId: tenantId,
42+
});
43+
}
44+
if (timezone) {
45+
extUser.set('Timezone', timezone);
46+
}
47+
try {
48+
const _users = Parse.Object.extend('User');
49+
const _user = new _users();
50+
_user.set('name', name);
51+
_user.set('username', email);
52+
_user.set('email', email);
53+
_user.set('password', password);
54+
if (phone) {
55+
_user.set('phone', phone);
56+
}
57+
58+
const user = await _user.save();
59+
if (user) {
60+
extUser.set('CreatedBy', currentUser);
61+
62+
extUser.set('UserId', user);
63+
const acl = new Parse.ACL();
64+
acl.setPublicReadAccess(true);
65+
acl.setPublicWriteAccess(true);
66+
acl.setReadAccess(request.user.id, true);
67+
acl.setWriteAccess(request.user.id, true);
68+
extUser.setACL(acl);
69+
const extUserRes = await extUser.save();
70+
71+
const parseData = JSON.parse(JSON.stringify(extUserRes));
72+
return parseData;
73+
}
74+
} catch (err) {
75+
console.log('err ', err);
76+
if (err.code === 202) {
77+
const userQuery = new Parse.Query(Parse.User);
78+
userQuery.equalTo('email', email);
79+
const userRes = await userQuery.first({ useMasterKey: true });
80+
userRes.setPassword(password);
81+
await userRes.save(null, { useMasterKey: true });
82+
extUser.set('CreatedBy', currentUser);
83+
extUser.set('UserId', { __type: 'Pointer', className: '_User', objectId: userRes.id });
84+
const acl = new Parse.ACL();
85+
acl.setPublicReadAccess(true);
86+
acl.setPublicWriteAccess(true);
87+
acl.setReadAccess(request.user.id, true);
88+
acl.setWriteAccess(request.user.id, true);
89+
90+
extUser.setACL(acl);
91+
const res = await extUser.save();
92+
93+
const parseData = JSON.parse(JSON.stringify(res));
94+
return parseData;
95+
} else {
96+
throw new Parse.Error(400, err?.message || 'something went wrong');
97+
}
98+
}
99+
} catch (err) {
100+
console.log('err', err);
101+
throw new Parse.Error(400, err?.message || 'something went wrong');
102+
}
103+
} else {
104+
throw new Parse.Error(400, 'Please provide all required fields.');
105+
}
106+
}

0 commit comments

Comments
 (0)