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
- // 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 [];
@@ -259,106 +305,64 @@ const findUserWorkspaces = async (userId) => {
259
305
  return userRoleWithWorkspaces || [];
260
306
  };
261
307
 
262
- const getUserRoleWithPermissions = async (workspaceId, userId) => {
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 data = await UserRole.findOne({
272
- workspaceId: workspaceId,
273
- userId: userId,
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
- data?.roleId?.modulePermissions?.modules
295
- ) || [],
296
- parentRole: data?.roleId?.permissionId?.name || "",
297
- parentRoleId: data?.roleId?.permissionId?._id?.toString() || "",
298
- defaultModule: data?.roleId?.defaultModule || "",
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 getUserRoleWithPermissions:", err);
321
+ console.error("Error in getUserPermissions:", err);
309
322
  return null;
310
323
  }
311
324
  };
312
325
 
313
- const getUserPermissions = async (workspaceId, userId) => {
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
- const permissions =
319
- convertPermissionsArrayToObject(
320
- members?.[0]?.roleId?.modulePermissions?.modules
321
- ) || null;
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 permissions || null;
346
+ return null;
324
347
  } catch (err) {
325
- console.error("Error in getUserPermissions:", err);
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 data = await UserRole.findOne({
338
- workspaceId: workspaceId,
339
- userId: userId,
340
- })
341
- .select("roleId userId")
342
- .populate({
343
- path: "roleId",
344
- select: "modulePermissions",
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
- const channelsPermissions =
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 [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shuttlepro-shared",
3
- "version": "1.2.67",
3
+ "version": "1.2.69",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {