shuttlepro-shared 1.2.74 → 1.2.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -5,109 +5,43 @@ const defaultSelect =
|
|
|
5
5
|
"iconUrl thumbUrl name productsCount ordersCount contact email address websiteUrl facebookUrl twitterUrl instagramUrl members defaultModule";
|
|
6
6
|
|
|
7
7
|
// Cache keys
|
|
8
|
-
const
|
|
8
|
+
const MEMBERS = "members";
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
// Update the cache for all members
|
|
11
|
+
const updateCachedMembers = async (workspaceId) => {
|
|
11
12
|
try {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
members = members?.filter((m) => m?.userId && m?.roleId) || [];
|
|
31
|
-
await setRedisData(CACHE_KEY_ALL_MEMBERS, members);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const userIdFilter = filter.userId
|
|
35
|
-
? new Set(
|
|
36
|
-
Array.isArray(filter.userId)
|
|
37
|
-
? filter.userId.map((id) => id.toString())
|
|
38
|
-
: [filter.userId.toString()]
|
|
39
|
-
)
|
|
40
|
-
: null;
|
|
41
|
-
|
|
42
|
-
const roleIdFilter = filter.roleId
|
|
43
|
-
? Array.isArray(filter.roleId)
|
|
44
|
-
? new Set(filter.roleId.map((id) => id.toString()))
|
|
45
|
-
: typeof filter.roleId === "object"
|
|
46
|
-
? filter.roleId
|
|
47
|
-
: new Set([filter.roleId.toString()])
|
|
48
|
-
: null;
|
|
49
|
-
|
|
50
|
-
return members.filter((member) => {
|
|
51
|
-
// Optimize userId filter
|
|
52
|
-
if (userIdFilter && !userIdFilter.has(member.userId?._id?.toString())) {
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Optimize roleId filter
|
|
57
|
-
if (roleIdFilter) {
|
|
58
|
-
if (roleIdFilter instanceof Set) {
|
|
59
|
-
const roleIdStr =
|
|
60
|
-
member.roleId?._id?.toString() ?? member.roleId?.id?.toString();
|
|
61
|
-
if (!roleIdFilter.has(roleIdStr)) return false;
|
|
62
|
-
} else if (typeof roleIdFilter === "object") {
|
|
63
|
-
for (const [key, value] of Object.entries(roleIdFilter)) {
|
|
64
|
-
const roleVal = key.includes(".")
|
|
65
|
-
? key.split(".").reduce((obj, k) => obj?.[k], member.roleId)
|
|
66
|
-
: member.roleId?.[key];
|
|
67
|
-
if (Array.isArray(value)) {
|
|
68
|
-
if (!value.includes(roleVal)) return false;
|
|
69
|
-
} else if (roleVal !== value) {
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// General filters
|
|
77
|
-
for (const [key, value] of Object.entries(filter)) {
|
|
78
|
-
if (key === "userId" || key === "roleId") continue;
|
|
79
|
-
|
|
80
|
-
const memberValue = key.includes(".")
|
|
81
|
-
? key.split(".").reduce((obj, prop) => obj?.[prop], member)
|
|
82
|
-
: member[key];
|
|
83
|
-
|
|
84
|
-
if (Array.isArray(value)) {
|
|
85
|
-
if (!value.includes(memberValue)) return false;
|
|
86
|
-
} else if (typeof value === "object" && value !== null) {
|
|
87
|
-
for (const [subKey, subVal] of Object.entries(value)) {
|
|
88
|
-
if (memberValue?.[subKey] !== subVal) return false;
|
|
89
|
-
}
|
|
90
|
-
} else {
|
|
91
|
-
if (memberValue !== value) return false;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return true;
|
|
96
|
-
});
|
|
13
|
+
const members = await UserRole.find({ workspaceId })
|
|
14
|
+
.select("userId role userShift roleId isOwner workspaceId")
|
|
15
|
+
.populate({
|
|
16
|
+
path: "roleId",
|
|
17
|
+
select:
|
|
18
|
+
"id name userId userShift permissionId modulePermissions workspaceId",
|
|
19
|
+
populate: [{ path: "permissionId", select: "id name" }],
|
|
20
|
+
})
|
|
21
|
+
.populate({
|
|
22
|
+
path: "userId",
|
|
23
|
+
match: { isDeleted: false, suspended: false },
|
|
24
|
+
select: "firstName lastName role email picture userShift",
|
|
25
|
+
})
|
|
26
|
+
.lean()
|
|
27
|
+
.exec();
|
|
28
|
+
await setRedisData(workspaceId, members, MEMBERS, 3600);
|
|
29
|
+
return members;
|
|
97
30
|
} catch (error) {
|
|
98
|
-
console.error("Error
|
|
31
|
+
console.error("Error updating cached members:", error);
|
|
99
32
|
return [];
|
|
100
33
|
}
|
|
101
34
|
};
|
|
102
35
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
.select("userId role userShift roleId")
|
|
36
|
+
const getMembers = async (workspaceId) => {
|
|
37
|
+
let members = await getRedisData(workspaceId, MEMBERS);
|
|
38
|
+
if (!members || members?.length === 0) {
|
|
39
|
+
members = await UserRole.find({ workspaceId })
|
|
40
|
+
.select("userId role userShift roleId isOwner workspaceId")
|
|
108
41
|
.populate({
|
|
109
42
|
path: "roleId",
|
|
110
|
-
select:
|
|
43
|
+
select:
|
|
44
|
+
"id name userId userShift permissionId modulePermissions workspaceId",
|
|
111
45
|
populate: [{ path: "permissionId", select: "id name" }],
|
|
112
46
|
})
|
|
113
47
|
.populate({
|
|
@@ -117,62 +51,59 @@ const updateCachedMembers = async (filter = {}) => {
|
|
|
117
51
|
})
|
|
118
52
|
.lean()
|
|
119
53
|
.exec();
|
|
54
|
+
await setRedisData(workspaceId, members, MEMBERS, 3600);
|
|
55
|
+
}
|
|
56
|
+
return members;
|
|
57
|
+
};
|
|
120
58
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
59
|
+
const getMemberByWorkspaceIdAndUserId = async (workspaceId, userId) => {
|
|
60
|
+
const members = getMembers(workspaceId);
|
|
61
|
+
return (
|
|
62
|
+
members?.find(
|
|
63
|
+
(member) =>
|
|
64
|
+
member?.workspaceId === workspaceId && member?.userId?._id === userId
|
|
65
|
+
) || null
|
|
66
|
+
);
|
|
67
|
+
};
|
|
125
68
|
|
|
126
|
-
|
|
69
|
+
// Find single user role by filter
|
|
70
|
+
const findSingleUserRoleByFilter = async ({ workspaceId, userId }) => {
|
|
71
|
+
return await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
|
|
72
|
+
};
|
|
127
73
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
console.error("Error updating cached members:", error);
|
|
131
|
-
return [];
|
|
132
|
-
}
|
|
74
|
+
const findUserRole = async ({ workspaceId, userId }) => {
|
|
75
|
+
return await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
|
|
133
76
|
};
|
|
134
77
|
|
|
135
|
-
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
await updateCachedMembers();
|
|
139
|
-
} catch (error) {
|
|
140
|
-
console.error("Error updating related caches:", error);
|
|
141
|
-
}
|
|
78
|
+
const createUserRole = async (data) => {
|
|
79
|
+
const savedRole = await UserRole.create(data);
|
|
80
|
+
return await updateCachedMembers(savedRole?.workspaceId?.toString());
|
|
142
81
|
};
|
|
143
82
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
userPopulate: {
|
|
156
|
-
path: "userId",
|
|
157
|
-
match: { isDeleted: false, suspended: false },
|
|
158
|
-
select: "firstName lastName role email picture userShift",
|
|
159
|
-
},
|
|
160
|
-
};
|
|
161
|
-
const mergedPopulateOptions = {
|
|
162
|
-
rolePopulate: {
|
|
163
|
-
...defaultPopulateOptions.rolePopulate,
|
|
164
|
-
...populateOptions.rolePopulate,
|
|
165
|
-
},
|
|
166
|
-
userPopulate: {
|
|
167
|
-
...defaultPopulateOptions.userPopulate,
|
|
168
|
-
...populateOptions.userPopulate,
|
|
169
|
-
},
|
|
170
|
-
};
|
|
171
|
-
return await UserRole.findOne(filter)
|
|
172
|
-
.populate(mergedPopulateOptions.rolePopulate)
|
|
173
|
-
.populate(mergedPopulateOptions.userPopulate)
|
|
83
|
+
const findOneAndUpdateUserRole = async ({
|
|
84
|
+
workspaceId,
|
|
85
|
+
userId,
|
|
86
|
+
userShift,
|
|
87
|
+
role,
|
|
88
|
+
}) => {
|
|
89
|
+
await UserRole.findOneAndUpdate(
|
|
90
|
+
{ workspaceId, userId },
|
|
91
|
+
{ $set: { userShift, role } },
|
|
92
|
+
{ new: true, upsert: false }
|
|
93
|
+
)
|
|
174
94
|
.lean()
|
|
175
95
|
.exec();
|
|
96
|
+
return await updateCachedMembers(workspaceId);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const updateUserRole = async (filter, payload) => {
|
|
100
|
+
await UserRole.updateOne(filter, payload).exec();
|
|
101
|
+
return await updateCachedMembers(filter.workspaceId);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const deleteUserRoleByFilter = async (filter) => {
|
|
105
|
+
await UserRole.deleteOne(filter).exec();
|
|
106
|
+
return await updateCachedMembers(filter.workspaceId);
|
|
176
107
|
};
|
|
177
108
|
|
|
178
109
|
const convertPermissionsArrayToObject = (originalArray) => {
|
|
@@ -198,107 +129,13 @@ const convertPermissionsArrayToObject = (originalArray) => {
|
|
|
198
129
|
}, {});
|
|
199
130
|
};
|
|
200
131
|
|
|
201
|
-
const createUserRole = async (data) => {
|
|
202
|
-
const savedRole = await UserRole.create(data);
|
|
203
|
-
|
|
204
|
-
console.log(savedRole, "savedRole");
|
|
205
|
-
|
|
206
|
-
// Update all related caches
|
|
207
|
-
await updateAllRelatedCaches(
|
|
208
|
-
savedRole?.userId?.toString(),
|
|
209
|
-
savedRole?.workspaceId?.toString()
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
return savedRole;
|
|
213
|
-
};
|
|
214
|
-
|
|
215
|
-
const findOneAndUpdateUserRole = async ({
|
|
216
|
-
workspaceId,
|
|
217
|
-
userId,
|
|
218
|
-
userShift,
|
|
219
|
-
role,
|
|
220
|
-
}) => {
|
|
221
|
-
const updatedRole = await UserRole.findOneAndUpdate(
|
|
222
|
-
{ workspaceId, userId },
|
|
223
|
-
{ $set: { userShift, role } },
|
|
224
|
-
{ new: true, upsert: false }
|
|
225
|
-
).exec();
|
|
226
|
-
if (updatedRole) {
|
|
227
|
-
await updateAllRelatedCaches(userId, workspaceId);
|
|
228
|
-
}
|
|
229
|
-
return updatedRole;
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
const findUserRole = async (filter = {}) => {
|
|
233
|
-
return await getCachedMembers(filter);
|
|
234
|
-
};
|
|
235
|
-
|
|
236
|
-
const updateUserRole = async (id, data) => {
|
|
237
|
-
const updatedRole = await UserRole.findByIdAndUpdate(id, data, {
|
|
238
|
-
new: true,
|
|
239
|
-
}).exec();
|
|
240
|
-
if (updatedRole) {
|
|
241
|
-
await updateAllRelatedCaches(updatedRole.userId, updatedRole.workspaceId);
|
|
242
|
-
}
|
|
243
|
-
return updatedRole;
|
|
244
|
-
};
|
|
245
|
-
|
|
246
|
-
const deleteUserRoleByFilter = async (filter) => {
|
|
247
|
-
const deletedRole = await UserRole.findOneAndDelete(filter).exec();
|
|
248
|
-
if (deletedRole) {
|
|
249
|
-
await updateAllRelatedCaches(filter?.userId, filter?.workspaceId);
|
|
250
|
-
}
|
|
251
|
-
return deletedRole;
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
const deleteUserRole = async (id) => {
|
|
255
|
-
const role = await UserRole.findById(id).exec();
|
|
256
|
-
const userId = role?.userId;
|
|
257
|
-
const workspaceId = role?.workspaceId;
|
|
258
|
-
const deletedRole = await UserRole.findByIdAndDelete(id).exec();
|
|
259
|
-
if (deletedRole) {
|
|
260
|
-
await updateAllRelatedCaches(userId, workspaceId);
|
|
261
|
-
}
|
|
262
|
-
return deletedRole;
|
|
263
|
-
};
|
|
264
|
-
|
|
265
|
-
const findUserWorkspaces = async (userId) => {
|
|
266
|
-
let userRoleWithWorkspaces = await UserRole.find({ userId: userId })
|
|
267
|
-
.select("userId roleId workspaceId")
|
|
268
|
-
.populate({
|
|
269
|
-
path: "roleId",
|
|
270
|
-
select: "id name userId userShift permissionId modulePermissions",
|
|
271
|
-
populate: [{ path: "permissionId", select: "id name" }],
|
|
272
|
-
})
|
|
273
|
-
.populate({
|
|
274
|
-
path: "workspaceId",
|
|
275
|
-
select: defaultSelect,
|
|
276
|
-
match: { isDeleted: false },
|
|
277
|
-
})
|
|
278
|
-
.lean()
|
|
279
|
-
.exec();
|
|
280
|
-
userRoleWithWorkspaces = userRoleWithWorkspaces
|
|
281
|
-
?.filter((userRole) => userRole?.workspaceId)
|
|
282
|
-
?.filter((userRole) => userRole?.roleId)
|
|
283
|
-
?.map((ur) => {
|
|
284
|
-
return {
|
|
285
|
-
...ur?.workspaceId,
|
|
286
|
-
id: ur?.workspaceId?._id?.toString(),
|
|
287
|
-
_id: ur?.workspaceId?._id?.toString(),
|
|
288
|
-
role: ur?.roleId?.name || "",
|
|
289
|
-
permissions: ur?.roleId?.modulePermissions?.modules || [],
|
|
290
|
-
};
|
|
291
|
-
});
|
|
292
|
-
return userRoleWithWorkspaces || [];
|
|
293
|
-
};
|
|
294
|
-
|
|
295
132
|
const getUserPermissions = async (workspaceId, userId) => {
|
|
296
133
|
try {
|
|
297
|
-
let
|
|
298
|
-
if (
|
|
134
|
+
let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
|
|
135
|
+
if (data) {
|
|
299
136
|
return (
|
|
300
137
|
convertPermissionsArrayToObject(
|
|
301
|
-
|
|
138
|
+
data?.roleId?.modulePermissions?.modules
|
|
302
139
|
) || null
|
|
303
140
|
);
|
|
304
141
|
}
|
|
@@ -311,9 +148,8 @@ const getUserPermissions = async (workspaceId, userId) => {
|
|
|
311
148
|
|
|
312
149
|
const getUserRoleWithPermissions = async (workspaceId, userId) => {
|
|
313
150
|
try {
|
|
314
|
-
let
|
|
315
|
-
if (
|
|
316
|
-
let data = members?.[0];
|
|
151
|
+
let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
|
|
152
|
+
if (data) {
|
|
317
153
|
const roleWithPermissions = {
|
|
318
154
|
...data,
|
|
319
155
|
roleId: data?.roleId?._id?.toString() || "",
|
|
@@ -337,9 +173,8 @@ const getUserRoleWithPermissions = async (workspaceId, userId) => {
|
|
|
337
173
|
|
|
338
174
|
const getChannelsPermissions = async (workspaceId, userId) => {
|
|
339
175
|
try {
|
|
340
|
-
let
|
|
341
|
-
if (
|
|
342
|
-
let data = members?.[0];
|
|
176
|
+
let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
|
|
177
|
+
if (data) {
|
|
343
178
|
return (
|
|
344
179
|
convertPermissionsArrayToObject(
|
|
345
180
|
data?.roleId?.modulePermissions?.modules
|
|
@@ -353,12 +188,41 @@ const getChannelsPermissions = async (workspaceId, userId) => {
|
|
|
353
188
|
}
|
|
354
189
|
};
|
|
355
190
|
|
|
191
|
+
const findUserWorkspaces = async (userId) => {
|
|
192
|
+
let userRoleWithWorkspaces = await UserRole.find({ userId: userId })
|
|
193
|
+
.select("userId roleId workspaceId")
|
|
194
|
+
.populate({
|
|
195
|
+
path: "roleId",
|
|
196
|
+
select: "id name userId userShift permissionId modulePermissions",
|
|
197
|
+
populate: [{ path: "permissionId", select: "id name" }],
|
|
198
|
+
})
|
|
199
|
+
.populate({
|
|
200
|
+
path: "workspaceId",
|
|
201
|
+
select: defaultSelect,
|
|
202
|
+
match: { isDeleted: false },
|
|
203
|
+
})
|
|
204
|
+
.lean()
|
|
205
|
+
.exec();
|
|
206
|
+
userRoleWithWorkspaces = userRoleWithWorkspaces
|
|
207
|
+
?.filter((userRole) => userRole?.workspaceId)
|
|
208
|
+
?.filter((userRole) => userRole?.roleId)
|
|
209
|
+
?.map((ur) => {
|
|
210
|
+
return {
|
|
211
|
+
...ur?.workspaceId,
|
|
212
|
+
id: ur?.workspaceId?._id?.toString(),
|
|
213
|
+
_id: ur?.workspaceId?._id?.toString(),
|
|
214
|
+
role: ur?.roleId?.name || "",
|
|
215
|
+
permissions: ur?.roleId?.modulePermissions?.modules || [],
|
|
216
|
+
};
|
|
217
|
+
});
|
|
218
|
+
return userRoleWithWorkspaces || [];
|
|
219
|
+
};
|
|
220
|
+
|
|
356
221
|
module.exports = {
|
|
357
222
|
createUserRole,
|
|
358
|
-
findUserRole,
|
|
359
223
|
updateUserRole,
|
|
224
|
+
findUserRole,
|
|
360
225
|
deleteUserRoleByFilter,
|
|
361
|
-
deleteUserRole,
|
|
362
226
|
findUserWorkspaces,
|
|
363
227
|
getUserRoleWithPermissions,
|
|
364
228
|
getUserPermissions,
|