shuttlepro-shared 1.2.74 → 1.2.76

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.
@@ -5,109 +5,43 @@ const defaultSelect =
5
5
  "iconUrl thumbUrl name productsCount ordersCount contact email address websiteUrl facebookUrl twitterUrl instagramUrl members defaultModule";
6
6
 
7
7
  // Cache keys
8
- const CACHE_KEY_ALL_MEMBERS = "userroles_all_members";
8
+ const MEMBERS = "members";
9
9
 
10
- const getCachedMembers = async (filter = {}) => {
10
+ // Update the cache for all members
11
+ const updateCachedMembers = async (workspaceId) => {
11
12
  try {
12
- let members = await getRedisData(CACHE_KEY_ALL_MEMBERS);
13
-
14
- if (!members) {
15
- members = await UserRole.find()
16
- .select("userId role userShift roleId workspaceId")
17
- .populate({
18
- path: "roleId",
19
- select: "id name userId userShift permissionId modulePermissions",
20
- populate: [{ path: "permissionId", select: "id name" }],
21
- })
22
- .populate({
23
- path: "userId",
24
- match: { isDeleted: false, suspended: false },
25
- select: "firstName lastName role email picture userShift _id",
26
- })
27
- .lean()
28
- .exec();
29
-
30
- members = members?.filter((m) => m?.userId && m?.roleId) || [];
31
- await setRedisData(CACHE_KEY_ALL_MEMBERS, members);
32
- }
33
-
34
- const userIdFilter = filter.userId
35
- ? new Set(
36
- Array.isArray(filter.userId)
37
- ? filter.userId.map((id) => id.toString())
38
- : [filter.userId.toString()]
39
- )
40
- : null;
41
-
42
- const roleIdFilter = filter.roleId
43
- ? Array.isArray(filter.roleId)
44
- ? new Set(filter.roleId.map((id) => id.toString()))
45
- : typeof filter.roleId === "object"
46
- ? filter.roleId
47
- : new Set([filter.roleId.toString()])
48
- : null;
49
-
50
- return members.filter((member) => {
51
- // Optimize userId filter
52
- if (userIdFilter && !userIdFilter.has(member.userId?._id?.toString())) {
53
- return false;
54
- }
55
-
56
- // Optimize roleId filter
57
- if (roleIdFilter) {
58
- if (roleIdFilter instanceof Set) {
59
- const roleIdStr =
60
- member.roleId?._id?.toString() ?? member.roleId?.id?.toString();
61
- if (!roleIdFilter.has(roleIdStr)) return false;
62
- } else if (typeof roleIdFilter === "object") {
63
- for (const [key, value] of Object.entries(roleIdFilter)) {
64
- const roleVal = key.includes(".")
65
- ? key.split(".").reduce((obj, k) => obj?.[k], member.roleId)
66
- : member.roleId?.[key];
67
- if (Array.isArray(value)) {
68
- if (!value.includes(roleVal)) return false;
69
- } else if (roleVal !== value) {
70
- return false;
71
- }
72
- }
73
- }
74
- }
75
-
76
- // General filters
77
- for (const [key, value] of Object.entries(filter)) {
78
- if (key === "userId" || key === "roleId") continue;
79
-
80
- const memberValue = key.includes(".")
81
- ? key.split(".").reduce((obj, prop) => obj?.[prop], member)
82
- : member[key];
83
-
84
- if (Array.isArray(value)) {
85
- if (!value.includes(memberValue)) return false;
86
- } else if (typeof value === "object" && value !== null) {
87
- for (const [subKey, subVal] of Object.entries(value)) {
88
- if (memberValue?.[subKey] !== subVal) return false;
89
- }
90
- } else {
91
- if (memberValue !== value) return false;
92
- }
93
- }
94
-
95
- return true;
96
- });
13
+ const members = await UserRole.find({ workspaceId })
14
+ .select("userId role userShift roleId isOwner workspaceId")
15
+ .populate({
16
+ path: "roleId",
17
+ select:
18
+ "id name userId userShift permissionId modulePermissions workspaceId",
19
+ populate: [{ path: "permissionId", select: "id name" }],
20
+ })
21
+ .populate({
22
+ path: "userId",
23
+ match: { isDeleted: false, suspended: false },
24
+ select: "firstName lastName role email picture userShift",
25
+ })
26
+ .lean()
27
+ .exec();
28
+ await setRedisData(workspaceId, members, MEMBERS, 3600);
29
+ return members;
97
30
  } catch (error) {
98
- console.error("Error fetching cached members:", error);
31
+ console.error("Error updating cached members:", error);
99
32
  return [];
100
33
  }
101
34
  };
102
35
 
103
- // Update the cache for all members
104
- const updateCachedMembers = async (filter = {}) => {
105
- try {
106
- const members = await UserRole.find(filter)
107
- .select("userId role userShift roleId")
36
+ const getMembers = async (workspaceId) => {
37
+ let members = await getRedisData(workspaceId, MEMBERS);
38
+ if (!members || members?.length === 0) {
39
+ members = await UserRole.find({ workspaceId })
40
+ .select("userId role userShift roleId isOwner workspaceId")
108
41
  .populate({
109
42
  path: "roleId",
110
- select: "id name userId userShift permissionId modulePermissions",
43
+ select:
44
+ "id name userId userShift permissionId modulePermissions workspaceId",
111
45
  populate: [{ path: "permissionId", select: "id name" }],
112
46
  })
113
47
  .populate({
@@ -117,62 +51,59 @@ const updateCachedMembers = async (filter = {}) => {
117
51
  })
118
52
  .lean()
119
53
  .exec();
54
+ await setRedisData(workspaceId, members, MEMBERS, 3600);
55
+ }
56
+ return members;
57
+ };
120
58
 
121
- const validMembers =
122
- members?.filter((member) => member?.userId && member?.roleId) || [];
123
-
124
- console.log(validMembers, "validMembers");
59
+ const getMemberByWorkspaceIdAndUserId = async (workspaceId, userId) => {
60
+ const members = getMembers(workspaceId);
61
+ return (
62
+ members?.find(
63
+ (member) =>
64
+ member?.workspaceId === workspaceId && member?.userId?._id === userId
65
+ ) || null
66
+ );
67
+ };
125
68
 
126
- await setRedisData(CACHE_KEY_ALL_MEMBERS, validMembers, null, 3600);
69
+ // Find single user role by filter
70
+ const findSingleUserRoleByFilter = async ({ workspaceId, userId }) => {
71
+ return await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
72
+ };
127
73
 
128
- return validMembers;
129
- } catch (error) {
130
- console.error("Error updating cached members:", error);
131
- return [];
132
- }
74
+ const findUserRole = async ({ workspaceId, userId }) => {
75
+ return await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
133
76
  };
134
77
 
135
- // Comprehensive cache update method
136
- const updateAllRelatedCaches = async (userId, workspaceId) => {
137
- try {
138
- await updateCachedMembers();
139
- } catch (error) {
140
- console.error("Error updating related caches:", error);
141
- }
78
+ const createUserRole = async (data) => {
79
+ const savedRole = await UserRole.create(data);
80
+ return await updateCachedMembers(savedRole?.workspaceId?.toString());
142
81
  };
143
82
 
144
- // Find single user role by filter
145
- const findSingleUserRoleByFilter = async (
146
- filter = {},
147
- populateOptions = {}
148
- ) => {
149
- const defaultPopulateOptions = {
150
- rolePopulate: {
151
- path: "roleId",
152
- select: "id name userId userShift permissionId modulePermissions",
153
- populate: [{ path: "permissionId", select: "id name" }],
154
- },
155
- userPopulate: {
156
- path: "userId",
157
- match: { isDeleted: false, suspended: false },
158
- select: "firstName lastName role email picture userShift",
159
- },
160
- };
161
- const mergedPopulateOptions = {
162
- rolePopulate: {
163
- ...defaultPopulateOptions.rolePopulate,
164
- ...populateOptions.rolePopulate,
165
- },
166
- userPopulate: {
167
- ...defaultPopulateOptions.userPopulate,
168
- ...populateOptions.userPopulate,
169
- },
170
- };
171
- return await UserRole.findOne(filter)
172
- .populate(mergedPopulateOptions.rolePopulate)
173
- .populate(mergedPopulateOptions.userPopulate)
83
+ const findOneAndUpdateUserRole = async ({
84
+ workspaceId,
85
+ userId,
86
+ userShift,
87
+ role,
88
+ }) => {
89
+ await UserRole.findOneAndUpdate(
90
+ { workspaceId, userId },
91
+ { $set: { userShift, role } },
92
+ { new: true, upsert: false }
93
+ )
174
94
  .lean()
175
95
  .exec();
96
+ return await updateCachedMembers(workspaceId);
97
+ };
98
+
99
+ const updateUserRole = async (filter, payload) => {
100
+ await UserRole.updateOne(filter, payload).exec();
101
+ return await updateCachedMembers(filter.workspaceId);
102
+ };
103
+
104
+ const deleteUserRoleByFilter = async (filter) => {
105
+ await UserRole.deleteOne(filter).exec();
106
+ return await updateCachedMembers(filter.workspaceId);
176
107
  };
177
108
 
178
109
  const convertPermissionsArrayToObject = (originalArray) => {
@@ -198,107 +129,13 @@ const convertPermissionsArrayToObject = (originalArray) => {
198
129
  }, {});
199
130
  };
200
131
 
201
- const createUserRole = async (data) => {
202
- const savedRole = await UserRole.create(data);
203
-
204
- console.log(savedRole, "savedRole");
205
-
206
- // Update all related caches
207
- await updateAllRelatedCaches(
208
- savedRole?.userId?.toString(),
209
- savedRole?.workspaceId?.toString()
210
- );
211
-
212
- return savedRole;
213
- };
214
-
215
- const findOneAndUpdateUserRole = async ({
216
- workspaceId,
217
- userId,
218
- userShift,
219
- role,
220
- }) => {
221
- const updatedRole = await UserRole.findOneAndUpdate(
222
- { workspaceId, userId },
223
- { $set: { userShift, role } },
224
- { new: true, upsert: false }
225
- ).exec();
226
- if (updatedRole) {
227
- await updateAllRelatedCaches(userId, workspaceId);
228
- }
229
- return updatedRole;
230
- };
231
-
232
- const findUserRole = async (filter = {}) => {
233
- return await getCachedMembers(filter);
234
- };
235
-
236
- const updateUserRole = async (id, data) => {
237
- const updatedRole = await UserRole.findByIdAndUpdate(id, data, {
238
- new: true,
239
- }).exec();
240
- if (updatedRole) {
241
- await updateAllRelatedCaches(updatedRole.userId, updatedRole.workspaceId);
242
- }
243
- return updatedRole;
244
- };
245
-
246
- const deleteUserRoleByFilter = async (filter) => {
247
- const deletedRole = await UserRole.findOneAndDelete(filter).exec();
248
- if (deletedRole) {
249
- await updateAllRelatedCaches(filter?.userId, filter?.workspaceId);
250
- }
251
- return deletedRole;
252
- };
253
-
254
- const deleteUserRole = async (id) => {
255
- const role = await UserRole.findById(id).exec();
256
- const userId = role?.userId;
257
- const workspaceId = role?.workspaceId;
258
- const deletedRole = await UserRole.findByIdAndDelete(id).exec();
259
- if (deletedRole) {
260
- await updateAllRelatedCaches(userId, workspaceId);
261
- }
262
- return deletedRole;
263
- };
264
-
265
- const findUserWorkspaces = async (userId) => {
266
- let userRoleWithWorkspaces = await UserRole.find({ userId: userId })
267
- .select("userId roleId workspaceId")
268
- .populate({
269
- path: "roleId",
270
- select: "id name userId userShift permissionId modulePermissions",
271
- populate: [{ path: "permissionId", select: "id name" }],
272
- })
273
- .populate({
274
- path: "workspaceId",
275
- select: defaultSelect,
276
- match: { isDeleted: false },
277
- })
278
- .lean()
279
- .exec();
280
- userRoleWithWorkspaces = userRoleWithWorkspaces
281
- ?.filter((userRole) => userRole?.workspaceId)
282
- ?.filter((userRole) => userRole?.roleId)
283
- ?.map((ur) => {
284
- return {
285
- ...ur?.workspaceId,
286
- id: ur?.workspaceId?._id?.toString(),
287
- _id: ur?.workspaceId?._id?.toString(),
288
- role: ur?.roleId?.name || "",
289
- permissions: ur?.roleId?.modulePermissions?.modules || [],
290
- };
291
- });
292
- return userRoleWithWorkspaces || [];
293
- };
294
-
295
132
  const getUserPermissions = async (workspaceId, userId) => {
296
133
  try {
297
- let members = await getCachedMembers({ workspaceId, userId });
298
- if (members?.length) {
134
+ let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
135
+ if (data) {
299
136
  return (
300
137
  convertPermissionsArrayToObject(
301
- members?.[0]?.roleId?.modulePermissions?.modules
138
+ data?.roleId?.modulePermissions?.modules
302
139
  ) || null
303
140
  );
304
141
  }
@@ -311,9 +148,8 @@ const getUserPermissions = async (workspaceId, userId) => {
311
148
 
312
149
  const getUserRoleWithPermissions = async (workspaceId, userId) => {
313
150
  try {
314
- let members = await getCachedMembers({ workspaceId, userId });
315
- if (members?.length) {
316
- let data = members?.[0];
151
+ let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
152
+ if (data) {
317
153
  const roleWithPermissions = {
318
154
  ...data,
319
155
  roleId: data?.roleId?._id?.toString() || "",
@@ -337,9 +173,8 @@ const getUserRoleWithPermissions = async (workspaceId, userId) => {
337
173
 
338
174
  const getChannelsPermissions = async (workspaceId, userId) => {
339
175
  try {
340
- let members = await getCachedMembers({ workspaceId, userId });
341
- if (members?.length) {
342
- let data = members?.[0];
176
+ let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
177
+ if (data) {
343
178
  return (
344
179
  convertPermissionsArrayToObject(
345
180
  data?.roleId?.modulePermissions?.modules
@@ -353,12 +188,41 @@ const getChannelsPermissions = async (workspaceId, userId) => {
353
188
  }
354
189
  };
355
190
 
191
+ const findUserWorkspaces = async (userId) => {
192
+ let userRoleWithWorkspaces = await UserRole.find({ userId: userId })
193
+ .select("userId roleId workspaceId")
194
+ .populate({
195
+ path: "roleId",
196
+ select: "id name userId userShift permissionId modulePermissions",
197
+ populate: [{ path: "permissionId", select: "id name" }],
198
+ })
199
+ .populate({
200
+ path: "workspaceId",
201
+ select: defaultSelect,
202
+ match: { isDeleted: false },
203
+ })
204
+ .lean()
205
+ .exec();
206
+ userRoleWithWorkspaces = userRoleWithWorkspaces
207
+ ?.filter((userRole) => userRole?.workspaceId)
208
+ ?.filter((userRole) => userRole?.roleId)
209
+ ?.map((ur) => {
210
+ return {
211
+ ...ur?.workspaceId,
212
+ id: ur?.workspaceId?._id?.toString(),
213
+ _id: ur?.workspaceId?._id?.toString(),
214
+ role: ur?.roleId?.name || "",
215
+ permissions: ur?.roleId?.modulePermissions?.modules || [],
216
+ };
217
+ });
218
+ return userRoleWithWorkspaces || [];
219
+ };
220
+
356
221
  module.exports = {
357
222
  createUserRole,
358
- findUserRole,
359
223
  updateUserRole,
224
+ findUserRole,
360
225
  deleteUserRoleByFilter,
361
- deleteUserRole,
362
226
  findUserWorkspaces,
363
227
  getUserRoleWithPermissions,
364
228
  getUserPermissions,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shuttlepro-shared",
3
- "version": "1.2.74",
3
+ "version": "1.2.76",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {