shuttlepro-shared 1.2.65 → 1.2.67
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,407 +1,3 @@
|
|
|
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");
|
|
407
3
|
|
|
@@ -412,6 +8,83 @@ const defaultSelect =
|
|
|
412
8
|
const CACHE_KEY_ALL_MEMBERS = "userroles_all_members";
|
|
413
9
|
const CACHE_KEY_USER_PERMISSIONS_PREFIX = "user_permissions_";
|
|
414
10
|
|
|
11
|
+
// Comprehensive cache get method
|
|
12
|
+
const getCachedMembers = async (filter = {}) => {
|
|
13
|
+
try {
|
|
14
|
+
let members = await getRedisData(CACHE_KEY_ALL_MEMBERS);
|
|
15
|
+
|
|
16
|
+
if (!members) {
|
|
17
|
+
// Fetch from database if not in cache
|
|
18
|
+
members = await UserRole.find()
|
|
19
|
+
.select("userId role userShift roleId workspaceId")
|
|
20
|
+
.populate({
|
|
21
|
+
path: "roleId",
|
|
22
|
+
select: "id name userId userShift permissionId modulePermissions",
|
|
23
|
+
populate: [{ path: "permissionId", select: "id name" }],
|
|
24
|
+
})
|
|
25
|
+
.populate({
|
|
26
|
+
path: "userId",
|
|
27
|
+
match: { isDeleted: false, suspended: false },
|
|
28
|
+
select: "firstName lastName role email picture userShift",
|
|
29
|
+
})
|
|
30
|
+
.lean()
|
|
31
|
+
.exec();
|
|
32
|
+
|
|
33
|
+
// Filter out invalid members
|
|
34
|
+
members =
|
|
35
|
+
members?.filter((member) => member?.userId && member?.roleId) || [];
|
|
36
|
+
|
|
37
|
+
// Cache the result
|
|
38
|
+
await setRedisData(CACHE_KEY_ALL_MEMBERS, members);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Apply filter in memory
|
|
42
|
+
return members.filter((member) =>
|
|
43
|
+
Object.entries(filter).every(([key, value]) => {
|
|
44
|
+
// Handle nested property access and comparison
|
|
45
|
+
const memberValue = key.includes(".")
|
|
46
|
+
? key.split(".").reduce((obj, prop) => obj?.[prop], member)
|
|
47
|
+
: member[key];
|
|
48
|
+
|
|
49
|
+
return memberValue === value;
|
|
50
|
+
})
|
|
51
|
+
);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
console.error("Error fetching cached members:", error);
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// Update the cache for all members
|
|
59
|
+
const updateCachedMembers = async (filter = {}) => {
|
|
60
|
+
try {
|
|
61
|
+
const members = await UserRole.find(filter)
|
|
62
|
+
.select("userId role userShift roleId")
|
|
63
|
+
.populate({
|
|
64
|
+
path: "roleId",
|
|
65
|
+
select: "id name userId userShift permissionId modulePermissions",
|
|
66
|
+
populate: [{ path: "permissionId", select: "id name" }],
|
|
67
|
+
})
|
|
68
|
+
.populate({
|
|
69
|
+
path: "userId",
|
|
70
|
+
match: { isDeleted: false, suspended: false },
|
|
71
|
+
select: "firstName lastName role email picture userShift",
|
|
72
|
+
})
|
|
73
|
+
.lean()
|
|
74
|
+
.exec();
|
|
75
|
+
|
|
76
|
+
const validMembers =
|
|
77
|
+
members?.filter((member) => member?.userId && member?.roleId) || [];
|
|
78
|
+
|
|
79
|
+
await setRedisData(CACHE_KEY_ALL_MEMBERS, validMembers);
|
|
80
|
+
|
|
81
|
+
return validMembers;
|
|
82
|
+
} catch (error) {
|
|
83
|
+
console.error("Error updating cached members:", error);
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
415
88
|
// Comprehensive cache update method
|
|
416
89
|
const updateAllRelatedCaches = async (userId, workspaceId) => {
|
|
417
90
|
try {
|
|
@@ -467,64 +140,27 @@ const findSingleUserRoleByFilter = async (
|
|
|
467
140
|
.exec();
|
|
468
141
|
};
|
|
469
142
|
|
|
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;
|
|
143
|
+
const convertPermissionsArrayToObject = (originalArray) => {
|
|
144
|
+
return originalArray?.reduce((acc, item) => {
|
|
145
|
+
const { id, actions, integrationPermissions, ...extras } = item;
|
|
146
|
+
const formattedExtras = {};
|
|
147
|
+
if (extras.deletable !== undefined) {
|
|
148
|
+
formattedExtras.deletable = extras.deletable;
|
|
149
|
+
}
|
|
150
|
+
if (extras.createUpdateable !== undefined) {
|
|
151
|
+
formattedExtras.createUpdateable = extras.createUpdateable;
|
|
152
|
+
}
|
|
153
|
+
acc[id] = {
|
|
154
|
+
actions: Object.keys(actions).filter((action) => actions[action]),
|
|
155
|
+
...formattedExtras,
|
|
156
|
+
...(integrationPermissions && {
|
|
157
|
+
integrationPermissions: Object.entries(integrationPermissions)
|
|
158
|
+
.filter(([_, allowed]) => allowed)
|
|
159
|
+
.map(([key]) => key),
|
|
160
|
+
}),
|
|
161
|
+
};
|
|
162
|
+
return acc;
|
|
163
|
+
}, {});
|
|
528
164
|
};
|
|
529
165
|
|
|
530
166
|
const createUserRole = async (data) => {
|
|
@@ -564,29 +200,21 @@ const updateUserRole = async (id, data) => {
|
|
|
564
200
|
const updatedRole = await UserRole.findByIdAndUpdate(id, data, {
|
|
565
201
|
new: true,
|
|
566
202
|
}).exec();
|
|
567
|
-
|
|
568
203
|
if (updatedRole) {
|
|
569
|
-
// Update all related caches
|
|
570
204
|
await updateAllRelatedCaches(updatedRole.userId, updatedRole.workspaceId);
|
|
571
205
|
}
|
|
572
|
-
|
|
573
206
|
return updatedRole;
|
|
574
207
|
};
|
|
575
208
|
|
|
576
209
|
const deleteUserRoleByFilter = async (filter) => {
|
|
577
|
-
// Find the role before deleting to get userId and workspaceId
|
|
578
210
|
const roleToDelete = await UserRole.findOne(filter).exec();
|
|
579
|
-
|
|
580
211
|
const deletedRole = await UserRole.findOneAndDelete(filter).exec();
|
|
581
|
-
|
|
582
212
|
if (deletedRole) {
|
|
583
|
-
// Update all related caches
|
|
584
213
|
await updateAllRelatedCaches(
|
|
585
214
|
roleToDelete?.userId,
|
|
586
215
|
roleToDelete?.workspaceId
|
|
587
216
|
);
|
|
588
217
|
}
|
|
589
|
-
|
|
590
218
|
return deletedRole;
|
|
591
219
|
};
|
|
592
220
|
|
|
@@ -594,85 +222,41 @@ const deleteUserRole = async (id) => {
|
|
|
594
222
|
const role = await UserRole.findById(id).exec();
|
|
595
223
|
const userId = role?.userId;
|
|
596
224
|
const workspaceId = role?.workspaceId;
|
|
597
|
-
|
|
598
225
|
const deletedRole = await UserRole.findByIdAndDelete(id).exec();
|
|
599
|
-
|
|
600
226
|
if (deletedRole) {
|
|
601
|
-
// Update all related caches
|
|
602
227
|
await updateAllRelatedCaches(userId, workspaceId);
|
|
603
228
|
}
|
|
604
|
-
|
|
605
229
|
return deletedRole;
|
|
606
230
|
};
|
|
607
231
|
|
|
608
232
|
const findUserWorkspaces = async (userId) => {
|
|
609
|
-
let userRoleWithWorkspaces = await
|
|
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
|
-
|
|
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
|
-
}, {});
|
|
233
|
+
let userRoleWithWorkspaces = await UserRole.find({ userId: userId })
|
|
234
|
+
.select("userId roleId workspaceId")
|
|
235
|
+
.populate({
|
|
236
|
+
path: "roleId",
|
|
237
|
+
select: "id name userId userShift permissionId modulePermissions",
|
|
238
|
+
populate: [{ path: "permissionId", select: "id name" }],
|
|
239
|
+
})
|
|
240
|
+
.populate({
|
|
241
|
+
path: "workspaceId",
|
|
242
|
+
select: defaultSelect,
|
|
243
|
+
match: { isDeleted: false },
|
|
244
|
+
})
|
|
245
|
+
.lean()
|
|
246
|
+
.exec();
|
|
247
|
+
userRoleWithWorkspaces = userRoleWithWorkspaces
|
|
248
|
+
?.filter((userRole) => userRole?.workspaceId)
|
|
249
|
+
?.filter((userRole) => userRole?.roleId)
|
|
250
|
+
?.map((ur) => {
|
|
251
|
+
return {
|
|
252
|
+
...ur?.workspaceId,
|
|
253
|
+
id: ur?.workspaceId?._id?.toString(),
|
|
254
|
+
_id: ur?.workspaceId?._id?.toString(),
|
|
255
|
+
role: ur?.roleId?.name || "",
|
|
256
|
+
permissions: ur?.roleId?.modulePermissions?.modules || [],
|
|
257
|
+
};
|
|
258
|
+
});
|
|
259
|
+
return userRoleWithWorkspaces || [];
|
|
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) {
|
|
@@ -727,41 +311,16 @@ const getUserRoleWithPermissions = async (workspaceId, userId) => {
|
|
|
727
311
|
};
|
|
728
312
|
|
|
729
313
|
const getUserPermissions = async (workspaceId, userId) => {
|
|
730
|
-
const cacheKey = `${CACHE_KEY_USER_PERMISSIONS_PREFIX}${workspaceId}_${userId}`;
|
|
731
|
-
let cachedData = await getRedisData(cacheKey);
|
|
732
|
-
|
|
733
|
-
if (cachedData && cachedData.permissions) {
|
|
734
|
-
return cachedData.permissions;
|
|
735
|
-
}
|
|
736
|
-
|
|
737
314
|
try {
|
|
738
|
-
let
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
select: "modulePermissions",
|
|
746
|
-
})
|
|
747
|
-
.lean()
|
|
748
|
-
.exec();
|
|
749
|
-
|
|
750
|
-
if (!data) {
|
|
751
|
-
return null;
|
|
315
|
+
let members = await getCachedMembers({ workspaceId, userId });
|
|
316
|
+
console.log(members, "members");
|
|
317
|
+
if (members?.length) {
|
|
318
|
+
const permissions =
|
|
319
|
+
convertPermissionsArrayToObject(
|
|
320
|
+
members?.[0]?.roleId?.modulePermissions?.modules
|
|
321
|
+
) || null;
|
|
752
322
|
}
|
|
753
|
-
|
|
754
|
-
const permissions =
|
|
755
|
-
convertPermissionsArrayToObject(
|
|
756
|
-
data?.roleId?.modulePermissions?.modules
|
|
757
|
-
) || null;
|
|
758
|
-
|
|
759
|
-
// Store in cache with other permission data
|
|
760
|
-
const permissionsData = cachedData || {};
|
|
761
|
-
permissionsData.permissions = permissions;
|
|
762
|
-
await setRedisData(cacheKey, permissionsData, null, 0);
|
|
763
|
-
|
|
764
|
-
return permissions;
|
|
323
|
+
return permissions || null;
|
|
765
324
|
} catch (err) {
|
|
766
325
|
console.error("Error in getUserPermissions:", err);
|
|
767
326
|
return null;
|
|
@@ -771,11 +330,9 @@ const getUserPermissions = async (workspaceId, userId) => {
|
|
|
771
330
|
const getChannelsPermissions = async (workspaceId, userId) => {
|
|
772
331
|
const cacheKey = `${CACHE_KEY_USER_PERMISSIONS_PREFIX}${workspaceId}_${userId}`;
|
|
773
332
|
let cachedData = await getRedisData(cacheKey);
|
|
774
|
-
|
|
775
333
|
if (cachedData && cachedData.channelsPermissions) {
|
|
776
334
|
return cachedData.channelsPermissions;
|
|
777
335
|
}
|
|
778
|
-
|
|
779
336
|
try {
|
|
780
337
|
let data = await UserRole.findOne({
|
|
781
338
|
workspaceId: workspaceId,
|
|
@@ -788,11 +345,9 @@ const getChannelsPermissions = async (workspaceId, userId) => {
|
|
|
788
345
|
})
|
|
789
346
|
.lean()
|
|
790
347
|
.exec();
|
|
791
|
-
|
|
792
348
|
if (!data) {
|
|
793
349
|
return [];
|
|
794
350
|
}
|
|
795
|
-
|
|
796
351
|
const channelsPermissions =
|
|
797
352
|
convertPermissionsArrayToObject(
|
|
798
353
|
data?.roleId?.modulePermissions?.modules
|
|
@@ -801,7 +356,7 @@ const getChannelsPermissions = async (workspaceId, userId) => {
|
|
|
801
356
|
// Store in cache with other permission data
|
|
802
357
|
const permissionsData = cachedData || {};
|
|
803
358
|
permissionsData.channelsPermissions = channelsPermissions;
|
|
804
|
-
await setRedisData(cacheKey, permissionsData
|
|
359
|
+
await setRedisData(cacheKey, permissionsData);
|
|
805
360
|
|
|
806
361
|
return channelsPermissions;
|
|
807
362
|
} catch (err) {
|
|
@@ -822,4 +377,6 @@ module.exports = {
|
|
|
822
377
|
getChannelsPermissions,
|
|
823
378
|
findOneAndUpdateUserRole,
|
|
824
379
|
findSingleUserRoleByFilter,
|
|
380
|
+
getCachedMembers,
|
|
381
|
+
updateCachedMembers,
|
|
825
382
|
};
|