shuttlepro-shared 1.2.73 → 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
|
|
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 (
|
|
11
|
+
const updateCachedMembers = async (workspaceId) => {
|
|
105
12
|
try {
|
|
106
|
-
const members = await UserRole.find(
|
|
13
|
+
const members = await UserRole.find({ workspaceId })
|
|
107
14
|
.select("userId role userShift roleId")
|
|
108
15
|
.populate({
|
|
109
16
|
path: "roleId",
|
|
@@ -117,64 +24,80 @@ const updateCachedMembers = async (filter = {}) => {
|
|
|
117
24
|
})
|
|
118
25
|
.lean()
|
|
119
26
|
.exec();
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const validMembers =
|
|
124
|
-
members?.filter((member) => member?.userId && member?.roleId) || [];
|
|
125
|
-
|
|
126
|
-
conosle.log(validMembers, "validMembers");
|
|
127
|
-
|
|
128
|
-
await setRedisData(CACHE_KEY_ALL_MEMBERS, validMembers);
|
|
129
|
-
|
|
130
|
-
return validMembers;
|
|
27
|
+
await setRedisData(workspaceId, members, MEMBERS, 3600);
|
|
28
|
+
return members;
|
|
131
29
|
} catch (error) {
|
|
132
30
|
console.error("Error updating cached members:", error);
|
|
133
31
|
return [];
|
|
134
32
|
}
|
|
135
33
|
};
|
|
136
34
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
await
|
|
141
|
-
|
|
142
|
-
|
|
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);
|
|
143
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
|
+
);
|
|
144
65
|
};
|
|
145
66
|
|
|
146
67
|
// Find single user role by filter
|
|
147
|
-
const findSingleUserRoleByFilter = async (
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
},
|
|
168
|
-
userPopulate: {
|
|
169
|
-
...defaultPopulateOptions.userPopulate,
|
|
170
|
-
...populateOptions.userPopulate,
|
|
171
|
-
},
|
|
172
|
-
};
|
|
173
|
-
return await UserRole.findOne(filter)
|
|
174
|
-
.populate(mergedPopulateOptions.rolePopulate)
|
|
175
|
-
.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
|
+
)
|
|
176
88
|
.lean()
|
|
177
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);
|
|
178
101
|
};
|
|
179
102
|
|
|
180
103
|
const convertPermissionsArrayToObject = (originalArray) => {
|
|
@@ -200,106 +123,13 @@ const convertPermissionsArrayToObject = (originalArray) => {
|
|
|
200
123
|
}, {});
|
|
201
124
|
};
|
|
202
125
|
|
|
203
|
-
const createUserRole = async (data) => {
|
|
204
|
-
const savedRole = await UserRole.create(data);
|
|
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
|
|
298
|
-
|
|
299
|
-
if (members?.length) {
|
|
128
|
+
let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
|
|
129
|
+
if (data) {
|
|
300
130
|
return (
|
|
301
131
|
convertPermissionsArrayToObject(
|
|
302
|
-
|
|
132
|
+
data?.roleId?.modulePermissions?.modules
|
|
303
133
|
) || null
|
|
304
134
|
);
|
|
305
135
|
}
|
|
@@ -312,10 +142,8 @@ const getUserPermissions = async (workspaceId, userId) => {
|
|
|
312
142
|
|
|
313
143
|
const getUserRoleWithPermissions = async (workspaceId, userId) => {
|
|
314
144
|
try {
|
|
315
|
-
let
|
|
316
|
-
|
|
317
|
-
if (members?.length) {
|
|
318
|
-
let data = members?.[0];
|
|
145
|
+
let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
|
|
146
|
+
if (data) {
|
|
319
147
|
const roleWithPermissions = {
|
|
320
148
|
...data,
|
|
321
149
|
roleId: data?.roleId?._id?.toString() || "",
|
|
@@ -339,10 +167,8 @@ const getUserRoleWithPermissions = async (workspaceId, userId) => {
|
|
|
339
167
|
|
|
340
168
|
const getChannelsPermissions = async (workspaceId, userId) => {
|
|
341
169
|
try {
|
|
342
|
-
let
|
|
343
|
-
|
|
344
|
-
if (members?.length) {
|
|
345
|
-
let data = members?.[0];
|
|
170
|
+
let data = await getMemberByWorkspaceIdAndUserId(workspaceId, userId);
|
|
171
|
+
if (data) {
|
|
346
172
|
return (
|
|
347
173
|
convertPermissionsArrayToObject(
|
|
348
174
|
data?.roleId?.modulePermissions?.modules
|
|
@@ -356,12 +182,41 @@ const getChannelsPermissions = async (workspaceId, userId) => {
|
|
|
356
182
|
}
|
|
357
183
|
};
|
|
358
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
|
+
|
|
359
215
|
module.exports = {
|
|
360
216
|
createUserRole,
|
|
361
217
|
findUserRole,
|
|
362
218
|
updateUserRole,
|
|
363
219
|
deleteUserRoleByFilter,
|
|
364
|
-
deleteUserRole,
|
|
365
220
|
findUserWorkspaces,
|
|
366
221
|
getUserRoleWithPermissions,
|
|
367
222
|
getUserPermissions,
|