shuttlepro-shared 1.2.85 → 1.2.86

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.
@@ -1,61 +1,83 @@
1
1
  const Role = require("../../models/Role");
2
2
  const { getRedisData, setRedisData } = require("../../config/redis");
3
3
 
4
- const CACHE_KEY_ALL = "roles_all";
5
- const CACHE_KEY_DEFAULT = "roles_default";
6
-
7
- const getCachedRoles = async () => {
8
- let roles = await getRedisData(CACHE_KEY_ALL);
9
- if (!roles) {
10
- roles = await Role.find().populate("permissionId").lean().exec();
11
- await setRedisData(CACHE_KEY_ALL, roles);
12
- } else {
13
- roles = roles;
4
+ // Cache keys
5
+ const ROLES = "roles";
6
+ const DEFAULT_ROLES = "default_roles";
7
+ const CACHE_TIME = 3600 * 2;
8
+
9
+ // Update the cache for workspace roles
10
+ const updateCachedRoles = async (workspaceId) => {
11
+ try {
12
+ const roles = await Role.find({ workspaceId })
13
+ .populate("permissionId")
14
+ .lean()
15
+ .exec();
16
+ await setRedisData(workspaceId, roles, ROLES, CACHE_TIME);
17
+ return roles;
18
+ } catch (error) {
19
+ console.error("Error updating cached roles:", error);
20
+ return [];
14
21
  }
15
- return roles;
16
22
  };
17
23
 
18
- const updateCachedRoles = async () => {
19
- const roles = await Role.find().populate("permissionId").lean().exec();
20
- await setRedisData(CACHE_KEY_ALL, roles);
24
+ // Get roles from cache or database for a specific workspace
25
+ const getRoles = async (workspaceId) => {
26
+ let roles = await getRedisData(workspaceId, ROLES);
27
+ if (!roles || roles?.length === 0) {
28
+ roles = await Role.find({ workspaceId })
29
+ .populate("permissionId")
30
+ .lean()
31
+ .exec();
32
+ await setRedisData(workspaceId, roles, ROLES, CACHE_TIME);
33
+ }
34
+ return roles;
21
35
  };
22
36
 
23
- const getCachedDefaultRoles = async () => {
24
- let defaultRoles = await getRedisData(CACHE_KEY_DEFAULT);
25
- if (!defaultRoles) {
37
+ // Update default roles cache (system-wide roles with no workspace)
38
+ const updateCachedDefaultRoles = async () => {
39
+ try {
26
40
  const data = await Role.find({ name: { $ne: "super" }, workspaceId: null })
27
41
  .select("name")
28
42
  .sort({ _id: -1 })
29
43
  .lean()
30
44
  .exec();
31
45
 
32
- defaultRoles = data.map((d) => {
46
+ const defaultRoles = data.map((d) => {
33
47
  return {
34
48
  id: d?._id,
35
49
  name: d?.name,
36
50
  };
37
51
  });
38
52
 
39
- await setRedisData(CACHE_KEY_DEFAULT, defaultRoles);
53
+ await setRedisData("system", defaultRoles, DEFAULT_ROLES, CACHE_TIME);
54
+ return defaultRoles;
55
+ } catch (error) {
56
+ console.error("Error updating cached default roles:", error);
57
+ return [];
40
58
  }
41
- return defaultRoles;
42
59
  };
43
60
 
44
- const updateCachedDefaultRoles = async () => {
45
- const data = await Role.find({ name: { $ne: "super" }, workspaceId: null })
46
- .select("name")
47
- .sort({ _id: -1 })
48
- .lean()
49
- .exec();
61
+ // Get default roles from cache or database
62
+ const getDefaultRoles = async () => {
63
+ let defaultRoles = await getRedisData("system", DEFAULT_ROLES);
64
+ if (!defaultRoles || defaultRoles?.length === 0) {
65
+ const data = await Role.find({ name: { $ne: "super" }, workspaceId: null })
66
+ .select("name")
67
+ .sort({ _id: -1 })
68
+ .lean()
69
+ .exec();
50
70
 
51
- const defaultRoles = data.map((d) => {
52
- return {
53
- id: d?._id,
54
- name: utils.capitalize(d?.name),
55
- };
56
- });
71
+ defaultRoles = data.map((d) => {
72
+ return {
73
+ id: d?._id,
74
+ name: d?.name,
75
+ };
76
+ });
57
77
 
58
- await setRedisData(CACHE_KEY_DEFAULT, defaultRoles);
78
+ await setRedisData("system", defaultRoles, DEFAULT_ROLES, CACHE_TIME);
79
+ }
80
+ return defaultRoles;
59
81
  };
60
82
 
61
83
  const createRole = async (roleData) => {
@@ -64,31 +86,56 @@ const createRole = async (roleData) => {
64
86
  .populate("permissionId")
65
87
  .lean()
66
88
  .exec();
67
- await updateCachedRoles();
89
+
90
+ if (createdRole.workspaceId) {
91
+ await updateCachedRoles(createdRole.workspaceId);
92
+ } else {
93
+ // If it's a default/system role
94
+ await updateCachedDefaultRoles();
95
+ }
96
+
68
97
  return createdRole;
69
98
  };
70
99
 
71
- const findRoleById = async (id) => {
72
- const roles = await getCachedRoles();
73
- const role = roles.find((r) => r._id.toString() === id) || null;
100
+ const findRoleById = async (id, workspaceId) => {
101
+ const roles = await getRoles(workspaceId);
102
+ const role = roles.find((r) => r._id.toString() === id);
74
103
 
75
104
  if (role) return role;
76
105
 
77
106
  // If not found in cache, query directly
78
- return await Role.findById(id).populate("permissionId").lean().exec();
107
+ const freshRole = await Role.findById(id)
108
+ .populate("permissionId")
109
+ .lean()
110
+ .exec();
111
+ if (freshRole && freshRole.workspaceId?.toString() === workspaceId) {
112
+ // Update the cache with the new data
113
+ await updateCachedRoles(workspaceId);
114
+ }
115
+ return freshRole;
79
116
  };
80
117
 
81
118
  const findSingleRole = async (filter) => {
82
- const roles = await getCachedRoles();
83
- const role =
84
- roles.find((r) =>
119
+ const workspaceId = filter.workspaceId;
120
+ if (workspaceId) {
121
+ const roles = await getRoles(workspaceId);
122
+ const role = roles.find((r) =>
85
123
  Object.entries(filter).every(([key, value]) => r[key] === value)
86
- ) || null;
124
+ );
87
125
 
88
- if (role) return role;
126
+ if (role) return role;
127
+ }
89
128
 
90
- // If not found in cache, query directly
91
- return await Role.findOne(filter).populate("permissionId").lean().exec();
129
+ // If not found in cache or no workspaceId provided, query directly
130
+ const freshRole = await Role.findOne(filter)
131
+ .populate("permissionId")
132
+ .lean()
133
+ .exec();
134
+ if (freshRole && freshRole.workspaceId) {
135
+ // Update the cache with the new data
136
+ await updateCachedRoles(freshRole.workspaceId);
137
+ }
138
+ return freshRole;
92
139
  };
93
140
 
94
141
  const findRolesByPagination = async (body) => {
@@ -126,12 +173,11 @@ const findRolesByPagination = async (body) => {
126
173
  };
127
174
 
128
175
  const findRoles = async (workspaceId) => {
129
- const roles = await getCachedRoles();
130
- return roles.filter((r) => r.workspaceId === workspaceId);
176
+ return await getRoles(workspaceId);
131
177
  };
132
178
 
133
179
  const findDefaultRoles = async () => {
134
- return await getCachedDefaultRoles();
180
+ return await getDefaultRoles();
135
181
  };
136
182
 
137
183
  const updateRoleById = async (id, updateData) => {
@@ -151,7 +197,9 @@ const updateRoleById = async (id, updateData) => {
151
197
  .exec();
152
198
 
153
199
  if (updatedRole) {
154
- await updateCachedRoles();
200
+ if (updatedRole.workspaceId) {
201
+ await updateCachedRoles(updatedRole.workspaceId);
202
+ }
155
203
  // Update default roles cache if needed
156
204
  if (!updatedRole.workspaceId) {
157
205
  await updateCachedDefaultRoles();
@@ -170,7 +218,9 @@ const updateRoleByFilter = async (filter, updateData) => {
170
218
  .exec();
171
219
 
172
220
  if (updatedRole) {
173
- await updateCachedRoles();
221
+ if (updatedRole.workspaceId) {
222
+ await updateCachedRoles(updatedRole.workspaceId);
223
+ }
174
224
  // Update default roles cache if needed
175
225
  if (!updatedRole.workspaceId) {
176
226
  await updateCachedDefaultRoles();
@@ -182,20 +232,21 @@ const updateRoleByFilter = async (filter, updateData) => {
182
232
 
183
233
  const updateRolesByFilter = async (filter, updateData) => {
184
234
  const result = await Role.updateMany(filter, updateData, { new: true });
185
-
186
235
  if (result.matchedCount > 0) {
187
- await updateCachedRoles();
188
-
189
- // Check if we need to update default roles cache
190
- if (!filter.workspaceId || filter.workspaceId === null) {
191
- await updateCachedDefaultRoles();
236
+ if (filter.workspaceId) {
237
+ await updateCachedRoles(filter.workspaceId);
238
+ } else {
239
+ if (!filter.workspaceId || filter.workspaceId === null) {
240
+ await updateCachedDefaultRoles();
241
+ }
192
242
  }
193
243
  }
194
-
195
244
  return result;
196
245
  };
197
246
 
198
247
  const addLogToRole = async (id, logData) => {
248
+ const role = await Role.findById(id).lean().exec();
249
+ const workspaceId = role?.workspaceId;
199
250
  const updatedRole = await Role.findByIdAndUpdate(
200
251
  id,
201
252
  { $push: { logs: logData } },
@@ -205,14 +256,15 @@ const addLogToRole = async (id, logData) => {
205
256
  .lean()
206
257
  .exec();
207
258
 
208
- if (updatedRole) {
209
- await updateCachedRoles();
259
+ if (updatedRole && workspaceId) {
260
+ await updateCachedRoles(workspaceId);
210
261
  }
211
-
212
262
  return updatedRole;
213
263
  };
214
264
 
215
265
  const clearRoleLogs = async (id) => {
266
+ const role = await Role.findById(id).lean().exec();
267
+ const workspaceId = role?.workspaceId;
216
268
  const updatedRole = await Role.findByIdAndUpdate(
217
269
  id,
218
270
  { $set: { logs: [] } },
@@ -221,15 +273,15 @@ const clearRoleLogs = async (id) => {
221
273
  .populate("permissionId")
222
274
  .lean()
223
275
  .exec();
224
-
225
- if (updatedRole) {
226
- await updateCachedRoles();
276
+ if (updatedRole && workspaceId) {
277
+ await updateCachedRoles(workspaceId);
227
278
  }
228
-
229
279
  return updatedRole;
230
280
  };
231
281
 
232
282
  const addPermissionToRole = async (id, permission) => {
283
+ const role = await Role.findById(id).lean().exec();
284
+ const workspaceId = role?.workspaceId;
233
285
  const updatedRole = await Role.findByIdAndUpdate(
234
286
  id,
235
287
  { $push: { permissions: permission } },
@@ -238,15 +290,16 @@ const addPermissionToRole = async (id, permission) => {
238
290
  .populate("permissionId")
239
291
  .lean()
240
292
  .exec();
241
-
242
- if (updatedRole) {
243
- await updateCachedRoles();
293
+ if (updatedRole && workspaceId) {
294
+ await updateCachedRoles(workspaceId);
244
295
  }
245
-
246
296
  return updatedRole;
247
297
  };
248
298
 
249
299
  const removePermissionFromRole = async (id, permission) => {
300
+ const role = await Role.findById(id).lean().exec();
301
+ const workspaceId = role?.workspaceId;
302
+
250
303
  const updatedRole = await Role.findByIdAndUpdate(
251
304
  id,
252
305
  { $pull: { permissions: permission } },
@@ -256,18 +309,23 @@ const removePermissionFromRole = async (id, permission) => {
256
309
  .lean()
257
310
  .exec();
258
311
 
259
- if (updatedRole) {
260
- await updateCachedRoles();
312
+ if (updatedRole && workspaceId) {
313
+ await updateCachedRoles(workspaceId);
261
314
  }
262
315
 
263
316
  return updatedRole;
264
317
  };
265
318
 
266
319
  const deleteRoleById = async (id) => {
320
+ const role = await Role.findById(id).lean().exec();
321
+ const workspaceId = role?.workspaceId;
322
+
267
323
  const deletedRole = await Role.findByIdAndDelete(id).lean().exec();
268
324
 
269
325
  if (deletedRole) {
270
- await updateCachedRoles();
326
+ if (workspaceId) {
327
+ await updateCachedRoles(workspaceId);
328
+ }
271
329
  // Update default roles cache if needed
272
330
  if (!deletedRole.workspaceId) {
273
331
  await updateCachedDefaultRoles();
@@ -278,10 +336,13 @@ const deleteRoleById = async (id) => {
278
336
  };
279
337
 
280
338
  const deleteSingleRole = async (filter) => {
339
+ const workspaceId = filter.workspaceId;
281
340
  const deletedRole = await Role.findOneAndDelete(filter).lean().exec();
282
341
 
283
342
  if (deletedRole) {
284
- await updateCachedRoles();
343
+ if (workspaceId) {
344
+ await updateCachedRoles(workspaceId);
345
+ }
285
346
  // Update default roles cache if needed
286
347
  if (!deletedRole.workspaceId) {
287
348
  await updateCachedDefaultRoles();
@@ -292,19 +353,18 @@ const deleteSingleRole = async (filter) => {
292
353
  };
293
354
 
294
355
  const deleteManyRoles = async (filter) => {
295
- // Check if we need to update default roles cache
356
+ const workspaceId = filter.workspaceId;
296
357
  const includesDefaultRoles =
297
358
  !filter.workspaceId || filter.workspaceId === null;
298
-
299
359
  const result = await Role.deleteMany(filter);
300
-
301
360
  if (result.deletedCount > 0) {
302
- await updateCachedRoles();
361
+ if (workspaceId) {
362
+ await updateCachedRoles(workspaceId);
363
+ }
303
364
  if (includesDefaultRoles) {
304
365
  await updateCachedDefaultRoles();
305
366
  }
306
367
  }
307
-
308
368
  return result;
309
369
  };
310
370
 
@@ -325,4 +385,6 @@ module.exports = {
325
385
  deleteManyRoles,
326
386
  findRolesByPagination,
327
387
  findDefaultRoles,
388
+ updateCachedRoles,
389
+ updateCachedDefaultRoles,
328
390
  };
package/config/redis.js CHANGED
@@ -81,8 +81,12 @@ const setRedisData = async (
81
81
  await connectRedis();
82
82
  const stringifiedValue = JSON.stringify(value);
83
83
  let result;
84
+
84
85
  if (field) {
85
86
  result = await client.hSet(key, field, stringifiedValue);
87
+ if (expiryInSeconds) {
88
+ await client.expire(key, expiryInSeconds);
89
+ }
86
90
  } else {
87
91
  result = expiryInSeconds
88
92
  ? await client.set(key, stringifiedValue, { EX: expiryInSeconds })
@@ -94,6 +98,7 @@ const setRedisData = async (
94
98
  return null;
95
99
  }
96
100
  };
101
+
97
102
  const addDataToRedisSet = async (key, value) => {
98
103
  try {
99
104
  await connectRedis();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shuttlepro-shared",
3
- "version": "1.2.85",
3
+ "version": "1.2.86",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {