shuttlepro-shared 1.2.65 → 1.2.66
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.
|
@@ -1,409 +1,6 @@
|
|
|
1
|
-
// const { UserRole } = require("../../models/UserRole");
|
|
2
|
-
// const { getRedisData, setRedisData } = require("../../config/redis");
|
|
3
|
-
|
|
4
|
-
// const defaultSelect =
|
|
5
|
-
// "iconUrl thumbUrl name productsCount ordersCount contact email address websiteUrl facebookUrl twitterUrl instagramUrl members defaultModule";
|
|
6
|
-
|
|
7
|
-
// // Cache keys
|
|
8
|
-
// const CACHE_KEY_ALL_MEMBERS = "userroles_all_members";
|
|
9
|
-
// const CACHE_KEY_USER_WORKSPACE_PREFIX = "userrole_workspace_";
|
|
10
|
-
// const CACHE_KEY_USER_PERMISSIONS_PREFIX = "user_permissions_";
|
|
11
|
-
|
|
12
|
-
// // Comprehensive cache update method
|
|
13
|
-
// const updateAllRelatedCaches = async (userId, workspaceId) => {
|
|
14
|
-
// try {
|
|
15
|
-
// // Update all members cache
|
|
16
|
-
// await updateCachedMembers();
|
|
17
|
-
|
|
18
|
-
// // Clear user workspace cache
|
|
19
|
-
// if (userId) {
|
|
20
|
-
// await clearUserWorkspaceCache(userId);
|
|
21
|
-
// }
|
|
22
|
-
|
|
23
|
-
// // Clear user permissions cache
|
|
24
|
-
// if (workspaceId && userId) {
|
|
25
|
-
// await clearUserPermissionsCache(workspaceId, userId);
|
|
26
|
-
// }
|
|
27
|
-
// } catch (error) {
|
|
28
|
-
// console.error("Error updating related caches:", error);
|
|
29
|
-
// }
|
|
30
|
-
// };
|
|
31
|
-
|
|
32
|
-
// // Clear user workspace cache
|
|
33
|
-
// const clearUserWorkspaceCache = async (userId) => {
|
|
34
|
-
// await setRedisData(
|
|
35
|
-
// `${CACHE_KEY_USER_WORKSPACE_PREFIX}${userId}`,
|
|
36
|
-
// null,
|
|
37
|
-
// null,
|
|
38
|
-
// 0
|
|
39
|
-
// );
|
|
40
|
-
// };
|
|
41
|
-
|
|
42
|
-
// // Clear user permissions cache
|
|
43
|
-
// const clearUserPermissionsCache = async (workspaceId, userId) => {
|
|
44
|
-
// const cacheKey = `${CACHE_KEY_USER_PERMISSIONS_PREFIX}${workspaceId}_${userId}`;
|
|
45
|
-
// await setRedisData(cacheKey, null, null, 0);
|
|
46
|
-
// };
|
|
47
|
-
|
|
48
|
-
// // Get cached members
|
|
49
|
-
// const getCachedMembers = async (filter = {}) => {
|
|
50
|
-
// const cacheKey =
|
|
51
|
-
// Object.keys(filter).length > 0
|
|
52
|
-
// ? `${CACHE_KEY_ALL_MEMBERS}_${JSON.stringify(filter)}`
|
|
53
|
-
// : CACHE_KEY_ALL_MEMBERS;
|
|
54
|
-
|
|
55
|
-
// let members = await getRedisData(cacheKey);
|
|
56
|
-
|
|
57
|
-
// if (!members) {
|
|
58
|
-
// members = await UserRole.find(filter)
|
|
59
|
-
// .select("userId role userShift roleId")
|
|
60
|
-
// .populate({
|
|
61
|
-
// path: "roleId",
|
|
62
|
-
// select: "id name userId userShift permissionId modulePermissions",
|
|
63
|
-
// populate: [{ path: "permissionId", select: "id name" }],
|
|
64
|
-
// })
|
|
65
|
-
// .populate({
|
|
66
|
-
// path: "userId",
|
|
67
|
-
// match: { isDeleted: false, suspended: false },
|
|
68
|
-
// select: "firstName lastName role email picture userShift",
|
|
69
|
-
// })
|
|
70
|
-
// .lean()
|
|
71
|
-
// .exec();
|
|
72
|
-
|
|
73
|
-
// await setRedisData(
|
|
74
|
-
// cacheKey,
|
|
75
|
-
// members?.filter((member) => member?.userId && member?.roleId),
|
|
76
|
-
// null,
|
|
77
|
-
// 0
|
|
78
|
-
// );
|
|
79
|
-
// }
|
|
80
|
-
|
|
81
|
-
// return members;
|
|
82
|
-
// };
|
|
83
|
-
|
|
84
|
-
// // Update the cache for all members
|
|
85
|
-
// const updateCachedMembers = async (filter = {}) => {
|
|
86
|
-
// const cacheKey =
|
|
87
|
-
// Object.keys(filter).length > 0
|
|
88
|
-
// ? `${CACHE_KEY_ALL_MEMBERS}_${JSON.stringify(filter)}`
|
|
89
|
-
// : CACHE_KEY_ALL_MEMBERS;
|
|
90
|
-
|
|
91
|
-
// const members = await UserRole.find(filter)
|
|
92
|
-
// .select("userId role userShift roleId")
|
|
93
|
-
// .populate({
|
|
94
|
-
// path: "roleId",
|
|
95
|
-
// select: "id name userId userShift permissionId modulePermissions",
|
|
96
|
-
// populate: [{ path: "permissionId", select: "id name" }],
|
|
97
|
-
// })
|
|
98
|
-
// .populate({
|
|
99
|
-
// path: "userId",
|
|
100
|
-
// match: { isDeleted: false, suspended: false },
|
|
101
|
-
// select: "firstName lastName role email picture userShift",
|
|
102
|
-
// })
|
|
103
|
-
// .lean()
|
|
104
|
-
// .exec();
|
|
105
|
-
|
|
106
|
-
// await setRedisData(
|
|
107
|
-
// cacheKey,
|
|
108
|
-
// members?.filter((member) => member?.userId && member?.roleId),
|
|
109
|
-
// null,
|
|
110
|
-
// 0
|
|
111
|
-
// );
|
|
112
|
-
// return members;
|
|
113
|
-
// };
|
|
114
|
-
|
|
115
|
-
// const createUserRole = async (data) => {
|
|
116
|
-
// const savedRole = await UserRole.create(data);
|
|
117
|
-
|
|
118
|
-
// // Update all related caches
|
|
119
|
-
// await updateAllRelatedCaches(
|
|
120
|
-
// savedRole?.userId?.toString(),
|
|
121
|
-
// savedRole?.workspaceId?.toString()
|
|
122
|
-
// );
|
|
123
|
-
|
|
124
|
-
// return savedRole;
|
|
125
|
-
// };
|
|
126
|
-
|
|
127
|
-
// const findUserRole = async (filter = {}) => {
|
|
128
|
-
// return await getCachedMembers(filter);
|
|
129
|
-
// };
|
|
130
|
-
|
|
131
|
-
// const updateUserRole = async (id, data) => {
|
|
132
|
-
// const updatedRole = await UserRole.findByIdAndUpdate(id, data, {
|
|
133
|
-
// new: true,
|
|
134
|
-
// }).exec();
|
|
135
|
-
|
|
136
|
-
// if (updatedRole) {
|
|
137
|
-
// // Update all related caches
|
|
138
|
-
// await updateAllRelatedCaches(updatedRole.userId, updatedRole.workspaceId);
|
|
139
|
-
// }
|
|
140
|
-
|
|
141
|
-
// return updatedRole;
|
|
142
|
-
// };
|
|
143
|
-
|
|
144
|
-
// const deleteUserRoleByFilter = async (filter) => {
|
|
145
|
-
// // Find the role before deleting to get userId and workspaceId
|
|
146
|
-
// const roleToDelete = await UserRole.findOne(filter).exec();
|
|
147
|
-
|
|
148
|
-
// const deletedRole = await UserRole.findOneAndDelete(filter).exec();
|
|
149
|
-
|
|
150
|
-
// if (deletedRole) {
|
|
151
|
-
// // Update all related caches
|
|
152
|
-
// await updateAllRelatedCaches(
|
|
153
|
-
// roleToDelete?.userId,
|
|
154
|
-
// roleToDelete?.workspaceId
|
|
155
|
-
// );
|
|
156
|
-
// }
|
|
157
|
-
|
|
158
|
-
// return deletedRole;
|
|
159
|
-
// };
|
|
160
|
-
|
|
161
|
-
// const deleteUserRole = async (id) => {
|
|
162
|
-
// const role = await UserRole.findById(id).exec();
|
|
163
|
-
// const userId = role?.userId;
|
|
164
|
-
// const workspaceId = role?.workspaceId;
|
|
165
|
-
|
|
166
|
-
// const deletedRole = await UserRole.findByIdAndDelete(id).exec();
|
|
167
|
-
|
|
168
|
-
// if (deletedRole) {
|
|
169
|
-
// // Update all related caches
|
|
170
|
-
// await updateAllRelatedCaches(userId, workspaceId);
|
|
171
|
-
// }
|
|
172
|
-
|
|
173
|
-
// return deletedRole;
|
|
174
|
-
// };
|
|
175
|
-
|
|
176
|
-
// const findUserWorkspaces = async (userId) => {
|
|
177
|
-
// const cacheKey = `${CACHE_KEY_USER_WORKSPACE_PREFIX}${userId}`;
|
|
178
|
-
// let userRoleWithWorkspaces = await getRedisData(cacheKey);
|
|
179
|
-
// if (!userRoleWithWorkspaces) {
|
|
180
|
-
// userRoleWithWorkspaces = await UserRole.find({
|
|
181
|
-
// userId: userId,
|
|
182
|
-
// })
|
|
183
|
-
// .select("userId roleId workspaceId")
|
|
184
|
-
// .populate({
|
|
185
|
-
// path: "roleId",
|
|
186
|
-
// select: "id name userId userShift permissionId modulePermissions",
|
|
187
|
-
// populate: [{ path: "permissionId", select: "id name" }],
|
|
188
|
-
// })
|
|
189
|
-
// .populate({
|
|
190
|
-
// path: "workspaceId",
|
|
191
|
-
// select: defaultSelect,
|
|
192
|
-
// match: { isDeleted: false },
|
|
193
|
-
// })
|
|
194
|
-
// .lean()
|
|
195
|
-
// .exec();
|
|
196
|
-
// userRoleWithWorkspaces = userRoleWithWorkspaces
|
|
197
|
-
// ?.filter((userRole) => userRole?.workspaceId)
|
|
198
|
-
// ?.map((ur) => {
|
|
199
|
-
// return {
|
|
200
|
-
// ...ur?.workspaceId,
|
|
201
|
-
// id: ur?.workspaceId?._id?.toString(),
|
|
202
|
-
// _id: ur?.workspaceId?._id?.toString(),
|
|
203
|
-
// role: ur?.roleId?.name || "",
|
|
204
|
-
// permissions: ur?.roleId?.modulePermissions?.modules || [],
|
|
205
|
-
// };
|
|
206
|
-
// });
|
|
207
|
-
// if (userRoleWithWorkspaces) {
|
|
208
|
-
// await setRedisData(cacheKey, userRoleWithWorkspaces, null, 0);
|
|
209
|
-
// }
|
|
210
|
-
// }
|
|
211
|
-
// return userRoleWithWorkspaces;
|
|
212
|
-
// };
|
|
213
|
-
|
|
214
|
-
// const convertPermissionsArrayToObject = (originalArray) => {
|
|
215
|
-
// return originalArray?.reduce((acc, item) => {
|
|
216
|
-
// const { id, actions, integrationPermissions, ...extras } = item;
|
|
217
|
-
// const formattedExtras = {};
|
|
218
|
-
// if (extras.deletable !== undefined) {
|
|
219
|
-
// formattedExtras.deletable = extras.deletable;
|
|
220
|
-
// }
|
|
221
|
-
// if (extras.createUpdateable !== undefined) {
|
|
222
|
-
// formattedExtras.createUpdateable = extras.createUpdateable;
|
|
223
|
-
// }
|
|
224
|
-
// acc[id] = {
|
|
225
|
-
// actions: Object.keys(actions).filter((action) => actions[action]),
|
|
226
|
-
// ...formattedExtras,
|
|
227
|
-
// ...(integrationPermissions && {
|
|
228
|
-
// integrationPermissions: Object.entries(integrationPermissions)
|
|
229
|
-
// .filter(([_, allowed]) => allowed)
|
|
230
|
-
// .map(([key]) => key),
|
|
231
|
-
// }),
|
|
232
|
-
// };
|
|
233
|
-
// return acc;
|
|
234
|
-
// }, {});
|
|
235
|
-
// };
|
|
236
|
-
|
|
237
|
-
// const getUserRoleWithPermissions = async (workspaceId, userId) => {
|
|
238
|
-
// const cacheKey = `${CACHE_KEY_USER_PERMISSIONS_PREFIX}${workspaceId}_${userId}`;
|
|
239
|
-
// let cachedData = await getRedisData(cacheKey);
|
|
240
|
-
|
|
241
|
-
// if (cachedData && cachedData.roleWithPermissions) {
|
|
242
|
-
// return cachedData.roleWithPermissions;
|
|
243
|
-
// }
|
|
244
|
-
|
|
245
|
-
// try {
|
|
246
|
-
// let data = await UserRole.findOne({
|
|
247
|
-
// workspaceId: workspaceId,
|
|
248
|
-
// userId: userId,
|
|
249
|
-
// })
|
|
250
|
-
// .populate({
|
|
251
|
-
// path: "roleId",
|
|
252
|
-
// select:
|
|
253
|
-
// "id name userId userShift permissionId modulePermissions defaultModule",
|
|
254
|
-
// populate: [{ path: "permissionId", select: "id name" }],
|
|
255
|
-
// })
|
|
256
|
-
// .lean()
|
|
257
|
-
// .exec();
|
|
258
|
-
|
|
259
|
-
// if (!data) {
|
|
260
|
-
// return null;
|
|
261
|
-
// }
|
|
262
|
-
|
|
263
|
-
// const roleWithPermissions = {
|
|
264
|
-
// ...data,
|
|
265
|
-
// roleId: data?.roleId?._id?.toString() || "",
|
|
266
|
-
// role: data?.roleId?.name || "",
|
|
267
|
-
// permissions:
|
|
268
|
-
// convertPermissionsArrayToObject(
|
|
269
|
-
// data?.roleId?.modulePermissions?.modules
|
|
270
|
-
// ) || [],
|
|
271
|
-
// parentRole: data?.roleId?.permissionId?.name || "",
|
|
272
|
-
// parentRoleId: data?.roleId?.permissionId?._id?.toString() || "",
|
|
273
|
-
// defaultModule: data?.roleId?.defaultModule || "",
|
|
274
|
-
// };
|
|
275
|
-
|
|
276
|
-
// // Store in cache with other permission data
|
|
277
|
-
// const permissionsData = cachedData || {};
|
|
278
|
-
// permissionsData.roleWithPermissions = roleWithPermissions;
|
|
279
|
-
// await setRedisData(cacheKey, permissionsData, null, 0);
|
|
280
|
-
|
|
281
|
-
// return roleWithPermissions;
|
|
282
|
-
// } catch (err) {
|
|
283
|
-
// console.error("Error in getUserRoleWithPermissions:", err);
|
|
284
|
-
// return null;
|
|
285
|
-
// }
|
|
286
|
-
// };
|
|
287
|
-
|
|
288
|
-
// const getUserPermissions = async (workspaceId, userId) => {
|
|
289
|
-
// const cacheKey = `${CACHE_KEY_USER_PERMISSIONS_PREFIX}${workspaceId}_${userId}`;
|
|
290
|
-
// let cachedData = await getRedisData(cacheKey);
|
|
291
|
-
|
|
292
|
-
// if (cachedData && cachedData.permissions) {
|
|
293
|
-
// return cachedData.permissions;
|
|
294
|
-
// }
|
|
295
|
-
|
|
296
|
-
// try {
|
|
297
|
-
// let data = await UserRole.findOne({
|
|
298
|
-
// workspaceId: workspaceId,
|
|
299
|
-
// userId: userId,
|
|
300
|
-
// })
|
|
301
|
-
// .select("roleId userId")
|
|
302
|
-
// .populate({
|
|
303
|
-
// path: "roleId",
|
|
304
|
-
// select: "modulePermissions",
|
|
305
|
-
// })
|
|
306
|
-
// .lean()
|
|
307
|
-
// .exec();
|
|
308
|
-
|
|
309
|
-
// if (!data) {
|
|
310
|
-
// return null;
|
|
311
|
-
// }
|
|
312
|
-
|
|
313
|
-
// const permissions =
|
|
314
|
-
// convertPermissionsArrayToObject(
|
|
315
|
-
// data?.roleId?.modulePermissions?.modules
|
|
316
|
-
// ) || null;
|
|
317
|
-
|
|
318
|
-
// // Store in cache with other permission data
|
|
319
|
-
// const permissionsData = cachedData || {};
|
|
320
|
-
// permissionsData.permissions = permissions;
|
|
321
|
-
// await setRedisData(cacheKey, permissionsData, null, 0);
|
|
322
|
-
|
|
323
|
-
// return permissions;
|
|
324
|
-
// } catch (err) {
|
|
325
|
-
// console.error("Error in getUserPermissions:", err);
|
|
326
|
-
// return null;
|
|
327
|
-
// }
|
|
328
|
-
// };
|
|
329
|
-
|
|
330
|
-
// const getChannelsPermissions = async (workspaceId, userId) => {
|
|
331
|
-
// const cacheKey = `${CACHE_KEY_USER_PERMISSIONS_PREFIX}${workspaceId}_${userId}`;
|
|
332
|
-
// let cachedData = await getRedisData(cacheKey);
|
|
333
|
-
|
|
334
|
-
// if (cachedData && cachedData.channelsPermissions) {
|
|
335
|
-
// return cachedData.channelsPermissions;
|
|
336
|
-
// }
|
|
337
|
-
|
|
338
|
-
// try {
|
|
339
|
-
// let data = await UserRole.findOne({
|
|
340
|
-
// workspaceId: workspaceId,
|
|
341
|
-
// userId: userId,
|
|
342
|
-
// })
|
|
343
|
-
// .select("roleId userId")
|
|
344
|
-
// .populate({
|
|
345
|
-
// path: "roleId",
|
|
346
|
-
// select: "modulePermissions",
|
|
347
|
-
// })
|
|
348
|
-
// .lean()
|
|
349
|
-
// .exec();
|
|
350
|
-
|
|
351
|
-
// if (!data) {
|
|
352
|
-
// return [];
|
|
353
|
-
// }
|
|
354
|
-
|
|
355
|
-
// const channelsPermissions =
|
|
356
|
-
// convertPermissionsArrayToObject(
|
|
357
|
-
// data?.roleId?.modulePermissions?.modules
|
|
358
|
-
// )?.["conversations"]?.["integrationPermissions"] || [];
|
|
359
|
-
|
|
360
|
-
// // Store in cache with other permission data
|
|
361
|
-
// const permissionsData = cachedData || {};
|
|
362
|
-
// permissionsData.channelsPermissions = channelsPermissions;
|
|
363
|
-
// await setRedisData(cacheKey, permissionsData, null, 0);
|
|
364
|
-
|
|
365
|
-
// return channelsPermissions;
|
|
366
|
-
// } catch (err) {
|
|
367
|
-
// console.error("Error in getChannelsPermissions:", err);
|
|
368
|
-
// return [];
|
|
369
|
-
// }
|
|
370
|
-
// };
|
|
371
|
-
|
|
372
|
-
// const findOneAndUpdateUserRole = async ({
|
|
373
|
-
// workspaceId,
|
|
374
|
-
// userId,
|
|
375
|
-
// userShift,
|
|
376
|
-
// role,
|
|
377
|
-
// }) => {
|
|
378
|
-
// const updatedRole = await UserRole.findOneAndUpdate(
|
|
379
|
-
// { workspaceId, userId },
|
|
380
|
-
// { $set: { userShift, role } },
|
|
381
|
-
// { new: true, upsert: false }
|
|
382
|
-
// ).exec();
|
|
383
|
-
|
|
384
|
-
// if (updatedRole) {
|
|
385
|
-
// // Update all related caches
|
|
386
|
-
// await updateAllRelatedCaches(userId, workspaceId);
|
|
387
|
-
// }
|
|
388
|
-
|
|
389
|
-
// return updatedRole;
|
|
390
|
-
// };
|
|
391
|
-
|
|
392
|
-
// module.exports = {
|
|
393
|
-
// createUserRole,
|
|
394
|
-
// findUserRole,
|
|
395
|
-
// updateUserRole,
|
|
396
|
-
// deleteUserRoleByFilter,
|
|
397
|
-
// deleteUserRole,
|
|
398
|
-
// findUserWorkspaces,
|
|
399
|
-
// getUserRoleWithPermissions,
|
|
400
|
-
// getUserPermissions,
|
|
401
|
-
// getChannelsPermissions,
|
|
402
|
-
// findOneAndUpdateUserRole,
|
|
403
|
-
// };
|
|
404
|
-
|
|
405
1
|
const { UserRole } = require("../../models/UserRole");
|
|
406
2
|
const { getRedisData, setRedisData } = require("../../config/redis");
|
|
3
|
+
const mongoose = require("mongoose");
|
|
407
4
|
|
|
408
5
|
const defaultSelect =
|
|
409
6
|
"iconUrl thumbUrl name productsCount ordersCount contact email address websiteUrl facebookUrl twitterUrl instagramUrl members defaultModule";
|
|
@@ -412,6 +9,83 @@ const defaultSelect =
|
|
|
412
9
|
const CACHE_KEY_ALL_MEMBERS = "userroles_all_members";
|
|
413
10
|
const CACHE_KEY_USER_PERMISSIONS_PREFIX = "user_permissions_";
|
|
414
11
|
|
|
12
|
+
// Comprehensive cache get method
|
|
13
|
+
const getCachedMembers = async (filter = {}) => {
|
|
14
|
+
try {
|
|
15
|
+
let members = await getRedisData(CACHE_KEY_ALL_MEMBERS);
|
|
16
|
+
|
|
17
|
+
if (!members) {
|
|
18
|
+
// Fetch from database if not in cache
|
|
19
|
+
members = await UserRole.find()
|
|
20
|
+
.select("userId role userShift roleId workspaceId")
|
|
21
|
+
.populate({
|
|
22
|
+
path: "roleId",
|
|
23
|
+
select: "id name userId userShift permissionId modulePermissions",
|
|
24
|
+
populate: [{ path: "permissionId", select: "id name" }],
|
|
25
|
+
})
|
|
26
|
+
.populate({
|
|
27
|
+
path: "userId",
|
|
28
|
+
match: { isDeleted: false, suspended: false },
|
|
29
|
+
select: "firstName lastName role email picture userShift",
|
|
30
|
+
})
|
|
31
|
+
.lean()
|
|
32
|
+
.exec();
|
|
33
|
+
|
|
34
|
+
// Filter out invalid members
|
|
35
|
+
members =
|
|
36
|
+
members?.filter((member) => member?.userId && member?.roleId) || [];
|
|
37
|
+
|
|
38
|
+
// Cache the result
|
|
39
|
+
await setRedisData(CACHE_KEY_ALL_MEMBERS, members);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Apply filter in memory
|
|
43
|
+
return members.filter((member) =>
|
|
44
|
+
Object.entries(filter).every(([key, value]) => {
|
|
45
|
+
// Handle nested property access and comparison
|
|
46
|
+
const memberValue = key.includes(".")
|
|
47
|
+
? key.split(".").reduce((obj, prop) => obj?.[prop], member)
|
|
48
|
+
: member[key];
|
|
49
|
+
|
|
50
|
+
return memberValue === value;
|
|
51
|
+
})
|
|
52
|
+
);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.error("Error fetching cached members:", error);
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// Update the cache for all members
|
|
60
|
+
const updateCachedMembers = async (filter = {}) => {
|
|
61
|
+
try {
|
|
62
|
+
const members = await UserRole.find(filter)
|
|
63
|
+
.select("userId role userShift roleId")
|
|
64
|
+
.populate({
|
|
65
|
+
path: "roleId",
|
|
66
|
+
select: "id name userId userShift permissionId modulePermissions",
|
|
67
|
+
populate: [{ path: "permissionId", select: "id name" }],
|
|
68
|
+
})
|
|
69
|
+
.populate({
|
|
70
|
+
path: "userId",
|
|
71
|
+
match: { isDeleted: false, suspended: false },
|
|
72
|
+
select: "firstName lastName role email picture userShift",
|
|
73
|
+
})
|
|
74
|
+
.lean()
|
|
75
|
+
.exec();
|
|
76
|
+
|
|
77
|
+
const validMembers =
|
|
78
|
+
members?.filter((member) => member?.userId && member?.roleId) || [];
|
|
79
|
+
|
|
80
|
+
await setRedisData(CACHE_KEY_ALL_MEMBERS, validMembers);
|
|
81
|
+
|
|
82
|
+
return validMembers;
|
|
83
|
+
} catch (error) {
|
|
84
|
+
console.error("Error updating cached members:", error);
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
415
89
|
// Comprehensive cache update method
|
|
416
90
|
const updateAllRelatedCaches = async (userId, workspaceId) => {
|
|
417
91
|
try {
|
|
@@ -467,64 +141,27 @@ const findSingleUserRoleByFilter = async (
|
|
|
467
141
|
.exec();
|
|
468
142
|
};
|
|
469
143
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
.
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
.
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
members?.filter((member) => member?.userId && member?.roleId),
|
|
492
|
-
null,
|
|
493
|
-
3600
|
|
494
|
-
);
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
// Apply filter in memory if needed
|
|
498
|
-
return filter && Object.keys(filter).length > 0
|
|
499
|
-
? members.filter((member) =>
|
|
500
|
-
Object.entries(filter).every(([key, value]) => member[key] === value)
|
|
501
|
-
)
|
|
502
|
-
: members;
|
|
503
|
-
};
|
|
504
|
-
|
|
505
|
-
// Update the cache for all members
|
|
506
|
-
const updateCachedMembers = async (filter = {}) => {
|
|
507
|
-
const members = await UserRole.find(filter)
|
|
508
|
-
.select("userId role userShift roleId")
|
|
509
|
-
.populate({
|
|
510
|
-
path: "roleId",
|
|
511
|
-
select: "id name userId userShift permissionId modulePermissions",
|
|
512
|
-
populate: [{ path: "permissionId", select: "id name" }],
|
|
513
|
-
})
|
|
514
|
-
.populate({
|
|
515
|
-
path: "userId",
|
|
516
|
-
match: { isDeleted: false, suspended: false },
|
|
517
|
-
select: "firstName lastName role email picture userShift",
|
|
518
|
-
})
|
|
519
|
-
.lean()
|
|
520
|
-
.exec();
|
|
521
|
-
await setRedisData(
|
|
522
|
-
CACHE_KEY_ALL_MEMBERS,
|
|
523
|
-
members?.filter((member) => member?.userId && member?.roleId),
|
|
524
|
-
null,
|
|
525
|
-
3600
|
|
526
|
-
);
|
|
527
|
-
return members;
|
|
144
|
+
const convertPermissionsArrayToObject = (originalArray) => {
|
|
145
|
+
return originalArray?.reduce((acc, item) => {
|
|
146
|
+
const { id, actions, integrationPermissions, ...extras } = item;
|
|
147
|
+
const formattedExtras = {};
|
|
148
|
+
if (extras.deletable !== undefined) {
|
|
149
|
+
formattedExtras.deletable = extras.deletable;
|
|
150
|
+
}
|
|
151
|
+
if (extras.createUpdateable !== undefined) {
|
|
152
|
+
formattedExtras.createUpdateable = extras.createUpdateable;
|
|
153
|
+
}
|
|
154
|
+
acc[id] = {
|
|
155
|
+
actions: Object.keys(actions).filter((action) => actions[action]),
|
|
156
|
+
...formattedExtras,
|
|
157
|
+
...(integrationPermissions && {
|
|
158
|
+
integrationPermissions: Object.entries(integrationPermissions)
|
|
159
|
+
.filter(([_, allowed]) => allowed)
|
|
160
|
+
.map(([key]) => key),
|
|
161
|
+
}),
|
|
162
|
+
};
|
|
163
|
+
return acc;
|
|
164
|
+
}, {});
|
|
528
165
|
};
|
|
529
166
|
|
|
530
167
|
const createUserRole = async (data) => {
|
|
@@ -564,29 +201,21 @@ const updateUserRole = async (id, data) => {
|
|
|
564
201
|
const updatedRole = await UserRole.findByIdAndUpdate(id, data, {
|
|
565
202
|
new: true,
|
|
566
203
|
}).exec();
|
|
567
|
-
|
|
568
204
|
if (updatedRole) {
|
|
569
|
-
// Update all related caches
|
|
570
205
|
await updateAllRelatedCaches(updatedRole.userId, updatedRole.workspaceId);
|
|
571
206
|
}
|
|
572
|
-
|
|
573
207
|
return updatedRole;
|
|
574
208
|
};
|
|
575
209
|
|
|
576
210
|
const deleteUserRoleByFilter = async (filter) => {
|
|
577
|
-
// Find the role before deleting to get userId and workspaceId
|
|
578
211
|
const roleToDelete = await UserRole.findOne(filter).exec();
|
|
579
|
-
|
|
580
212
|
const deletedRole = await UserRole.findOneAndDelete(filter).exec();
|
|
581
|
-
|
|
582
213
|
if (deletedRole) {
|
|
583
|
-
// Update all related caches
|
|
584
214
|
await updateAllRelatedCaches(
|
|
585
215
|
roleToDelete?.userId,
|
|
586
216
|
roleToDelete?.workspaceId
|
|
587
217
|
);
|
|
588
218
|
}
|
|
589
|
-
|
|
590
219
|
return deletedRole;
|
|
591
220
|
};
|
|
592
221
|
|
|
@@ -594,85 +223,40 @@ const deleteUserRole = async (id) => {
|
|
|
594
223
|
const role = await UserRole.findById(id).exec();
|
|
595
224
|
const userId = role?.userId;
|
|
596
225
|
const workspaceId = role?.workspaceId;
|
|
597
|
-
|
|
598
226
|
const deletedRole = await UserRole.findByIdAndDelete(id).exec();
|
|
599
|
-
|
|
600
227
|
if (deletedRole) {
|
|
601
|
-
// Update all related caches
|
|
602
228
|
await updateAllRelatedCaches(userId, workspaceId);
|
|
603
229
|
}
|
|
604
|
-
|
|
605
230
|
return deletedRole;
|
|
606
231
|
};
|
|
607
232
|
|
|
608
233
|
const findUserWorkspaces = async (userId) => {
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
permissions: ur?.roleId?.modulePermissions?.modules || [],
|
|
636
|
-
};
|
|
637
|
-
});
|
|
638
|
-
|
|
639
|
-
if (userRoleWithWorkspaces) {
|
|
640
|
-
await setRedisData(
|
|
641
|
-
CACHE_KEY_ALL_MEMBERS,
|
|
642
|
-
userRoleWithWorkspaces,
|
|
643
|
-
null,
|
|
644
|
-
3600
|
|
645
|
-
);
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
// Filter workspaces for specific user
|
|
650
|
-
return userRoleWithWorkspaces?.filter(
|
|
651
|
-
(workspace) => workspace.userId?.toString() === userId.toString()
|
|
652
|
-
);
|
|
653
|
-
};
|
|
654
|
-
|
|
655
|
-
const convertPermissionsArrayToObject = (originalArray) => {
|
|
656
|
-
return originalArray?.reduce((acc, item) => {
|
|
657
|
-
const { id, actions, integrationPermissions, ...extras } = item;
|
|
658
|
-
const formattedExtras = {};
|
|
659
|
-
if (extras.deletable !== undefined) {
|
|
660
|
-
formattedExtras.deletable = extras.deletable;
|
|
661
|
-
}
|
|
662
|
-
if (extras.createUpdateable !== undefined) {
|
|
663
|
-
formattedExtras.createUpdateable = extras.createUpdateable;
|
|
664
|
-
}
|
|
665
|
-
acc[id] = {
|
|
666
|
-
actions: Object.keys(actions).filter((action) => actions[action]),
|
|
667
|
-
...formattedExtras,
|
|
668
|
-
...(integrationPermissions && {
|
|
669
|
-
integrationPermissions: Object.entries(integrationPermissions)
|
|
670
|
-
.filter(([_, allowed]) => allowed)
|
|
671
|
-
.map(([key]) => key),
|
|
672
|
-
}),
|
|
673
|
-
};
|
|
674
|
-
return acc;
|
|
675
|
-
}, {});
|
|
234
|
+
return await UserRole.find({ userId: userId })
|
|
235
|
+
.select("userId roleId workspaceId")
|
|
236
|
+
.populate({
|
|
237
|
+
path: "roleId",
|
|
238
|
+
select: "id name userId userShift permissionId modulePermissions",
|
|
239
|
+
populate: [{ path: "permissionId", select: "id name" }],
|
|
240
|
+
})
|
|
241
|
+
.populate({
|
|
242
|
+
path: "workspaceId",
|
|
243
|
+
select: defaultSelect,
|
|
244
|
+
match: { isDeleted: false },
|
|
245
|
+
})
|
|
246
|
+
.lean()
|
|
247
|
+
.exec();
|
|
248
|
+
userRoleWithWorkspaces = userRoleWithWorkspaces
|
|
249
|
+
?.filter((userRole) => userRole?.workspaceId)
|
|
250
|
+
?.filter((userRole) => userRole?.roleId)
|
|
251
|
+
?.map((ur) => {
|
|
252
|
+
return {
|
|
253
|
+
...ur?.workspaceId,
|
|
254
|
+
id: ur?.workspaceId?._id?.toString(),
|
|
255
|
+
_id: ur?.workspaceId?._id?.toString(),
|
|
256
|
+
role: ur?.roleId?.name || "",
|
|
257
|
+
permissions: ur?.roleId?.modulePermissions?.modules || [],
|
|
258
|
+
};
|
|
259
|
+
});
|
|
676
260
|
};
|
|
677
261
|
|
|
678
262
|
const getUserRoleWithPermissions = async (workspaceId, userId) => {
|
|
@@ -717,7 +301,7 @@ const getUserRoleWithPermissions = async (workspaceId, userId) => {
|
|
|
717
301
|
// Store in cache with other permission data
|
|
718
302
|
const permissionsData = cachedData || {};
|
|
719
303
|
permissionsData.roleWithPermissions = roleWithPermissions;
|
|
720
|
-
await setRedisData(cacheKey, permissionsData
|
|
304
|
+
await setRedisData(cacheKey, permissionsData);
|
|
721
305
|
|
|
722
306
|
return roleWithPermissions;
|
|
723
307
|
} catch (err) {
|
|
@@ -759,7 +343,7 @@ const getUserPermissions = async (workspaceId, userId) => {
|
|
|
759
343
|
// Store in cache with other permission data
|
|
760
344
|
const permissionsData = cachedData || {};
|
|
761
345
|
permissionsData.permissions = permissions;
|
|
762
|
-
await setRedisData(cacheKey, permissionsData
|
|
346
|
+
await setRedisData(cacheKey, permissionsData);
|
|
763
347
|
|
|
764
348
|
return permissions;
|
|
765
349
|
} catch (err) {
|
|
@@ -771,11 +355,9 @@ const getUserPermissions = async (workspaceId, userId) => {
|
|
|
771
355
|
const getChannelsPermissions = async (workspaceId, userId) => {
|
|
772
356
|
const cacheKey = `${CACHE_KEY_USER_PERMISSIONS_PREFIX}${workspaceId}_${userId}`;
|
|
773
357
|
let cachedData = await getRedisData(cacheKey);
|
|
774
|
-
|
|
775
358
|
if (cachedData && cachedData.channelsPermissions) {
|
|
776
359
|
return cachedData.channelsPermissions;
|
|
777
360
|
}
|
|
778
|
-
|
|
779
361
|
try {
|
|
780
362
|
let data = await UserRole.findOne({
|
|
781
363
|
workspaceId: workspaceId,
|
|
@@ -788,11 +370,9 @@ const getChannelsPermissions = async (workspaceId, userId) => {
|
|
|
788
370
|
})
|
|
789
371
|
.lean()
|
|
790
372
|
.exec();
|
|
791
|
-
|
|
792
373
|
if (!data) {
|
|
793
374
|
return [];
|
|
794
375
|
}
|
|
795
|
-
|
|
796
376
|
const channelsPermissions =
|
|
797
377
|
convertPermissionsArrayToObject(
|
|
798
378
|
data?.roleId?.modulePermissions?.modules
|
|
@@ -801,7 +381,7 @@ const getChannelsPermissions = async (workspaceId, userId) => {
|
|
|
801
381
|
// Store in cache with other permission data
|
|
802
382
|
const permissionsData = cachedData || {};
|
|
803
383
|
permissionsData.channelsPermissions = channelsPermissions;
|
|
804
|
-
await setRedisData(cacheKey, permissionsData
|
|
384
|
+
await setRedisData(cacheKey, permissionsData);
|
|
805
385
|
|
|
806
386
|
return channelsPermissions;
|
|
807
387
|
} catch (err) {
|
|
@@ -822,4 +402,6 @@ module.exports = {
|
|
|
822
402
|
getChannelsPermissions,
|
|
823
403
|
findOneAndUpdateUserRole,
|
|
824
404
|
findSingleUserRoleByFilter,
|
|
405
|
+
getCachedMembers,
|
|
406
|
+
updateCachedMembers,
|
|
825
407
|
};
|