shuttlepro-shared 1.2.74 → 1.2.75

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,105 +5,12 @@ 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";
9
-
10
- const getCachedMembers = async (filter = {}) => {
11
- 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
- });
97
- } catch (error) {
98
- console.error("Error fetching cached members:", error);
99
- return [];
100
- }
101
- };
8
+ const MEMBERS = "members";
102
9
 
103
10
  // Update the cache for all members
104
- const updateCachedMembers = async (filter = {}) => {
11
+ const updateCachedMembers = async (workspaceId) => {
105
12
  try {
106
- const members = await UserRole.find(filter)
13
+ const members = await UserRole.find({ workspaceId })
107
14
  .select("userId role userShift roleId")
108
15
  .populate({
109
16
  path: "roleId",
@@ -117,62 +24,80 @@ const updateCachedMembers = async (filter = {}) => {
117
24
  })
118
25
  .lean()
119
26
  .exec();
120
-
121
- const validMembers =
122
- members?.filter((member) => member?.userId && member?.roleId) || [];
123
-
124
- console.log(validMembers, "validMembers");
125
-
126
- await setRedisData(CACHE_KEY_ALL_MEMBERS, validMembers, null, 3600);
127
-
128
- return validMembers;
27
+ await setRedisData(workspaceId, members, MEMBERS, 3600);
28
+ return members;
129
29
  } catch (error) {
130
30
  console.error("Error updating cached members:", error);
131
31
  return [];
132
32
  }
133
33
  };
134
34
 
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);
35
+ const getMembers = async (workspaceId) => {
36
+ let members = await getRedisData(workspaceId, MEMBERS);
37
+ if (!members || members?.length === 0) {
38
+ members = await UserRole.find({ workspaceId })
39
+ .select("userId role userShift roleId")
40
+ .populate({
41
+ path: "roleId",
42
+ select: "id name userId userShift permissionId modulePermissions",
43
+ populate: [{ path: "permissionId", select: "id name" }],
44
+ })
45
+ .populate({
46
+ path: "userId",
47
+ match: { isDeleted: false, suspended: false },
48
+ select: "firstName lastName role email picture userShift",
49
+ })
50
+ .lean()
51
+ .exec();
52
+ await setRedisData(workspaceId, members, MEMBERS, 3600);
141
53
  }
54
+ return members;
55
+ };
56
+
57
+ const getMemberByWorkspaceIdAndUserId = async (workspaceId, userId) => {
58
+ const members = getMembers(workspaceId);
59
+ return (
60
+ members?.find(
61
+ (member) =>
62
+ member?.workspaceId === workspaceId && member?.userId?._id === userId
63
+ ) || null
64
+ );
142
65
  };
143
66
 
144
67
  // 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)
68
+ const findSingleUserRoleByFilter = async ({ workspaceId, userId }) => {
69
+ return await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
70
+ };
71
+
72
+ const createUserRole = async (data) => {
73
+ const savedRole = await UserRole.create(data);
74
+ return await updateCachedMembers(savedRole?.workspaceId?.toString());
75
+ };
76
+
77
+ const findOneAndUpdateUserRole = async ({
78
+ workspaceId,
79
+ userId,
80
+ userShift,
81
+ role,
82
+ }) => {
83
+ await UserRole.findOneAndUpdate(
84
+ { workspaceId, userId },
85
+ { $set: { userShift, role } },
86
+ { new: true, upsert: false }
87
+ )
174
88
  .lean()
175
89
  .exec();
90
+ return await updateCachedMembers(workspaceId);
91
+ };
92
+
93
+ const updateUserRole = async (filter, payload) => {
94
+ await UserRole.updateOne(filter, payload).exec();
95
+ return await updateCachedMembers(filter.workspaceId);
96
+ };
97
+
98
+ const deleteUserRoleByFilter = async (filter) => {
99
+ await UserRole.deleteOne(filter).exec();
100
+ return await updateCachedMembers(filter.workspaceId);
176
101
  };
177
102
 
178
103
  const convertPermissionsArrayToObject = (originalArray) => {
@@ -198,107 +123,13 @@ const convertPermissionsArrayToObject = (originalArray) => {
198
123
  }, {});
199
124
  };
200
125
 
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
126
  const getUserPermissions = async (workspaceId, userId) => {
296
127
  try {
297
- let members = await getCachedMembers({ workspaceId, userId });
298
- if (members?.length) {
128
+ let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
129
+ if (data) {
299
130
  return (
300
131
  convertPermissionsArrayToObject(
301
- members?.[0]?.roleId?.modulePermissions?.modules
132
+ data?.roleId?.modulePermissions?.modules
302
133
  ) || null
303
134
  );
304
135
  }
@@ -311,9 +142,8 @@ const getUserPermissions = async (workspaceId, userId) => {
311
142
 
312
143
  const getUserRoleWithPermissions = async (workspaceId, userId) => {
313
144
  try {
314
- let members = await getCachedMembers({ workspaceId, userId });
315
- if (members?.length) {
316
- let data = members?.[0];
145
+ let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
146
+ if (data) {
317
147
  const roleWithPermissions = {
318
148
  ...data,
319
149
  roleId: data?.roleId?._id?.toString() || "",
@@ -337,9 +167,8 @@ const getUserRoleWithPermissions = async (workspaceId, userId) => {
337
167
 
338
168
  const getChannelsPermissions = async (workspaceId, userId) => {
339
169
  try {
340
- let members = await getCachedMembers({ workspaceId, userId });
341
- if (members?.length) {
342
- let data = members?.[0];
170
+ let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
171
+ if (data) {
343
172
  return (
344
173
  convertPermissionsArrayToObject(
345
174
  data?.roleId?.modulePermissions?.modules
@@ -353,12 +182,41 @@ const getChannelsPermissions = async (workspaceId, userId) => {
353
182
  }
354
183
  };
355
184
 
185
+ const findUserWorkspaces = async (userId) => {
186
+ let userRoleWithWorkspaces = await UserRole.find({ userId: userId })
187
+ .select("userId roleId workspaceId")
188
+ .populate({
189
+ path: "roleId",
190
+ select: "id name userId userShift permissionId modulePermissions",
191
+ populate: [{ path: "permissionId", select: "id name" }],
192
+ })
193
+ .populate({
194
+ path: "workspaceId",
195
+ select: defaultSelect,
196
+ match: { isDeleted: false },
197
+ })
198
+ .lean()
199
+ .exec();
200
+ userRoleWithWorkspaces = userRoleWithWorkspaces
201
+ ?.filter((userRole) => userRole?.workspaceId)
202
+ ?.filter((userRole) => userRole?.roleId)
203
+ ?.map((ur) => {
204
+ return {
205
+ ...ur?.workspaceId,
206
+ id: ur?.workspaceId?._id?.toString(),
207
+ _id: ur?.workspaceId?._id?.toString(),
208
+ role: ur?.roleId?.name || "",
209
+ permissions: ur?.roleId?.modulePermissions?.modules || [],
210
+ };
211
+ });
212
+ return userRoleWithWorkspaces || [];
213
+ };
214
+
356
215
  module.exports = {
357
216
  createUserRole,
358
217
  findUserRole,
359
218
  updateUserRole,
360
219
  deleteUserRoleByFilter,
361
- deleteUserRole,
362
220
  findUserWorkspaces,
363
221
  getUserRoleWithPermissions,
364
222
  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.75",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {