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
- // Filter out invalid members
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
- // Apply filter in memory
42
- return members.filter((member) =>
43
- Object.entries(filter).every(([key, value]) => {
44
- // Handle nested property access and comparison
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
- return memberValue === value;
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 data = await UserRole.findOne({
315
- workspaceId: workspaceId,
316
- userId: userId,
317
- })
318
- .select("roleId userId")
319
- .populate({
320
- path: "roleId",
321
- select: "modulePermissions",
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
- const channelsPermissions =
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 [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shuttlepro-shared",
3
- "version": "1.2.68",
3
+ "version": "1.2.69",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {