@unchainedshop/core-users 2.0.0-beta8 → 2.0.0-rc.1

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.
package/jest.config.js CHANGED
@@ -2,4 +2,13 @@
2
2
  export default {
3
3
  preset: 'ts-jest',
4
4
  testEnvironment: 'node',
5
+ extensionsToTreatAsEsm: ['.ts'],
6
+ transform: {
7
+ '^.+\\.tsx?$': [
8
+ 'ts-jest',
9
+ {
10
+ useESM: true,
11
+ },
12
+ ],
13
+ },
5
14
  };
@@ -1,3 +1,6 @@
1
+ import { Query } from '@unchainedshop/types/common';
1
2
  import { ModuleInput } from '@unchainedshop/types/core';
2
- import { UsersModule } from '@unchainedshop/types/user';
3
+ import { User, UserQuery, UsersModule } from '@unchainedshop/types/user';
4
+ export declare const removeConfidentialServiceHashes: (rawUser: User) => User;
5
+ export declare const buildFindSelector: ({ includeGuests, queryString, ...rest }: UserQuery) => Query;
3
6
  export declare const configureUsersModule: ({ db, migrationRepository, }: ModuleInput<Record<string, never>>) => Promise<UsersModule>;
@@ -1,8 +1,10 @@
1
1
  import localePkg from 'locale';
2
2
  import { log, LogLevel } from '@unchainedshop/logger';
3
3
  import { emit, registerEvents } from '@unchainedshop/events';
4
- import { generateDbFilterById, generateDbMutations, Schemas, systemLocale } from '@unchainedshop/utils';
4
+ import { generateDbFilterById, generateDbMutations, Schemas, systemLocale, buildSortOptions, } from '@unchainedshop/utils';
5
5
  import { FileDirector } from '@unchainedshop/file-upload';
6
+ import { SortDirection } from '@unchainedshop/types/api';
7
+ import { v4 as uuidv4 } from 'uuid';
6
8
  import { UsersCollection } from '../db/UsersCollection';
7
9
  import addMigrations from './addMigrations';
8
10
  const { Locale } = localePkg;
@@ -16,27 +18,22 @@ const USER_EVENTS = [
16
18
  'USER_UPDATE_HEARTBEAT',
17
19
  'USER_UPDATE_BILLING_ADDRESS',
18
20
  'USER_UPDATE_LAST_CONTACT',
21
+ 'USER_REMOVE',
19
22
  ];
20
- const removeConfidentialServiceHashes = (rawUser) => {
23
+ export const removeConfidentialServiceHashes = (rawUser) => {
21
24
  const user = rawUser;
22
25
  delete user?.services;
23
26
  return user;
24
27
  };
25
- const buildFindSelector = ({ includeGuests, queryString, ...rest }) => {
26
- const selector = { ...rest };
28
+ export const buildFindSelector = ({ includeGuests, queryString, ...rest }) => {
29
+ const selector = { ...rest, deleted: null };
27
30
  if (!includeGuests)
28
- selector.guest = { $ne: true }; // TODO: Slow IDXSCAN in common query
31
+ selector.guest = { $in: [false, null] };
29
32
  if (queryString) {
30
33
  selector.$text = { $search: queryString };
31
34
  }
32
35
  return selector;
33
36
  };
34
- const getUserLocale = (user, params = {}) => {
35
- const locale = params.localeContext ||
36
- (user.lastLogin?.locale && new Locale(user.lastLogin.locale)) ||
37
- systemLocale;
38
- return locale;
39
- };
40
37
  FileDirector.registerFileUploadCallback('user-avatars', async (file, context) => {
41
38
  const { services } = context;
42
39
  return services.users.updateUserAvatarAfterUpload({ file }, context);
@@ -76,6 +73,7 @@ export const configureUsersModule = async ({ db, migrationRepository, }) => {
76
73
  return Users.findOne(selector, options);
77
74
  },
78
75
  findUsers: async ({ limit, offset, ...query }) => {
76
+ const defaultSort = [{ key: 'created', value: SortDirection.ASC }];
79
77
  const selector = buildFindSelector(query);
80
78
  if (query.queryString) {
81
79
  return Users.find(selector, {
@@ -85,10 +83,15 @@ export const configureUsersModule = async ({ db, migrationRepository, }) => {
85
83
  sort: { score: { $meta: 'textScore' } },
86
84
  }).toArray();
87
85
  }
88
- return Users.find(selector, { skip: offset, limit }).toArray();
86
+ return Users.find(selector, {
87
+ skip: offset,
88
+ limit,
89
+ sort: buildSortOptions(query.sort || defaultSort),
90
+ }).toArray();
89
91
  },
90
92
  userExists: async ({ userId }) => {
91
93
  const selector = generateDbFilterById(userId);
94
+ selector.deleted = null; // skip deleted users when checked for existance!
92
95
  const userCount = await Users.countDocuments(selector, { limit: 1 });
93
96
  return !!userCount;
94
97
  },
@@ -96,8 +99,9 @@ export const configureUsersModule = async ({ db, migrationRepository, }) => {
96
99
  primaryEmail: (user) => {
97
100
  return (user.emails || []).sort((left, right) => Number(right.verified) - Number(left.verified))?.[0];
98
101
  },
99
- userLocale: (user, params = {}) => {
100
- return getUserLocale(user, params);
102
+ userLocale: (user) => {
103
+ const locale = (user.lastLogin?.locale && new Locale(user.lastLogin.locale)) || systemLocale;
104
+ return locale;
101
105
  },
102
106
  // Mutations
103
107
  addRoles: async (userId, roles) => {
@@ -111,17 +115,16 @@ export const configureUsersModule = async ({ db, migrationRepository, }) => {
111
115
  });
112
116
  return updateResult.modifiedCount;
113
117
  },
114
- updateAvatar: async (_id, fileId, userId) => {
118
+ updateAvatar: async (_id, fileId) => {
115
119
  const userFilter = generateDbFilterById(_id);
116
120
  log('Update Avatar', { userId: _id });
117
121
  const modifier = {
118
122
  $set: {
119
123
  avatarId: fileId,
120
124
  updated: new Date(),
121
- updatedBy: userId,
122
125
  },
123
126
  };
124
- await mutations.update(_id, modifier, userId);
127
+ await mutations.update(_id, modifier);
125
128
  const user = await Users.findOne(userFilter, {});
126
129
  await emit('USER_UPDATE_AVATAR', {
127
130
  user: removeConfidentialServiceHashes(user),
@@ -143,7 +146,7 @@ export const configureUsersModule = async ({ db, migrationRepository, }) => {
143
146
  },
144
147
  },
145
148
  };
146
- await mutations.update(userId, modifier, userId);
149
+ await mutations.update(userId, modifier);
147
150
  const user = await Users.findOne(userFilter, {});
148
151
  await emit('USER_UPDATE_HEARTBEAT', {
149
152
  user: removeConfidentialServiceHashes(user),
@@ -158,8 +161,40 @@ export const configureUsersModule = async ({ db, migrationRepository, }) => {
158
161
  const modifier = { $set: { initialPassword } };
159
162
  await Users.updateOne(generateDbFilterById(user._id), modifier);
160
163
  },
161
- updateProfile: async (_id, updatedData, userId) => {
162
- const userFilter = generateDbFilterById(_id);
164
+ delete: async (userId) => {
165
+ const userFilter = generateDbFilterById(userId);
166
+ const existingUser = await Users.findOne(userFilter, {
167
+ projection: { emails: true, username: true },
168
+ });
169
+ if (!existingUser)
170
+ return null;
171
+ const obfuscatedEmails = existingUser.emails?.flatMap(({ address, verified }) => {
172
+ if (!verified)
173
+ return [];
174
+ return [
175
+ {
176
+ address: `${address}@${uuidv4()}.unchained.local`,
177
+ verified: true,
178
+ },
179
+ ];
180
+ });
181
+ const obfuscatedUsername = existingUser.username ? `${existingUser.username}-${uuidv4()}` : null;
182
+ Users.updateOne(userFilter, {
183
+ $set: {
184
+ emails: obfuscatedEmails,
185
+ username: obfuscatedUsername,
186
+ services: {},
187
+ },
188
+ });
189
+ await mutations.delete(userId);
190
+ const user = await Users.findOne(userFilter, {});
191
+ await emit('USER_REMOVE', {
192
+ user: removeConfidentialServiceHashes(user),
193
+ });
194
+ return user;
195
+ },
196
+ updateProfile: async (userId, updatedData) => {
197
+ const userFilter = generateDbFilterById(userId);
163
198
  const { meta, profile } = updatedData;
164
199
  if (!meta && !profile) {
165
200
  return Users.findOne(userFilter, {});
@@ -178,22 +213,20 @@ export const configureUsersModule = async ({ db, migrationRepository, }) => {
178
213
  // @ts-ignore
179
214
  modifier.$set.meta = meta;
180
215
  }
181
- await mutations.update(_id, modifier, userId);
216
+ await mutations.update(userId, modifier);
182
217
  const user = await Users.findOne(userFilter, {});
183
218
  await emit('USER_UPDATE_PROFILE', {
184
219
  user: removeConfidentialServiceHashes(user),
185
220
  });
186
221
  return user;
187
222
  },
188
- updateLastBillingAddress: async (_id, lastBillingAddress, userId) => {
223
+ updateLastBillingAddress: async (_id, lastBillingAddress) => {
189
224
  const userFilter = generateDbFilterById(_id);
190
225
  const user = await Users.findOne(userFilter, {});
191
- log('Store Last Billing Address', { userId });
192
226
  const modifier = {
193
227
  $set: {
194
228
  lastBillingAddress,
195
229
  updated: new Date(),
196
- updatedBy: userId,
197
230
  },
198
231
  };
199
232
  const profile = user.profile || {};
@@ -206,23 +239,21 @@ export const configureUsersModule = async ({ db, migrationRepository, }) => {
206
239
  .filter(Boolean)
207
240
  .join(' ');
208
241
  }
209
- await mutations.update(_id, modifier, userId);
242
+ await mutations.update(_id, modifier);
210
243
  const updatedUser = await Users.findOne(userFilter, {});
211
244
  await emit('USER_UPDATE_BILLING_ADDRESS', {
212
245
  user: removeConfidentialServiceHashes(user),
213
246
  });
214
247
  return updatedUser;
215
248
  },
216
- updateLastContact: async (_id, lastContact, userId) => {
249
+ updateLastContact: async (_id, lastContact) => {
217
250
  const userFilter = generateDbFilterById(_id);
218
251
  const user = await Users.findOne(userFilter, {});
219
- log('Store Last Contact', { userId });
220
252
  const profile = user.profile || {};
221
253
  const isGuest = !!user.guest;
222
254
  const modifier = {
223
255
  $set: {
224
256
  updated: new Date(),
225
- updatedBy: userId,
226
257
  lastContact,
227
258
  },
228
259
  };
@@ -230,39 +261,37 @@ export const configureUsersModule = async ({ db, migrationRepository, }) => {
230
261
  // Backport the contact phone number to the user profile
231
262
  modifier.$set['profile.phoneMobile'] = lastContact.telNumber;
232
263
  }
233
- await mutations.update(_id, modifier, userId);
264
+ await mutations.update(_id, modifier);
234
265
  const updatedUser = await Users.findOne(userFilter, {});
235
266
  await emit('USER_UPDATE_LAST_CONTACT', {
236
267
  user: removeConfidentialServiceHashes(user),
237
268
  });
238
269
  return updatedUser;
239
270
  },
240
- updateRoles: async (_id, roles, userId) => {
271
+ updateRoles: async (_id, roles) => {
241
272
  const userFilter = generateDbFilterById(_id);
242
273
  const modifier = {
243
274
  $set: {
244
275
  updated: new Date(),
245
- updateBy: userId,
246
276
  roles,
247
277
  },
248
278
  };
249
- await mutations.update(_id, modifier, userId);
279
+ await mutations.update(_id, modifier);
250
280
  const user = await Users.findOne(userFilter, {});
251
281
  await emit('USER_UPDATE_ROLE', {
252
282
  user: removeConfidentialServiceHashes(user),
253
283
  });
254
284
  return user;
255
285
  },
256
- updateTags: async (_id, tags, userId) => {
286
+ updateTags: async (_id, tags) => {
257
287
  const userFilter = generateDbFilterById(_id);
258
288
  const modifier = {
259
289
  $set: {
260
290
  updated: new Date(),
261
- updateBy: userId,
262
291
  tags,
263
292
  },
264
293
  };
265
- await mutations.update(_id, modifier, userId);
294
+ await mutations.update(_id, modifier);
266
295
  const user = await Users.findOne(userFilter, {});
267
296
  await emit('USER_UPDATE_TAGS', {
268
297
  user: removeConfidentialServiceHashes(user),
@@ -1 +1 @@
1
- {"version":3,"file":"configureUsersModule.js","sourceRoot":"","sources":["../../src/module/configureUsersModule.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,QAAQ,CAAC;AAK/B,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;AAE7B,MAAM,WAAW,GAAG;IAClB,aAAa;IACb,qBAAqB;IACrB,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,oBAAoB;IACpB,uBAAuB;IACvB,6BAA6B;IAC7B,0BAA0B;CAC3B,CAAC;AACF,MAAM,+BAA+B,GAAG,CAAC,OAAa,EAAQ,EAAE;IAC9D,MAAM,IAAI,GAAG,OAAO,CAAC;IACrB,OAAO,IAAI,EAAE,QAAQ,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,IAAI,EAAa,EAAE,EAAE;IAC/E,MAAM,QAAQ,GAAU,EAAE,GAAG,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,aAAa;QAAE,QAAQ,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,qCAAqC;IACzF,IAAI,WAAW,EAAE;QACf,QAAQ,CAAC,KAAK,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;KAC3C;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAU,EAAE,SAAyC,EAAE,EAAE,EAAE;IAChF,MAAM,MAAM,GACV,MAAM,CAAC,aAAa;QACpB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC7D,YAAY,CAAC;IACf,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,YAAY,CAAC,0BAA0B,CAAC,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE;IACvF,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE7B,OAAO,QAAQ,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,EACzC,EAAE,EACF,mBAAmB,GACgB,EAAwB,EAAE;IAC7D,cAAc,CAAC,WAAW,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;IAExC,YAAY;IACZ,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAEnC,MAAM,SAAS,GAAG,mBAAmB,CAAO,KAAK,EAAE,OAAO,CAAC,IAAI,CAA0B,CAAC;IAE1F,OAAO;QACL,UAAU;QACV,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACrB,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,MAAM;YACvB,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE;YAC/C,IAAI,WAAW,EAAE;gBACf,OAAO,KAAK,CAAC,OAAO,CAAC;oBACnB,yCAAyC,EAAE,WAAW;iBACvD,CAAC,CAAC;aACJ;YAED,IAAI,UAAU,EAAE;gBACd,OAAO,KAAK,CAAC,OAAO,CAAC;oBACnB,+BAA+B,EAAE,UAAU;iBAC5C,CAAC,CAAC;aACJ;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAED,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAE1C,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;YAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAE1C,IAAI,KAAK,CAAC,WAAW,EAAE;gBACrB,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;oBAC1B,IAAI,EAAE,MAAM;oBACZ,KAAK;oBACL,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;oBAC7C,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;iBACxC,CAAC,CAAC,OAAO,EAAE,CAAC;aACd;YAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACjE,CAAC;QAED,UAAU,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC/B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACrE,OAAO,CAAC,CAAC,SAAS,CAAC;QACrB,CAAC;QAED,kBAAkB;QAClB,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAC7B,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAChE,EAAE,CAAC,CAAC,CAAC,CAAC;QACT,CAAC;QAED,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE;YAChC,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QAED,YAAY;QACZ,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;YAChC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE;gBACnD,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;aACvC,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC/C,MAAM,IAAI,CAAC,gBAAgB,EAAE;gBAC3B,IAAI,EAAE,+BAA+B,CAAC,IAAI,CAAC;aAC5C,CAAC,CAAC;YAEH,OAAO,YAAY,CAAC,aAAa,CAAC;QACpC,CAAC;QAED,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC7C,GAAG,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAEtC,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE;oBACJ,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,IAAI,IAAI,EAAE;oBACnB,SAAS,EAAE,MAAM;iBAClB;aACF,CAAC;YAEF,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,oBAAoB,EAAE;gBAC/B,IAAI,EAAE,+BAA+B,CAAC,IAAI,CAAC;aAC5C,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;YACjC,GAAG,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;YACrC,MAAM,KAAK,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClE,CAAC;QAED,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;YAC3C,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAEhD,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE;oBACJ,SAAS,EAAE;wBACT,SAAS,EAAE,IAAI,IAAI,EAAE;wBACrB,GAAG,SAAS;qBACb;iBACF;aACF,CAAC;YAEF,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEjD,MAAM,IAAI,CAAC,uBAAuB,EAAE;gBAClC,IAAI,EAAE,+BAA+B,CAAC,IAAI,CAAC;aAC5C,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qBAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE;YACrD,GAAG,CAAC,mCAAmC,eAAe,EAAE,EAAE;gBACxD,MAAM,EAAE,IAAI,CAAC,GAAG;gBAChB,KAAK,EAAE,QAAQ,CAAC,OAAO;aACxB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,CAAC;YAC/C,MAAM,KAAK,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClE,CAAC;QAED,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE;YAChD,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YAEtC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;gBACrB,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;aACtC;YAED,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YAE9B,IAAI,OAAO,EAAE;gBACX,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE;oBAC9D,OAAO;wBACL,GAAG,GAAG;wBACN,CAAC,WAAW,UAAU,EAAE,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;qBAC/C,CAAC;gBACJ,CAAC,EAAE,EAAE,CAAC,CAAC;aACR;YAED,IAAI,IAAI,EAAE;gBACR,2BAA2B;gBAC3B,aAAa;gBACb,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;aAC3B;YAED,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,qBAAqB,EAAE;gBAChC,IAAI,EAAE,+BAA+B,CAAC,IAAI,CAAC;aAC5C,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wBAAwB,EAAE,KAAK,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE;YAClE,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEjD,GAAG,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAE9C,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE;oBACJ,kBAAkB;oBAClB,OAAO,EAAE,IAAI,IAAI,EAAE;oBACnB,SAAS,EAAE,MAAM;iBAClB;aACF,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAE7B,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,EAAE;gBACnC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG;oBACrC,kBAAkB,CAAC,SAAS;oBAC5B,kBAAkB,CAAC,QAAQ;iBAC5B;qBACE,MAAM,CAAC,OAAO,CAAC;qBACf,IAAI,CAAC,GAAG,CAAC,CAAC;aACd;YAED,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,IAAI,CAAC,6BAA6B,EAAE;gBACxC,IAAI,EAAE,+BAA+B,CAAC,IAAI,CAAC;aAC5C,CAAC,CAAC;YACH,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE;YACpD,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEjD,GAAG,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAEtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAE7B,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI,IAAI,EAAE;oBACnB,SAAS,EAAE,MAAM;oBACjB,WAAW;iBACZ;aACF,CAAC;YAEF,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,WAAW,CAAC,SAAS,EAAE;gBAC9D,wDAAwD;gBACxD,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC;aAC9D;YAED,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,IAAI,CAAC,0BAA0B,EAAE;gBACrC,IAAI,EAAE,+BAA+B,CAAC,IAAI,CAAC;aAC5C,CAAC,CAAC;YACH,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAE7C,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI,IAAI,EAAE;oBACnB,QAAQ,EAAE,MAAM;oBAChB,KAAK;iBACN;aACF,CAAC;YACF,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,kBAAkB,EAAE;gBAC7B,IAAI,EAAE,+BAA+B,CAAC,IAAI,CAAC;aAC5C,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;YACtC,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAE7C,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI,IAAI,EAAE;oBACnB,QAAQ,EAAE,MAAM;oBAChB,IAAI;iBACL;aACF,CAAC;YAEF,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,kBAAkB,EAAE;gBAC7B,IAAI,EAAE,+BAA+B,CAAC,IAAI,CAAC;aAC5C,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YAC7C,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,IAAI,CAAC,aAAa,EAAE;gBACxB,IAAI,EAAE,+BAA+B,CAAC,IAAI,CAAC;aAC5C,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"configureUsersModule.js","sourceRoot":"","sources":["../../src/module/configureUsersModule.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- export const getUserCountryService = async (user, params, { modules }) => {
2
- const userLocale = modules.users.userLocale(user, params);
1
+ export const getUserCountryService = async (user, { modules }) => {
2
+ const userLocale = modules.users.userLocale(user);
3
3
  return modules.countries.findCountry({
4
4
  isoCode: userLocale.country.toUpperCase(),
5
5
  });
@@ -1 +1 @@
1
- {"version":3,"file":"getUserCountryService.js","sourceRoot":"","sources":["../../src/services/getUserCountryService.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAA0B,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IAC9F,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE1D,OAAO,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC;QACnC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE;KAC1C,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"getUserCountryService.js","sourceRoot":"","sources":["../../src/services/getUserCountryService.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAA0B,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IACtF,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC;QACnC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE;KAC1C,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
- export const getUserLanguageService = async (user, params, { modules }) => {
2
- const userLocale = modules.users.userLocale(user, params);
1
+ export const getUserLanguageService = async (user, { modules }) => {
2
+ const userLocale = modules.users.userLocale(user);
3
3
  return modules.languages.findLanguage({
4
4
  isoCode: userLocale.language,
5
5
  });
@@ -1 +1 @@
1
- {"version":3,"file":"getUserLanguageService.js","sourceRoot":"","sources":["../../src/services/getUserLanguageService.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAA2B,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IAChG,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE1D,OAAO,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC;QACpC,OAAO,EAAE,UAAU,CAAC,QAAQ;KAC7B,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"getUserLanguageService.js","sourceRoot":"","sources":["../../src/services/getUserLanguageService.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAA2B,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IACxF,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC;QACpC,OAAO,EAAE,UAAU,CAAC,QAAQ;KAC7B,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export const updateUserAvatarAfterUploadService = async ({ file }, context) => {
2
- const { modules, services, userId: currentUserId } = context;
2
+ const { modules, services } = context;
3
3
  const { userId } = file.meta;
4
4
  const user = await modules.users.findUserById(userId);
5
5
  if (user?.avatarId) {
@@ -7,6 +7,6 @@ export const updateUserAvatarAfterUploadService = async ({ file }, context) => {
7
7
  fileIds: [user.avatarId],
8
8
  }, context);
9
9
  }
10
- await modules.users.updateAvatar(userId, file._id, currentUserId || file.updatedBy || file.createdBy);
10
+ await modules.users.updateAvatar(userId, file._id);
11
11
  };
12
12
  //# sourceMappingURL=updateUserAvatarAfterUploadService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"updateUserAvatarAfterUploadService.js","sourceRoot":"","sources":["../../src/services/updateUserAvatarAfterUploadService.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kCAAkC,GAAuC,KAAK,EACzF,EAAE,IAAI,EAAE,EACR,OAAO,EACP,EAAE;IACF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAA0B,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAEtD,IAAI,IAAI,EAAE,QAAQ,EAAE;QAClB,MAAM,QAAQ,CAAC,KAAK,CAAC,WAAW,CAC9B;YACE,OAAO,EAAE,CAAC,IAAI,CAAC,QAAkB,CAAC;SACnC,EACD,OAAO,CACR,CAAC;KACH;IAED,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,aAAa,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AACxG,CAAC,CAAC"}
1
+ {"version":3,"file":"updateUserAvatarAfterUploadService.js","sourceRoot":"","sources":["../../src/services/updateUserAvatarAfterUploadService.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kCAAkC,GAAuC,KAAK,EACzF,EAAE,IAAI,EAAE,EACR,OAAO,EACP,EAAE;IACF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAA0B,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAEtD,IAAI,IAAI,EAAE,QAAQ,EAAE;QAClB,MAAM,QAAQ,CAAC,KAAK,CAAC,WAAW,CAC9B;YACE,OAAO,EAAE,CAAC,IAAI,CAAC,QAAkB,CAAC;SACnC,EACD,OAAO,CACR,CAAC;KACH;IAED,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC,CAAC"}
@@ -1,11 +1,9 @@
1
1
  import { getUserCountryService } from './getUserCountryService';
2
2
  import { getUserLanguageService } from './getUserLanguageService';
3
- import { getUserRoleActionsService } from './getUserRoleActionsService';
4
3
  import { updateUserAvatarAfterUploadService } from './updateUserAvatarAfterUploadService';
5
4
  export const userServices = {
6
5
  getUserCountry: getUserCountryService,
7
6
  getUserLanguage: getUserLanguageService,
8
- getUserRoleActions: getUserRoleActionsService,
9
7
  updateUserAvatarAfterUpload: updateUserAvatarAfterUploadService,
10
8
  };
11
9
  //# sourceMappingURL=userServices.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"userServices.js","sourceRoot":"","sources":["../../src/services/userServices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAE1F,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,cAAc,EAAE,qBAAqB;IACrC,eAAe,EAAE,sBAAsB;IACvC,kBAAkB,EAAE,yBAAyB;IAC7C,2BAA2B,EAAE,kCAAkC;CAChE,CAAC"}
1
+ {"version":3,"file":"userServices.js","sourceRoot":"","sources":["../../src/services/userServices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAE1F,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,cAAc,EAAE,qBAAqB;IACrC,eAAe,EAAE,sBAAsB;IACvC,2BAA2B,EAAE,kCAAkC;CAChE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unchainedshop/core-users",
3
- "version": "2.0.0-beta8",
3
+ "version": "2.0.0-rc.1",
4
4
  "main": "lib/users-index.js",
5
5
  "exports": {
6
6
  ".": "./lib/users-index.js",
@@ -12,7 +12,8 @@
12
12
  "clean": "rm -rf lib",
13
13
  "build": "npm run clean && tsc",
14
14
  "watch": "tsc -w",
15
- "test": "jest --watch"
15
+ "test": "NODE_OPTIONS=--experimental-vm-modules jest --detectOpenHandles --forceExit",
16
+ "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch --detectOpenHandles --forceExit"
16
17
  },
17
18
  "repository": {
18
19
  "type": "git",
@@ -30,19 +31,20 @@
30
31
  },
31
32
  "homepage": "https://github.com/unchainedshop/unchained#readme",
32
33
  "dependencies": {
33
- "@unchainedshop/events": "^2.0.0-beta8",
34
- "@unchainedshop/file-upload": "^2.0.0-beta8",
35
- "@unchainedshop/logger": "^2.0.0-beta8",
36
- "@unchainedshop/roles": "^2.0.0-beta8",
37
- "@unchainedshop/utils": "^2.0.0-beta8",
34
+ "@unchainedshop/events": "^2.0.0-rc.1",
35
+ "@unchainedshop/file-upload": "^2.0.0-rc.1",
36
+ "@unchainedshop/logger": "^2.0.0-rc.1",
37
+ "@unchainedshop/roles": "^2.0.0-rc.1",
38
+ "@unchainedshop/utils": "^2.0.0-rc.1",
38
39
  "locale": "^0.1.0",
39
- "simpl-schema": "^3.0.1"
40
+ "simpl-schema": "=3.2.0",
41
+ "uuid": "^9.0.0"
40
42
  },
41
43
  "devDependencies": {
42
- "@types/node": "^18.11.9",
43
- "@unchainedshop/types": "^2.0.0-beta8",
44
+ "@types/node": "^18.11.17",
45
+ "@unchainedshop/types": "^2.0.0-rc.1",
44
46
  "jest": "^29.3.1",
45
47
  "ts-jest": "^29.0.3",
46
- "typescript": "^4.9.3"
48
+ "typescript": "^4.9.4"
47
49
  }
48
50
  }
@@ -1,13 +1,19 @@
1
1
  import localePkg from 'locale';
2
- import type { Locale as LocaleType } from 'locale';
3
2
  import { Query } from '@unchainedshop/types/common';
4
- import { ModuleInput, ModuleMutations } from '@unchainedshop/types/core';
3
+ import { ModuleInput, ModuleMutations, UnchainedCore } from '@unchainedshop/types/core';
5
4
  import { User, UserQuery, UsersModule } from '@unchainedshop/types/user';
6
5
  import { log, LogLevel } from '@unchainedshop/logger';
7
6
  import { emit, registerEvents } from '@unchainedshop/events';
8
- import { generateDbFilterById, generateDbMutations, Schemas, systemLocale } from '@unchainedshop/utils';
7
+ import {
8
+ generateDbFilterById,
9
+ generateDbMutations,
10
+ Schemas,
11
+ systemLocale,
12
+ buildSortOptions,
13
+ } from '@unchainedshop/utils';
9
14
  import { FileDirector } from '@unchainedshop/file-upload';
10
- import { Context } from '@unchainedshop/types/api';
15
+ import { SortDirection, SortOption } from '@unchainedshop/types/api';
16
+ import { v4 as uuidv4 } from 'uuid';
11
17
  import { UsersCollection } from '../db/UsersCollection';
12
18
  import addMigrations from './addMigrations';
13
19
 
@@ -23,31 +29,24 @@ const USER_EVENTS = [
23
29
  'USER_UPDATE_HEARTBEAT',
24
30
  'USER_UPDATE_BILLING_ADDRESS',
25
31
  'USER_UPDATE_LAST_CONTACT',
32
+ 'USER_REMOVE',
26
33
  ];
27
- const removeConfidentialServiceHashes = (rawUser: User): User => {
34
+ export const removeConfidentialServiceHashes = (rawUser: User): User => {
28
35
  const user = rawUser;
29
36
  delete user?.services;
30
37
  return user;
31
38
  };
32
39
 
33
- const buildFindSelector = ({ includeGuests, queryString, ...rest }: UserQuery) => {
34
- const selector: Query = { ...rest };
35
- if (!includeGuests) selector.guest = { $ne: true }; // TODO: Slow IDXSCAN in common query
40
+ export const buildFindSelector = ({ includeGuests, queryString, ...rest }: UserQuery) => {
41
+ const selector: Query = { ...rest, deleted: null };
42
+ if (!includeGuests) selector.guest = { $in: [false, null] };
36
43
  if (queryString) {
37
44
  selector.$text = { $search: queryString };
38
45
  }
39
46
  return selector;
40
47
  };
41
48
 
42
- const getUserLocale = (user: User, params: { localeContext?: LocaleType } = {}) => {
43
- const locale =
44
- params.localeContext ||
45
- (user.lastLogin?.locale && new Locale(user.lastLogin.locale)) ||
46
- systemLocale;
47
- return locale;
48
- };
49
-
50
- FileDirector.registerFileUploadCallback('user-avatars', async (file, context: Context) => {
49
+ FileDirector.registerFileUploadCallback('user-avatars', async (file, context: UnchainedCore) => {
51
50
  const { services } = context;
52
51
 
53
52
  return services.users.updateUserAvatarAfterUpload({ file }, context);
@@ -100,6 +99,7 @@ export const configureUsersModule = async ({
100
99
  },
101
100
 
102
101
  findUsers: async ({ limit, offset, ...query }) => {
102
+ const defaultSort = [{ key: 'created', value: SortDirection.ASC }] as SortOption[];
103
103
  const selector = buildFindSelector(query);
104
104
 
105
105
  if (query.queryString) {
@@ -111,11 +111,16 @@ export const configureUsersModule = async ({
111
111
  }).toArray();
112
112
  }
113
113
 
114
- return Users.find(selector, { skip: offset, limit }).toArray();
114
+ return Users.find(selector, {
115
+ skip: offset,
116
+ limit,
117
+ sort: buildSortOptions(query.sort || defaultSort),
118
+ }).toArray();
115
119
  },
116
120
 
117
121
  userExists: async ({ userId }) => {
118
- const selector = generateDbFilterById(userId);
122
+ const selector = generateDbFilterById<User>(userId);
123
+ selector.deleted = null; // skip deleted users when checked for existance!
119
124
  const userCount = await Users.countDocuments(selector, { limit: 1 });
120
125
  return !!userCount;
121
126
  },
@@ -127,8 +132,9 @@ export const configureUsersModule = async ({
127
132
  )?.[0];
128
133
  },
129
134
 
130
- userLocale: (user, params = {}) => {
131
- return getUserLocale(user, params);
135
+ userLocale: (user) => {
136
+ const locale = (user.lastLogin?.locale && new Locale(user.lastLogin.locale)) || systemLocale;
137
+ return locale;
132
138
  },
133
139
 
134
140
  // Mutations
@@ -146,7 +152,7 @@ export const configureUsersModule = async ({
146
152
  return updateResult.modifiedCount;
147
153
  },
148
154
 
149
- updateAvatar: async (_id, fileId, userId) => {
155
+ updateAvatar: async (_id, fileId) => {
150
156
  const userFilter = generateDbFilterById(_id);
151
157
  log('Update Avatar', { userId: _id });
152
158
 
@@ -154,11 +160,10 @@ export const configureUsersModule = async ({
154
160
  $set: {
155
161
  avatarId: fileId,
156
162
  updated: new Date(),
157
- updatedBy: userId,
158
163
  },
159
164
  };
160
165
 
161
- await mutations.update(_id, modifier, userId);
166
+ await mutations.update(_id, modifier);
162
167
  const user = await Users.findOne(userFilter, {});
163
168
  await emit('USER_UPDATE_AVATAR', {
164
169
  user: removeConfidentialServiceHashes(user),
@@ -185,7 +190,7 @@ export const configureUsersModule = async ({
185
190
  },
186
191
  };
187
192
 
188
- await mutations.update(userId, modifier, userId);
193
+ await mutations.update(userId, modifier);
189
194
  const user = await Users.findOne(userFilter, {});
190
195
 
191
196
  await emit('USER_UPDATE_HEARTBEAT', {
@@ -204,8 +209,44 @@ export const configureUsersModule = async ({
204
209
  await Users.updateOne(generateDbFilterById(user._id), modifier);
205
210
  },
206
211
 
207
- updateProfile: async (_id, updatedData, userId) => {
208
- const userFilter = generateDbFilterById(_id);
212
+ delete: async (userId) => {
213
+ const userFilter = generateDbFilterById(userId);
214
+
215
+ const existingUser = await Users.findOne(userFilter, {
216
+ projection: { emails: true, username: true },
217
+ });
218
+ if (!existingUser) return null;
219
+
220
+ const obfuscatedEmails = existingUser.emails?.flatMap(({ address, verified }) => {
221
+ if (!verified) return [];
222
+ return [
223
+ {
224
+ address: `${address}@${uuidv4()}.unchained.local`,
225
+ verified: true,
226
+ },
227
+ ];
228
+ });
229
+
230
+ const obfuscatedUsername = existingUser.username ? `${existingUser.username}-${uuidv4()}` : null;
231
+
232
+ Users.updateOne(userFilter, {
233
+ $set: {
234
+ emails: obfuscatedEmails,
235
+ username: obfuscatedUsername,
236
+ services: {},
237
+ },
238
+ });
239
+
240
+ await mutations.delete(userId);
241
+ const user = await Users.findOne(userFilter, {});
242
+ await emit('USER_REMOVE', {
243
+ user: removeConfidentialServiceHashes(user),
244
+ });
245
+ return user;
246
+ },
247
+
248
+ updateProfile: async (userId, updatedData) => {
249
+ const userFilter = generateDbFilterById(userId);
209
250
  const { meta, profile } = updatedData;
210
251
 
211
252
  if (!meta && !profile) {
@@ -229,7 +270,7 @@ export const configureUsersModule = async ({
229
270
  modifier.$set.meta = meta;
230
271
  }
231
272
 
232
- await mutations.update(_id, modifier, userId);
273
+ await mutations.update(userId, modifier);
233
274
  const user = await Users.findOne(userFilter, {});
234
275
  await emit('USER_UPDATE_PROFILE', {
235
276
  user: removeConfidentialServiceHashes(user),
@@ -237,17 +278,14 @@ export const configureUsersModule = async ({
237
278
  return user;
238
279
  },
239
280
 
240
- updateLastBillingAddress: async (_id, lastBillingAddress, userId) => {
281
+ updateLastBillingAddress: async (_id, lastBillingAddress) => {
241
282
  const userFilter = generateDbFilterById(_id);
242
283
  const user = await Users.findOne(userFilter, {});
243
284
 
244
- log('Store Last Billing Address', { userId });
245
-
246
285
  const modifier = {
247
286
  $set: {
248
287
  lastBillingAddress,
249
288
  updated: new Date(),
250
- updatedBy: userId,
251
289
  },
252
290
  };
253
291
  const profile = user.profile || {};
@@ -262,7 +300,7 @@ export const configureUsersModule = async ({
262
300
  .join(' ');
263
301
  }
264
302
 
265
- await mutations.update(_id, modifier, userId);
303
+ await mutations.update(_id, modifier);
266
304
  const updatedUser = await Users.findOne(userFilter, {});
267
305
  await emit('USER_UPDATE_BILLING_ADDRESS', {
268
306
  user: removeConfidentialServiceHashes(user),
@@ -270,19 +308,15 @@ export const configureUsersModule = async ({
270
308
  return updatedUser;
271
309
  },
272
310
 
273
- updateLastContact: async (_id, lastContact, userId) => {
311
+ updateLastContact: async (_id, lastContact) => {
274
312
  const userFilter = generateDbFilterById(_id);
275
313
  const user = await Users.findOne(userFilter, {});
276
-
277
- log('Store Last Contact', { userId });
278
-
279
314
  const profile = user.profile || {};
280
315
  const isGuest = !!user.guest;
281
316
 
282
317
  const modifier = {
283
318
  $set: {
284
319
  updated: new Date(),
285
- updatedBy: userId,
286
320
  lastContact,
287
321
  },
288
322
  };
@@ -292,7 +326,7 @@ export const configureUsersModule = async ({
292
326
  modifier.$set['profile.phoneMobile'] = lastContact.telNumber;
293
327
  }
294
328
 
295
- await mutations.update(_id, modifier, userId);
329
+ await mutations.update(_id, modifier);
296
330
  const updatedUser = await Users.findOne(userFilter, {});
297
331
  await emit('USER_UPDATE_LAST_CONTACT', {
298
332
  user: removeConfidentialServiceHashes(user),
@@ -300,35 +334,33 @@ export const configureUsersModule = async ({
300
334
  return updatedUser;
301
335
  },
302
336
 
303
- updateRoles: async (_id, roles, userId) => {
337
+ updateRoles: async (_id, roles) => {
304
338
  const userFilter = generateDbFilterById(_id);
305
339
 
306
340
  const modifier = {
307
341
  $set: {
308
342
  updated: new Date(),
309
- updateBy: userId,
310
343
  roles,
311
344
  },
312
345
  };
313
- await mutations.update(_id, modifier, userId);
346
+ await mutations.update(_id, modifier);
314
347
  const user = await Users.findOne(userFilter, {});
315
348
  await emit('USER_UPDATE_ROLE', {
316
349
  user: removeConfidentialServiceHashes(user),
317
350
  });
318
351
  return user;
319
352
  },
320
- updateTags: async (_id, tags, userId) => {
353
+ updateTags: async (_id, tags) => {
321
354
  const userFilter = generateDbFilterById(_id);
322
355
 
323
356
  const modifier = {
324
357
  $set: {
325
358
  updated: new Date(),
326
- updateBy: userId,
327
359
  tags,
328
360
  },
329
361
  };
330
362
 
331
- await mutations.update(_id, modifier, userId);
363
+ await mutations.update(_id, modifier);
332
364
  const user = await Users.findOne(userFilter, {});
333
365
  await emit('USER_UPDATE_TAGS', {
334
366
  user: removeConfidentialServiceHashes(user),
@@ -1,8 +1,7 @@
1
1
  import { GetUserCountryService } from '@unchainedshop/types/user';
2
2
 
3
- export const getUserCountryService: GetUserCountryService = async (user, params, { modules }) => {
4
- const userLocale = modules.users.userLocale(user, params);
5
-
3
+ export const getUserCountryService: GetUserCountryService = async (user, { modules }) => {
4
+ const userLocale = modules.users.userLocale(user);
6
5
  return modules.countries.findCountry({
7
6
  isoCode: userLocale.country.toUpperCase(),
8
7
  });
@@ -1,8 +1,7 @@
1
1
  import { GetUserLanguageService } from '@unchainedshop/types/user';
2
2
 
3
- export const getUserLanguageService: GetUserLanguageService = async (user, params, { modules }) => {
4
- const userLocale = modules.users.userLocale(user, params);
5
-
3
+ export const getUserLanguageService: GetUserLanguageService = async (user, { modules }) => {
4
+ const userLocale = modules.users.userLocale(user);
6
5
  return modules.languages.findLanguage({
7
6
  isoCode: userLocale.language,
8
7
  });
@@ -4,7 +4,7 @@ export const updateUserAvatarAfterUploadService: UpdateUserAvatarAfterUploadServ
4
4
  { file },
5
5
  context,
6
6
  ) => {
7
- const { modules, services, userId: currentUserId } = context;
7
+ const { modules, services } = context;
8
8
  const { userId } = file.meta as { userId: string };
9
9
  const user = await modules.users.findUserById(userId);
10
10
 
@@ -17,5 +17,5 @@ export const updateUserAvatarAfterUploadService: UpdateUserAvatarAfterUploadServ
17
17
  );
18
18
  }
19
19
 
20
- await modules.users.updateAvatar(userId, file._id, currentUserId || file.updatedBy || file.createdBy);
20
+ await modules.users.updateAvatar(userId, file._id);
21
21
  };
@@ -1,12 +1,10 @@
1
1
  import { UserServices } from '@unchainedshop/types/user';
2
2
  import { getUserCountryService } from './getUserCountryService';
3
3
  import { getUserLanguageService } from './getUserLanguageService';
4
- import { getUserRoleActionsService } from './getUserRoleActionsService';
5
4
  import { updateUserAvatarAfterUploadService } from './updateUserAvatarAfterUploadService';
6
5
 
7
6
  export const userServices: UserServices = {
8
7
  getUserCountry: getUserCountryService,
9
8
  getUserLanguage: getUserLanguageService,
10
- getUserRoleActions: getUserRoleActionsService,
11
9
  updateUserAvatarAfterUpload: updateUserAvatarAfterUploadService,
12
10
  };
@@ -0,0 +1,81 @@
1
+ export default {
2
+ _id: 'PKve0k9fLCUzn2EUi',
3
+ guest: false,
4
+ initialPassword: false,
5
+ lastBillingAddress: {},
6
+ profile: {
7
+ address: {
8
+ firstName: null,
9
+ lastName: null,
10
+ company: null,
11
+ addressLine: null,
12
+ addressLine2: null,
13
+ postalCode: null,
14
+ regionCode: null,
15
+ city: null,
16
+ countryCode: null,
17
+ },
18
+ birthday: new Date('2022-11-21T21:00:00.000Z'),
19
+ displayName: null,
20
+ gender: null,
21
+ phoneMobile: null,
22
+ },
23
+ roles: ['admin'],
24
+ services: {
25
+ password: {
26
+ bcrypt: '$2a$10$EM5ILD3UtmiP/JJzDvhL3ennDpMEYXfFCCPZ6AiSk3ZM1aPUSjoI2',
27
+ reset: [
28
+ {
29
+ token:
30
+ '637dfa08a1a48aba26437de983a6cef32fef369252c97791b81712b2283a1173308efade2666d24dab6aa4',
31
+ address: 'admin@unchained.local',
32
+ when: new Date('2022-11-26T19:37:30.170Z'),
33
+ reason: 'reset',
34
+ },
35
+ ],
36
+ },
37
+ token: {
38
+ secret: 'secret',
39
+ },
40
+ resume: {
41
+ loginTokens: [
42
+ {
43
+ hashedToken: '12eK1jAbw9kcP5u/sha4M5T2pKVVQol1aAbITYGmtCI=',
44
+ when: new Date('2022-11-27T10:36:00.313Z'),
45
+ },
46
+ ],
47
+ },
48
+ webAuthn: [],
49
+ web3: [
50
+ {
51
+ address: '0xF5F72AE7fa1fa990ebaF163208Ed7aD6a3f42DEA',
52
+ nonce: '463693',
53
+ },
54
+ ],
55
+ 'two-factor': {
56
+ secret: {
57
+ base32: 'JF2HO5SAN4YFE7LLKR4FMRSXN47ESVCE',
58
+ },
59
+ },
60
+ },
61
+ createdAt: new Date('2022-10-20T17:14:48.834Z'),
62
+ updatedAt: new Date('2022-11-26T19:17:57.131Z'),
63
+ username: 'admin',
64
+ emails: [
65
+ {
66
+ address: 'admin@unchained.local',
67
+ verified: false,
68
+ },
69
+ ],
70
+ lastLogin: {
71
+ timestamp: new Date('2022-11-28T16:28:53.202Z'),
72
+ remoteAddress: '::ffff:127.0.0.1',
73
+ remotePort: '42978',
74
+ userAgent:
75
+ 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
76
+ locale: 'de_CH',
77
+ countryContext: 'CH',
78
+ },
79
+ updated: new Date('2022-11-30T11:02:19.624Z'),
80
+ updatedBy: 'PKve0k9fLCUzn2EUi',
81
+ };
@@ -1,47 +1,35 @@
1
- import { assert } from 'chai';
2
- import { initDb } from '@unchainedshop/mongodb';
3
- import { configureUsersModule } from '@unchainedshop/core-users';
4
- import { UsersModule } from '@unchainedshop/types/user';
5
- import { Db } from '@unchainedshop/types/common';
1
+ import user from './mock/user-mock'
2
+ import {buildFindSelector, removeConfidentialServiceHashes} from '../src/module/configureUsersModule'
3
+ import { User } from '@unchainedshop/types/user';
6
4
 
7
- describe('Test exports', () => {
8
- let module: UsersModule;
9
- let db: Db;
10
- let userId: string;
11
-
12
- before(async () => {
13
- db = await initDb();
14
- module = await configureUsersModule({ db });
15
- assert.ok(module);
16
- });
17
- before(async () => {
18
- const Users = db.collection('users');
19
- await Users.deleteMany({});
20
- const insertResult = await Users.insertOne({
21
- emails: [],
22
- username: 'test.user',
23
- lastLogin: {},
24
- profile: {
25
- displayName: 'Test User',
26
- birthday: new Date('1995-01-12'),
27
- phoneMobile: '+41701231212',
28
- gender: 'Male',
29
- },
30
- guest: false,
31
- tags: [],
32
- services: {},
33
- roles: ['admin'],
5
+ describe('User', () => {
6
+ describe('removeConfidentialServiceHashes', () => {
7
+ it('Should remove sensitive user credentials ', async () => {
8
+ expect(user.services).not.toBeUndefined()
9
+ removeConfidentialServiceHashes(user as unknown as User)
10
+ expect(user.services).toBeUndefined()
34
11
  });
35
12
 
36
- userId = insertResult.insertedId.toHexString();
37
- });
13
+
14
+ })
38
15
 
39
- it('Check queries', async () => {
40
- assert.isTrue(await module.userExists({ userId }));
41
- assert.isFalse(await module.userExists({ userId: '123123133123ABCD' }));
42
- assert.equal(await module.count({ queryString: 'Test' }), 1);
43
- assert.equal(await module.count({ queryString: 'Urrghh' }), 0);
44
- assert.ok(await module.findUserById(userId));
45
- assert.lengthOf(await module.findUsers({ limit: 10 }), 1);
46
- });
16
+ describe('buildFindSelector', () => {
17
+ it('Return the correct filter when no parameter is passed', async () => {
18
+ expect(buildFindSelector({})).toEqual({ "deleted": null, guest: { '$in': [false, null] },
19
+ })
20
+ });
21
+ it('Return the correct filter when no parameter is passed queryString and includeGuest: true', async () => {
22
+ expect(buildFindSelector({queryString: "Hello world", includeGuests: true})).toEqual({ "deleted": null,'$text': { '$search': 'Hello world' } })
23
+ });
24
+
25
+ it('Should include additional user field selector in addition too queryString and includeGuests', async () => {
26
+ expect(buildFindSelector({queryString: "Hello world", includeGuests: false, "profile.displayName": "mikael"})).toEqual({
27
+ 'profile.displayName': 'mikael',
28
+ "deleted": null,
29
+ guest: { '$in': [false, null] },
30
+ '$text': { '$search': 'Hello world' }
31
+ })
32
+ });
33
+ })
34
+
47
35
  });
@@ -1,2 +0,0 @@
1
- import { GetUserRoleActionsService } from '@unchainedshop/types/user';
2
- export declare const getUserRoleActionsService: GetUserRoleActionsService;
@@ -1,30 +0,0 @@
1
- import { Roles } from '@unchainedshop/roles';
2
- const permissions = async (userRoles, allRoles) => {
3
- const actions = userRoles?.flatMap((role) => {
4
- const foundRole = Object.values(allRoles).find((r) => r.name === role);
5
- if (!foundRole)
6
- return [];
7
- return Object.entries(foundRole.allowRules || {}).flatMap(([roleName, funcs]) => {
8
- return funcs.map(async (f) => {
9
- try {
10
- // return permissions that are by default activated for that role,
11
- // accidentally don't check context
12
- const r = await f(null, null, null);
13
- if (r)
14
- return roleName;
15
- return null;
16
- }
17
- catch (e) {
18
- return null;
19
- }
20
- });
21
- });
22
- });
23
- const resolvedActions = await Promise.all(actions);
24
- return [...new Set(resolvedActions)].filter(Boolean).sort((a, b) => a.localeCompare(b));
25
- };
26
- export const getUserRoleActionsService = async (user, context) => {
27
- const userRoles = Roles.getUserRoles(user?._id, user.roles, true);
28
- return permissions(userRoles, context.roles);
29
- };
30
- //# sourceMappingURL=getUserRoleActionsService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getUserRoleActionsService.js","sourceRoot":"","sources":["../../src/services/getUserRoleActionsService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,WAAW,GAAG,KAAK,EAAE,SAAc,EAAE,QAAa,EAAE,EAAE;IAC1D,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1C,MAAM,SAAS,GAAQ,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACjF,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAM,EAAE,EAAE;YACnF,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC3B,IAAI;oBACF,kEAAkE;oBAClE,mCAAmC;oBACnC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBACpC,IAAI,CAAC;wBAAE,OAAO,QAAQ,CAAC;oBACvB,OAAO,IAAI,CAAC;iBACb;gBAAC,OAAO,CAAC,EAAE;oBACV,OAAO,IAAI,CAAC;iBACb;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAA8B,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC1F,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClE,OAAO,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAsB,CAAC;AACpE,CAAC,CAAC"}
@@ -1,29 +0,0 @@
1
- import { GetUserRoleActionsService } from '@unchainedshop/types/user';
2
- import { Roles } from '@unchainedshop/roles';
3
-
4
- const permissions = async (userRoles: any, allRoles: any) => {
5
- const actions = userRoles?.flatMap((role) => {
6
- const foundRole: any = Object.values(allRoles).find((r: any) => r.name === role);
7
- if (!foundRole) return [];
8
- return Object.entries(foundRole.allowRules || {}).flatMap(([roleName, funcs]: any) => {
9
- return funcs.map(async (f) => {
10
- try {
11
- // return permissions that are by default activated for that role,
12
- // accidentally don't check context
13
- const r = await f(null, null, null);
14
- if (r) return roleName;
15
- return null;
16
- } catch (e) {
17
- return null;
18
- }
19
- });
20
- });
21
- });
22
- const resolvedActions = await Promise.all(actions);
23
- return [...new Set(resolvedActions)].filter(Boolean).sort((a: any, b: any) => a.localeCompare(b));
24
- };
25
-
26
- export const getUserRoleActionsService: GetUserRoleActionsService = async (user, context) => {
27
- const userRoles = Roles.getUserRoles(user?._id, user.roles, true);
28
- return permissions(userRoles, context.roles) as Promise<string[]>;
29
- };