shuttlepro-shared 1.2.68 → 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 [];
|
|
@@ -305,37 +351,18 @@ const getUserRoleWithPermissions = async (workspaceId, userId) => {
|
|
|
305
351
|
};
|
|
306
352
|
|
|
307
353
|
const getChannelsPermissions = async (workspaceId, userId) => {
|
|
308
|
-
const cacheKey = `${CACHE_KEY_USER_PERMISSIONS_PREFIX}${workspaceId}_${userId}`;
|
|
309
|
-
let cachedData = await getRedisData(cacheKey);
|
|
310
|
-
if (cachedData && cachedData.channelsPermissions) {
|
|
311
|
-
return cachedData.channelsPermissions;
|
|
312
|
-
}
|
|
313
354
|
try {
|
|
314
|
-
let
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
.lean()
|
|
324
|
-
.exec();
|
|
325
|
-
if (!data) {
|
|
326
|
-
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
|
+
);
|
|
327
364
|
}
|
|
328
|
-
|
|
329
|
-
convertPermissionsArrayToObject(
|
|
330
|
-
data?.roleId?.modulePermissions?.modules
|
|
331
|
-
)?.["conversations"]?.["integrationPermissions"] || [];
|
|
332
|
-
|
|
333
|
-
// Store in cache with other permission data
|
|
334
|
-
const permissionsData = cachedData || {};
|
|
335
|
-
permissionsData.channelsPermissions = channelsPermissions;
|
|
336
|
-
await setRedisData(cacheKey, permissionsData);
|
|
337
|
-
|
|
338
|
-
return channelsPermissions;
|
|
365
|
+
return [];
|
|
339
366
|
} catch (err) {
|
|
340
367
|
console.error("Error in getChannelsPermissions:", err);
|
|
341
368
|
return [];
|