shuttlepro-shared 1.2.67 → 1.2.69
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.
|
@@ -8,13 +8,11 @@ const defaultSelect =
|
|
|
8
8
|
const CACHE_KEY_ALL_MEMBERS = "userroles_all_members";
|
|
9
9
|
const CACHE_KEY_USER_PERMISSIONS_PREFIX = "user_permissions_";
|
|
10
10
|
|
|
11
|
-
// Comprehensive cache get method
|
|
12
11
|
const getCachedMembers = async (filter = {}) => {
|
|
13
12
|
try {
|
|
14
13
|
let members = await getRedisData(CACHE_KEY_ALL_MEMBERS);
|
|
15
14
|
|
|
16
15
|
if (!members) {
|
|
17
|
-
// Fetch from database if not in cache
|
|
18
16
|
members = await UserRole.find()
|
|
19
17
|
.select("userId role userShift roleId workspaceId")
|
|
20
18
|
.populate({
|
|
@@ -25,30 +23,78 @@ const getCachedMembers = async (filter = {}) => {
|
|
|
25
23
|
.populate({
|
|
26
24
|
path: "userId",
|
|
27
25
|
match: { isDeleted: false, suspended: false },
|
|
28
|
-
select: "firstName lastName role email picture userShift",
|
|
26
|
+
select: "firstName lastName role email picture userShift _id",
|
|
29
27
|
})
|
|
30
28
|
.lean()
|
|
31
29
|
.exec();
|
|
32
30
|
|
|
33
|
-
|
|
34
|
-
members =
|
|
35
|
-
members?.filter((member) => member?.userId && member?.roleId) || [];
|
|
36
|
-
|
|
37
|
-
// Cache the result
|
|
31
|
+
members = members?.filter((m) => m?.userId && m?.roleId) || [];
|
|
38
32
|
await setRedisData(CACHE_KEY_ALL_MEMBERS, members);
|
|
39
33
|
}
|
|
40
34
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
35
|
+
const userIdFilter = filter.userId
|
|
36
|
+
? new Set(
|
|
37
|
+
Array.isArray(filter.userId)
|
|
38
|
+
? filter.userId.map((id) => id.toString())
|
|
39
|
+
: [filter.userId.toString()]
|
|
40
|
+
)
|
|
41
|
+
: null;
|
|
42
|
+
|
|
43
|
+
const roleIdFilter = filter.roleId
|
|
44
|
+
? Array.isArray(filter.roleId)
|
|
45
|
+
? new Set(filter.roleId.map((id) => id.toString()))
|
|
46
|
+
: typeof filter.roleId === "object"
|
|
47
|
+
? filter.roleId
|
|
48
|
+
: new Set([filter.roleId.toString()])
|
|
49
|
+
: null;
|
|
50
|
+
|
|
51
|
+
return members.filter((member) => {
|
|
52
|
+
// Optimize userId filter
|
|
53
|
+
if (userIdFilter && !userIdFilter.has(member.userId?._id?.toString())) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Optimize roleId filter
|
|
58
|
+
if (roleIdFilter) {
|
|
59
|
+
if (roleIdFilter instanceof Set) {
|
|
60
|
+
const roleIdStr =
|
|
61
|
+
member.roleId?._id?.toString() ?? member.roleId?.id?.toString();
|
|
62
|
+
if (!roleIdFilter.has(roleIdStr)) return false;
|
|
63
|
+
} else if (typeof roleIdFilter === "object") {
|
|
64
|
+
for (const [key, value] of Object.entries(roleIdFilter)) {
|
|
65
|
+
const roleVal = key.includes(".")
|
|
66
|
+
? key.split(".").reduce((obj, k) => obj?.[k], member.roleId)
|
|
67
|
+
: member.roleId?.[key];
|
|
68
|
+
if (Array.isArray(value)) {
|
|
69
|
+
if (!value.includes(roleVal)) return false;
|
|
70
|
+
} else if (roleVal !== value) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// General filters
|
|
78
|
+
for (const [key, value] of Object.entries(filter)) {
|
|
79
|
+
if (key === "userId" || key === "roleId") continue;
|
|
80
|
+
|
|
45
81
|
const memberValue = key.includes(".")
|
|
46
82
|
? key.split(".").reduce((obj, prop) => obj?.[prop], member)
|
|
47
83
|
: member[key];
|
|
48
84
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
85
|
+
if (Array.isArray(value)) {
|
|
86
|
+
if (!value.includes(memberValue)) return false;
|
|
87
|
+
} else if (typeof value === "object" && value !== null) {
|
|
88
|
+
for (const [subKey, subVal] of Object.entries(value)) {
|
|
89
|
+
if (memberValue?.[subKey] !== subVal) return false;
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
if (memberValue !== value) return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return true;
|
|
97
|
+
});
|
|
52
98
|
} catch (error) {
|
|
53
99
|
console.error("Error fetching cached members:", error);
|
|
54
100
|
return [];
|
|
@@ -259,106 +305,64 @@ const findUserWorkspaces = async (userId) => {
|
|
|
259
305
|
return userRoleWithWorkspaces || [];
|
|
260
306
|
};
|
|
261
307
|
|
|
262
|
-
const
|
|
263
|
-
const cacheKey = `${CACHE_KEY_USER_PERMISSIONS_PREFIX}${workspaceId}_${userId}`;
|
|
264
|
-
let cachedData = await getRedisData(cacheKey);
|
|
265
|
-
|
|
266
|
-
if (cachedData && cachedData.roleWithPermissions) {
|
|
267
|
-
return cachedData.roleWithPermissions;
|
|
268
|
-
}
|
|
269
|
-
|
|
308
|
+
const getUserPermissions = async (workspaceId, userId) => {
|
|
270
309
|
try {
|
|
271
|
-
let
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
.populate({
|
|
276
|
-
path: "roleId",
|
|
277
|
-
select:
|
|
278
|
-
"id name userId userShift permissionId modulePermissions defaultModule",
|
|
279
|
-
populate: [{ path: "permissionId", select: "id name" }],
|
|
280
|
-
})
|
|
281
|
-
.lean()
|
|
282
|
-
.exec();
|
|
283
|
-
|
|
284
|
-
if (!data) {
|
|
285
|
-
return null;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
const roleWithPermissions = {
|
|
289
|
-
...data,
|
|
290
|
-
roleId: data?.roleId?._id?.toString() || "",
|
|
291
|
-
role: data?.roleId?.name || "",
|
|
292
|
-
permissions:
|
|
310
|
+
let members = await getCachedMembers({ workspaceId, userId });
|
|
311
|
+
console.log(members, "members");
|
|
312
|
+
if (members?.length) {
|
|
313
|
+
return (
|
|
293
314
|
convertPermissionsArrayToObject(
|
|
294
|
-
|
|
295
|
-
) ||
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
};
|
|
300
|
-
|
|
301
|
-
// Store in cache with other permission data
|
|
302
|
-
const permissionsData = cachedData || {};
|
|
303
|
-
permissionsData.roleWithPermissions = roleWithPermissions;
|
|
304
|
-
await setRedisData(cacheKey, permissionsData);
|
|
305
|
-
|
|
306
|
-
return roleWithPermissions;
|
|
315
|
+
members?.[0]?.roleId?.modulePermissions?.modules
|
|
316
|
+
) || null
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
return null;
|
|
307
320
|
} catch (err) {
|
|
308
|
-
console.error("Error in
|
|
321
|
+
console.error("Error in getUserPermissions:", err);
|
|
309
322
|
return null;
|
|
310
323
|
}
|
|
311
324
|
};
|
|
312
325
|
|
|
313
|
-
const
|
|
326
|
+
const getUserRoleWithPermissions = async (workspaceId, userId) => {
|
|
314
327
|
try {
|
|
315
328
|
let members = await getCachedMembers({ workspaceId, userId });
|
|
316
329
|
console.log(members, "members");
|
|
317
330
|
if (members?.length) {
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
) ||
|
|
331
|
+
let data = members?.[0];
|
|
332
|
+
const roleWithPermissions = {
|
|
333
|
+
...data,
|
|
334
|
+
roleId: data?.roleId?._id?.toString() || "",
|
|
335
|
+
role: data?.roleId?.name || "",
|
|
336
|
+
permissions:
|
|
337
|
+
convertPermissionsArrayToObject(
|
|
338
|
+
data?.roleId?.modulePermissions?.modules
|
|
339
|
+
) || [],
|
|
340
|
+
parentRole: data?.roleId?.permissionId?.name || "",
|
|
341
|
+
parentRoleId: data?.roleId?.permissionId?._id?.toString() || "",
|
|
342
|
+
defaultModule: data?.roleId?.defaultModule || "",
|
|
343
|
+
};
|
|
344
|
+
return roleWithPermissions || null;
|
|
322
345
|
}
|
|
323
|
-
return
|
|
346
|
+
return null;
|
|
324
347
|
} catch (err) {
|
|
325
|
-
console.error("Error in
|
|
348
|
+
console.error("Error in getUserRoleWithPermissions:", err);
|
|
326
349
|
return null;
|
|
327
350
|
}
|
|
328
351
|
};
|
|
329
352
|
|
|
330
353
|
const getChannelsPermissions = async (workspaceId, userId) => {
|
|
331
|
-
const cacheKey = `${CACHE_KEY_USER_PERMISSIONS_PREFIX}${workspaceId}_${userId}`;
|
|
332
|
-
let cachedData = await getRedisData(cacheKey);
|
|
333
|
-
if (cachedData && cachedData.channelsPermissions) {
|
|
334
|
-
return cachedData.channelsPermissions;
|
|
335
|
-
}
|
|
336
354
|
try {
|
|
337
|
-
let
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
.lean()
|
|
347
|
-
.exec();
|
|
348
|
-
if (!data) {
|
|
349
|
-
return [];
|
|
355
|
+
let members = await getCachedMembers({ workspaceId, userId });
|
|
356
|
+
console.log(members, "members");
|
|
357
|
+
if (members?.length) {
|
|
358
|
+
let data = members?.[0];
|
|
359
|
+
return (
|
|
360
|
+
convertPermissionsArrayToObject(
|
|
361
|
+
data?.roleId?.modulePermissions?.modules
|
|
362
|
+
)?.["conversations"]?.["integrationPermissions"] || []
|
|
363
|
+
);
|
|
350
364
|
}
|
|
351
|
-
|
|
352
|
-
convertPermissionsArrayToObject(
|
|
353
|
-
data?.roleId?.modulePermissions?.modules
|
|
354
|
-
)?.["conversations"]?.["integrationPermissions"] || [];
|
|
355
|
-
|
|
356
|
-
// Store in cache with other permission data
|
|
357
|
-
const permissionsData = cachedData || {};
|
|
358
|
-
permissionsData.channelsPermissions = channelsPermissions;
|
|
359
|
-
await setRedisData(cacheKey, permissionsData);
|
|
360
|
-
|
|
361
|
-
return channelsPermissions;
|
|
365
|
+
return [];
|
|
362
366
|
} catch (err) {
|
|
363
367
|
console.error("Error in getChannelsPermissions:", err);
|
|
364
368
|
return [];
|