@frontegg/redux-store 7.91.0 → 7.93.0-alpha.0

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.
@@ -20,6 +20,9 @@ declare const _default: (store: FronteggState, api: RestApi, sharedActions: Shar
20
20
  loadUsers: (payload: WithCallback<import("../../../interfaces").WithSilentLoad<import("@frontegg/rest-api").ILoadUsers>, import("@frontegg/rest-api").ITeamUser[]>) => Promise<void>;
21
21
  loadUsersV2: (payload: WithCallback<import("../../../interfaces").WithRetryConfig<import("../../../interfaces").WithSilentLoad<import("../interfaces").IGetUsersV2Payload>>, import("@frontegg/rest-api").ITeamUser[]>) => Promise<void>;
22
22
  loadUsersV3: (payload: WithCallback<import("../../../interfaces").WithRetryConfig<import("../../../interfaces").WithSilentLoad<import("../interfaces").IGetUsersV3Payload>>, import("@frontegg/rest-api").ITeamUser[]>) => Promise<void>;
23
+ loadUsersByGetUsersPhoneNumberV2: (payload: WithCallback<import("../../../interfaces").WithRetryConfig<import("../../../interfaces").WithSilentLoad<import("../interfaces").ILoadUsersByGetPhoneNumberV2Payload>>, import("@frontegg/rest-api").ITeamUser[]>) => Promise<void>;
24
+ loadUsersByGetUsernamesV1: (payload: WithCallback<import("../../../interfaces").WithRetryConfig<import("../../../interfaces").WithSilentLoad<import("../interfaces").ILoadUsersByGetUsernamesV1Payload>>, import("@frontegg/rest-api").ITeamUser[]>) => Promise<void>;
25
+ loadUsersByGetEmailsV1: (payload: WithCallback<import("../../../interfaces").WithRetryConfig<import("../../../interfaces").WithSilentLoad<import("../interfaces").ILoadUsersByGetEmailsV1Payload>>, import("@frontegg/rest-api").ITeamUser[]>) => Promise<void>;
23
26
  addUser: (payload: WithCallback<import("../interfaces").AddUserPayload, import("@frontegg/rest-api").ITeamUser>) => Promise<void>;
24
27
  addUsersBulk: (payload: WithCallback<import("../interfaces").IAddUsers, import("../interfaces").BulkInvintationData>) => Promise<void>;
25
28
  updateUser: (payload: WithCallback<import("@frontegg/rest-api").IUpdateUser, import("@frontegg/rest-api").ITeamUser>) => Promise<void>;
@@ -1,11 +1,14 @@
1
1
  import { IDeleteUser, ILoadUsers, ITeamUser, IUpdateUser, IUpdateUserExpiration } from '@frontegg/rest-api';
2
2
  import { FronteggState, RestApi, SharedActions, WithCallback, WithRetryConfig, WithSilentLoad } from '../../../interfaces';
3
- import { AddUserPayload, BulkInvintationData, IAddUsers, IGetUsersV2Payload, IGetUsersV3Payload, LoadRolesAndPermissionsPayload } from '../interfaces';
3
+ import { AddUserPayload, BulkInvintationData, IAddUsers, IGetUsersV2Payload, IGetUsersV3Payload, ILoadUsersByGetPhoneNumberV2Payload, ILoadUsersByGetUsernamesV1Payload, ILoadUsersByGetEmailsV1Payload, LoadRolesAndPermissionsPayload } from '../interfaces';
4
4
  declare const _default: (store: FronteggState, api: RestApi, sharedActions: SharedActions) => {
5
5
  loadRoles: (payload?: WithRetryConfig<LoadRolesAndPermissionsPayload>) => Promise<void>;
6
6
  loadUsers: (payload: WithCallback<WithSilentLoad<ILoadUsers>, ITeamUser[]>) => Promise<void>;
7
7
  loadUsersV2: (payload: WithCallback<WithRetryConfig<WithSilentLoad<IGetUsersV2Payload>>, ITeamUser[]>) => Promise<void>;
8
8
  loadUsersV3: (payload: WithCallback<WithRetryConfig<WithSilentLoad<IGetUsersV3Payload>>, ITeamUser[]>) => Promise<void>;
9
+ loadUsersByGetUsersPhoneNumberV2: (payload: WithCallback<WithRetryConfig<WithSilentLoad<ILoadUsersByGetPhoneNumberV2Payload>>, ITeamUser[]>) => Promise<void>;
10
+ loadUsersByGetUsernamesV1: (payload: WithCallback<WithRetryConfig<WithSilentLoad<ILoadUsersByGetUsernamesV1Payload>>, ITeamUser[]>) => Promise<void>;
11
+ loadUsersByGetEmailsV1: (payload: WithCallback<WithRetryConfig<WithSilentLoad<ILoadUsersByGetEmailsV1Payload>>, ITeamUser[]>) => Promise<void>;
9
12
  addUser: (payload: WithCallback<AddUserPayload, ITeamUser>) => Promise<void>;
10
13
  addUsersBulk: (payload: WithCallback<IAddUsers, BulkInvintationData>) => Promise<void>;
11
14
  updateUser: (payload: WithCallback<IUpdateUser, ITeamUser>) => Promise<void>;
@@ -28,6 +28,186 @@ export default ((store, api, sharedActions) => {
28
28
  return [];
29
29
  }
30
30
  };
31
+
32
+ /**
33
+ * @private
34
+ * Enriches users with roles, groups, permissions, and application data
35
+ */
36
+ const __enrichUsersWithRolesGroupsAndPermissions = async (users, options) => {
37
+ const {
38
+ shouldLoadRoles = true,
39
+ shouldLoadApps,
40
+ retryConfig
41
+ } = options;
42
+
43
+ // Get user IDs for fetching roles and groups
44
+ const userIds = users.map(user => user.id);
45
+
46
+ // Fetch roles, permissions, user roles, user groups, and all groups in parallel
47
+ const [{
48
+ items: userUsernames
49
+ }, {
50
+ items: roles
51
+ }, permissions, userRoles, userGroups, groups] = await Promise.all([userIds.length > 0 ? api.users.getUsersUsernames({
52
+ userIds
53
+ }) : {
54
+ items: []
55
+ }, api.teams.loadAvailableRoles(), api.teams.loadAvailablePermissions(), userIds.length > 0 ? api.users.getUsersRoles({
56
+ ids: userIds
57
+ }) : [], userIds.length > 0 ? api.users.getUsersGroups({
58
+ ids: userIds
59
+ }) : [], __getGroupsForUsers(retryConfig), shouldLoadRoles ? loadRoles({
60
+ retryConfig
61
+ }) : undefined]);
62
+
63
+ // Map user roles and groups to users
64
+ const usersWithRolesAndGroups = users.map(user => {
65
+ var _userUsernames$find;
66
+ // Find user's role IDs
67
+ const userRoleData = userRoles.find(ur => ur.userId === user.id);
68
+ const userRoleIds = (userRoleData == null ? void 0 : userRoleData.roleIds) || [];
69
+ const userRolesFull = roles.filter(role => userRoleIds.includes(role.id));
70
+
71
+ // Find user's group IDs
72
+ const userGroupData = userGroups.find(ug => ug.userId === user.id);
73
+ const userGroupIds = (userGroupData == null ? void 0 : userGroupData.groupIds) || [];
74
+ const userGroupsFull = groups.filter(g => userGroupIds.includes(g.id));
75
+
76
+ // Find user's username
77
+ const userUsername = userUsernames == null ? void 0 : (_userUsernames$find = userUsernames.find(username => username.userId === user.id)) == null ? void 0 : _userUsernames$find.username;
78
+ if (!user.name) {
79
+ user.name = userUsername;
80
+ }
81
+
82
+ //@ts-ignore
83
+ return _extends({}, user, {
84
+ roles: userRolesFull,
85
+ roleIds: userRoleIds,
86
+ groups: userGroupsFull,
87
+ permissions: userRolesFull.flatMap(role => role.permissions)
88
+ });
89
+ });
90
+
91
+ // Add application data if needed
92
+ const enrichedUsers = await sharedActions.mapUsersWithApplicationData({
93
+ shouldLoadApps,
94
+ users: usersWithRolesAndGroups,
95
+ retryConfig
96
+ });
97
+ return {
98
+ enrichedUsers,
99
+ roles,
100
+ permissions
101
+ };
102
+ };
103
+
104
+ /**
105
+ * @private
106
+ * Sets team state with users data and invokes callback
107
+ */
108
+ const __setUsersStateAndCallback = (enrichedUsers, roles, permissions, totalPages, totalItems, callback) => {
109
+ sharedActions.setTeamState({
110
+ users: enrichedUsers,
111
+ totalPages,
112
+ totalItems,
113
+ roles,
114
+ permissions
115
+ });
116
+ actions.setTeamLoader({
117
+ key: TeamStateKeys.USERS,
118
+ value: false
119
+ });
120
+ callback == null ? void 0 : callback(enrichedUsers);
121
+ };
122
+
123
+ /**
124
+ * @private
125
+ * Handles errors for user loading operations
126
+ */
127
+ const __handleUsersLoadError = (error, callback, errorMessage) => {
128
+ if (errorMessage) {
129
+ console.error(errorMessage, error);
130
+ }
131
+ actions.setTeamError({
132
+ key: TeamStateKeys.USERS,
133
+ value: errorHandler(error)
134
+ });
135
+ actions.setTeamState({
136
+ totalPages: 0,
137
+ users: []
138
+ });
139
+ actions.setTeamLoader({
140
+ key: TeamStateKeys.USERS,
141
+ value: false
142
+ });
143
+ callback == null ? void 0 : callback(null, error);
144
+ };
145
+
146
+ /**
147
+ * @private
148
+ * Generic function to load users by search criteria (phone number, username, email)
149
+ */
150
+ const __loadUsersBySearchCriteria = async (payload, fetchFunction, shouldLoadRoles = true, shouldLoadApps) => {
151
+ var _payload$_limit, _payload$_offset, _payload$shouldShowSu;
152
+ const {
153
+ silentLoading,
154
+ callback,
155
+ retryConfig
156
+ } = payload;
157
+ const teamState = store.auth.teamState;
158
+ const pageSize = (_payload$_limit = payload._limit) != null ? _payload$_limit : teamState.pageSize;
159
+ const pageOffset = (_payload$_offset = payload._offset) != null ? _payload$_offset : teamState.pageOffset;
160
+ const shouldIncludeSubTenants = (_payload$shouldShowSu = payload == null ? void 0 : payload.shouldShowSubTenantUsersIfReseller) != null ? _payload$shouldShowSu : teamState == null ? void 0 : teamState.shouldShowSubTenantUsersIfReseller;
161
+ actions.setTeamLoader({
162
+ key: TeamStateKeys.USERS,
163
+ value: !silentLoading
164
+ });
165
+ actions.setTeamState({
166
+ pageSize,
167
+ pageOffset
168
+ });
169
+ try {
170
+ const response = await fetchFunction(pageOffset, pageSize);
171
+ if (!response.items || response.items.length === 0) {
172
+ sharedActions.setTeamState({
173
+ users: [],
174
+ totalPages: 0,
175
+ totalItems: 0
176
+ });
177
+ actions.setTeamLoader({
178
+ key: TeamStateKeys.USERS,
179
+ value: false
180
+ });
181
+ callback == null ? void 0 : callback([]);
182
+ return;
183
+ }
184
+
185
+ // Extract user IDs
186
+ const userIds = response.items.map(item => item.userId);
187
+
188
+ // Fetch users by IDs (no pagination here - we already have the filtered IDs)
189
+ const {
190
+ items: users
191
+ } = await api.users.getUsersV3({
192
+ ids: userIds.join(','),
193
+ _includeSubTenants: shouldIncludeSubTenants
194
+ });
195
+
196
+ // Enrich users with roles, groups, permissions, and application data
197
+ const {
198
+ enrichedUsers,
199
+ roles,
200
+ permissions
201
+ } = await __enrichUsersWithRolesGroupsAndPermissions(users, {
202
+ shouldLoadRoles,
203
+ shouldLoadApps,
204
+ retryConfig
205
+ });
206
+ __setUsersStateAndCallback(enrichedUsers, roles, permissions, response._metadata.totalPages, response._metadata.totalItems, callback);
207
+ } catch (e) {
208
+ __handleUsersLoadError(e, callback, `Failed to load users by search criteria in fetch function: ${fetchFunction.name}`);
209
+ }
210
+ };
31
211
  const loadRoles = async payload => {
32
212
  actions.setTeamLoader({
33
213
  key: TeamStateKeys.ROLES_AND_PERMISSIONS,
@@ -123,7 +303,7 @@ export default ((store, api, sharedActions) => {
123
303
 
124
304
  /*** @deprecated loadUsersV2 is deprecated, use loadUsersV3 instead */
125
305
  const loadUsersV2 = async payload => {
126
- var _payload$pageSize2, _payload$pageOffset2, _payload$filter2, _payload$sort2, _payload$shouldShowSu;
306
+ var _payload$pageSize2, _payload$pageOffset2, _payload$filter2, _payload$sort2, _payload$shouldShowSu2;
127
307
  const {
128
308
  silentLoading,
129
309
  callback,
@@ -136,7 +316,7 @@ export default ((store, api, sharedActions) => {
136
316
  const pageOffset = (_payload$pageOffset2 = payload.pageOffset) != null ? _payload$pageOffset2 : teamState.pageOffset;
137
317
  const filter = (_payload$filter2 = payload.filter) != null ? _payload$filter2 : teamState.filterV2;
138
318
  const sort = (_payload$sort2 = payload.sort) != null ? _payload$sort2 : teamState.sortV2;
139
- const shouldIncludeSubTenants = (_payload$shouldShowSu = payload == null ? void 0 : payload.shouldShowSubTenantUsersIfReseller) != null ? _payload$shouldShowSu : teamState == null ? void 0 : teamState.shouldShowSubTenantUsersIfReseller;
319
+ const shouldIncludeSubTenants = (_payload$shouldShowSu2 = payload == null ? void 0 : payload.shouldShowSubTenantUsersIfReseller) != null ? _payload$shouldShowSu2 : teamState == null ? void 0 : teamState.shouldShowSubTenantUsersIfReseller;
140
320
  actions.setTeamLoader({
141
321
  key: TeamStateKeys.USERS,
142
322
  value: !silentLoading
@@ -214,7 +394,7 @@ export default ((store, api, sharedActions) => {
214
394
  });
215
395
  };
216
396
  const loadUsersV3 = async payload => {
217
- var _payload$pageSize3, _payload$pageOffset3, _payload$sort3, _payload$shouldShowSu2;
397
+ var _payload$pageSize3, _payload$pageOffset3, _payload$sort3, _payload$shouldShowSu3;
218
398
  const {
219
399
  silentLoading,
220
400
  callback,
@@ -226,7 +406,7 @@ export default ((store, api, sharedActions) => {
226
406
  const pageSize = (_payload$pageSize3 = payload.pageSize) != null ? _payload$pageSize3 : teamState.pageSize;
227
407
  const pageOffset = (_payload$pageOffset3 = payload.pageOffset) != null ? _payload$pageOffset3 : teamState.pageOffset;
228
408
  const sort = (_payload$sort3 = payload.sort) != null ? _payload$sort3 : teamState.sortV2;
229
- const shouldIncludeSubTenants = (_payload$shouldShowSu2 = payload == null ? void 0 : payload.shouldShowSubTenantUsersIfReseller) != null ? _payload$shouldShowSu2 : teamState == null ? void 0 : teamState.shouldShowSubTenantUsersIfReseller;
409
+ const shouldIncludeSubTenants = (_payload$shouldShowSu3 = payload == null ? void 0 : payload.shouldShowSubTenantUsersIfReseller) != null ? _payload$shouldShowSu3 : teamState == null ? void 0 : teamState.shouldShowSubTenantUsersIfReseller;
230
410
  actions.setTeamLoader({
231
411
  key: TeamStateKeys.USERS,
232
412
  value: !silentLoading
@@ -253,96 +433,42 @@ export default ((store, api, sharedActions) => {
253
433
  _includeSubTenants: shouldIncludeSubTenants
254
434
  }, getIdentifierFilterForUsersV3(payload)));
255
435
 
256
- // Get user IDs for fetching roles and groups
257
- const userIds = users.map(user => user.id);
258
-
259
- // Fetch roles, permissions, user roles, user groups, and all groups in parallel
260
- const [{
261
- items: userUsernames
262
- }, {
263
- items: roles
264
- }, permissions, userRoles, userGroups, groups] = await Promise.all([userIds.length > 0 ? api.users.getUsersUsernames({
265
- userIds
266
- }) : [], api.teams.loadAvailableRoles(), api.teams.loadAvailablePermissions(), userIds.length > 0 ? api.users.getUsersRoles({
267
- ids: userIds
268
- }) : [], userIds.length > 0 ? api.users.getUsersGroups({
269
- ids: userIds
270
- }) : [], __getGroupsForUsers(retryConfig), shouldLoadRoles ? loadRoles({
271
- retryConfig
272
- }) : undefined]);
273
-
274
- // Map user roles and groups to users
275
- const usersWithRolesAndGroups = users.map(user => {
276
- var _userUsernames$find;
277
- // Find user's role IDs
278
- const userRoleData = userRoles.find(ur => ur.userId === user.id);
279
- const userRoleIds = (userRoleData == null ? void 0 : userRoleData.roleIds) || [];
280
- const userRolesFull = roles.filter(role => userRoleIds.includes(role.id));
281
-
282
- // Find user's group IDs
283
- const userGroupData = userGroups.find(ug => ug.userId === user.id);
284
- const userGroupIds = (userGroupData == null ? void 0 : userGroupData.groupIds) || [];
285
- const userGroupsFull = groups.filter(g => userGroupIds.includes(g.id));
286
-
287
- // Find user's username
288
- const userUsername = userUsernames == null ? void 0 : (_userUsernames$find = userUsernames.find(username => username.userId === user.id)) == null ? void 0 : _userUsernames$find.username;
289
- if (!user.name) {
290
- user.name = userUsername;
291
- }
292
-
293
- //@ts-ignore
294
- return _extends({}, user, {
295
- roles: userRolesFull,
296
- roleIds: userRoleIds,
297
- groups: userGroupsFull,
298
- permissions: userRolesFull.flatMap(role => role.permissions)
299
- });
300
- });
301
- const mappedUsers = await sharedActions.mapUsersWithApplicationData({
302
- shouldLoadApps,
303
- users: usersWithRolesAndGroups,
304
- retryConfig
305
- });
306
- sharedActions.setTeamState({
307
- users: mappedUsers,
308
- totalPages,
309
- totalItems,
436
+ // Enrich users with roles, groups, permissions, and application data
437
+ const {
438
+ enrichedUsers,
310
439
  roles,
311
440
  permissions
441
+ } = await __enrichUsersWithRolesGroupsAndPermissions(users, {
442
+ shouldLoadRoles,
443
+ shouldLoadApps,
444
+ retryConfig
312
445
  });
313
- callback == null ? void 0 : callback(usersWithRolesAndGroups);
446
+ __setUsersStateAndCallback(enrichedUsers, roles, permissions, totalPages, totalItems, callback);
314
447
  } catch (e) {
315
- console.error('Failed to load users v3', e);
316
- actions.setTeamError({
317
- key: TeamStateKeys.USERS,
318
- value: errorHandler(e)
319
- });
320
- actions.setTeamState({
321
- totalPages: 0,
322
- users: []
323
- });
324
- callback == null ? void 0 : callback(null, e);
448
+ __handleUsersLoadError(e, callback, 'Failed to load users v3');
325
449
  }
326
- actions.setTeamLoader({
327
- key: TeamStateKeys.USERS,
328
- value: false
329
- });
330
450
  };
331
451
  const getIdentifierFilterForUsersV3 = payload => {
332
452
  const {
333
453
  identifier,
334
454
  identifierType,
335
- email
455
+ email,
456
+ namePrefix
336
457
  } = payload;
337
- if (identifierType === 'username' && identifier != null && identifier.length) {
458
+ if (email != null && email.length) {
338
459
  return {
339
- _identifier: identifier,
340
- _identifierType: 'username'
460
+ _email: email
341
461
  };
342
462
  }
343
- if (email != null && email.length) {
463
+ if (namePrefix != null && namePrefix.length) {
344
464
  return {
345
- _email: email
465
+ _namePrefix: namePrefix
466
+ };
467
+ }
468
+ if (identifierType === 'username' && identifier != null && identifier.length) {
469
+ return {
470
+ _identifier: identifier,
471
+ _identifierType: 'username'
346
472
  };
347
473
  }
348
474
  return {};
@@ -702,11 +828,50 @@ export default ((store, api, sharedActions) => {
702
828
  });
703
829
  }
704
830
  };
831
+ const loadUsersByGetUsersPhoneNumberV2 = async payload => {
832
+ const {
833
+ _phoneNumber,
834
+ shouldLoadRoles = true,
835
+ shouldLoadApps
836
+ } = payload;
837
+ return __loadUsersBySearchCriteria(payload, (pageOffset, pageSize) => api.userPhoneNumbers.getUsersPhoneNumberV2({
838
+ _phoneNumber,
839
+ _offset: pageOffset,
840
+ _limit: pageSize
841
+ }), shouldLoadRoles, shouldLoadApps);
842
+ };
843
+ const loadUsersByGetUsernamesV1 = async payload => {
844
+ const {
845
+ _usernamePrefix,
846
+ shouldLoadRoles = true,
847
+ shouldLoadApps
848
+ } = payload;
849
+ return __loadUsersBySearchCriteria(payload, (pageOffset, pageSize) => api.usernames.getUsernamesV1({
850
+ _usernamePrefix,
851
+ _offset: pageOffset,
852
+ _limit: pageSize
853
+ }), shouldLoadRoles, shouldLoadApps);
854
+ };
855
+ const loadUsersByGetEmailsV1 = async payload => {
856
+ const {
857
+ _email,
858
+ shouldLoadRoles = true,
859
+ shouldLoadApps
860
+ } = payload;
861
+ return __loadUsersBySearchCriteria(payload, (pageOffset, pageSize) => api.usersEmails.getUsersEmailsV1({
862
+ _email,
863
+ _offset: pageOffset,
864
+ _limit: pageSize
865
+ }), shouldLoadRoles, shouldLoadApps);
866
+ };
705
867
  return {
706
868
  loadRoles,
707
869
  loadUsers,
708
870
  loadUsersV2,
709
871
  loadUsersV3,
872
+ loadUsersByGetUsersPhoneNumberV2,
873
+ loadUsersByGetUsernamesV1,
874
+ loadUsersByGetEmailsV1,
710
875
  addUser,
711
876
  addUsersBulk,
712
877
  updateUser,
@@ -117,6 +117,7 @@ export interface IGetUsersV3Payload {
117
117
  pageSize?: ISearchUserQueryParamsV3['_limit'];
118
118
  pageOffset?: ISearchUserQueryParamsV3['_offset'];
119
119
  email?: ISearchUserQueryParamsV3['_email'];
120
+ namePrefix?: ISearchUserQueryParamsV3['_namePrefix'];
120
121
  sort?: ISearchUserQueryParamsV3['_sortBy'];
121
122
  order?: ISearchUserQueryParamsV3['_order'];
122
123
  shouldShowSubTenantUsersIfReseller?: ISearchUserQueryParamsV3['_includeSubTenants'];
@@ -125,6 +126,25 @@ export interface IGetUsersV3Payload {
125
126
  identifier?: ISearchUserQueryParamsV3['_identifier'];
126
127
  identifierType?: ISearchUserQueryParamsV3['_identifierType'];
127
128
  }
129
+ export interface IBaseUserSearchPayload {
130
+ _limit?: number;
131
+ _offset?: number;
132
+ shouldLoadApps?: boolean;
133
+ shouldLoadRoles?: boolean;
134
+ shouldShowSubTenantUsersIfReseller?: boolean;
135
+ }
136
+ export interface ILoadUsersByGetPhoneNumberV2Payload extends IBaseUserSearchPayload {
137
+ _phoneNumber: string;
138
+ }
139
+ export interface ILoadUsersByGetUsernamesV1Payload extends IBaseUserSearchPayload {
140
+ _usernamePrefix: string;
141
+ }
142
+ export interface ILoadUsersByGetEmailsV1Payload extends IBaseUserSearchPayload {
143
+ _email: string;
144
+ }
145
+ export interface ISearchUsersByAnyFieldPayload extends Partial<IGetUsersV3Payload> {
146
+ callback?: (users: ITeamUser[] | null, error?: any) => void;
147
+ }
128
148
  export interface IUserV3 extends IUsersV3Data {
129
149
  roles?: IRole[];
130
150
  }
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license Frontegg v7.91.0
1
+ /** @license Frontegg v7.93.0-alpha.0
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.
@@ -20,6 +20,9 @@ declare const _default: (store: FronteggState, api: RestApi, actions: SharedActi
20
20
  loadUsers: (payload: WithCallback<WithSilentLoad<import("@frontegg/rest-api").ILoadUsers>, ITeamUser[]>) => Promise<void>;
21
21
  loadUsersV2: (payload: WithCallback<import("../../interfaces").WithRetryConfig<WithSilentLoad<IGetUsersV2Payload>>, ITeamUser[]>) => Promise<void>;
22
22
  loadUsersV3: (payload: WithCallback<import("../../interfaces").WithRetryConfig<WithSilentLoad<import("../../auth").IGetUsersV3Payload>>, ITeamUser[]>) => Promise<void>;
23
+ loadUsersByGetUsersPhoneNumberV2: (payload: WithCallback<import("../../interfaces").WithRetryConfig<WithSilentLoad<import("../../auth").ILoadUsersByGetPhoneNumberV2Payload>>, ITeamUser[]>) => Promise<void>;
24
+ loadUsersByGetUsernamesV1: (payload: WithCallback<import("../../interfaces").WithRetryConfig<WithSilentLoad<import("../../auth").ILoadUsersByGetUsernamesV1Payload>>, ITeamUser[]>) => Promise<void>;
25
+ loadUsersByGetEmailsV1: (payload: WithCallback<import("../../interfaces").WithRetryConfig<WithSilentLoad<import("../../auth").ILoadUsersByGetEmailsV1Payload>>, ITeamUser[]>) => Promise<void>;
23
26
  addUser: (payload: WithCallback<import("../../auth").AddUserPayload, ITeamUser>) => Promise<void>;
24
27
  addUsersBulk: (payload: WithCallback<import("../../auth").IAddUsers, import("../../auth").BulkInvintationData>) => Promise<void>;
25
28
  updateUser: (payload: WithCallback<IUpdateUser, ITeamUser>) => Promise<void>;
@@ -35,6 +35,186 @@ var _default = (store, api, sharedActions) => {
35
35
  return [];
36
36
  }
37
37
  };
38
+
39
+ /**
40
+ * @private
41
+ * Enriches users with roles, groups, permissions, and application data
42
+ */
43
+ const __enrichUsersWithRolesGroupsAndPermissions = async (users, options) => {
44
+ const {
45
+ shouldLoadRoles = true,
46
+ shouldLoadApps,
47
+ retryConfig
48
+ } = options;
49
+
50
+ // Get user IDs for fetching roles and groups
51
+ const userIds = users.map(user => user.id);
52
+
53
+ // Fetch roles, permissions, user roles, user groups, and all groups in parallel
54
+ const [{
55
+ items: userUsernames
56
+ }, {
57
+ items: roles
58
+ }, permissions, userRoles, userGroups, groups] = await Promise.all([userIds.length > 0 ? api.users.getUsersUsernames({
59
+ userIds
60
+ }) : {
61
+ items: []
62
+ }, api.teams.loadAvailableRoles(), api.teams.loadAvailablePermissions(), userIds.length > 0 ? api.users.getUsersRoles({
63
+ ids: userIds
64
+ }) : [], userIds.length > 0 ? api.users.getUsersGroups({
65
+ ids: userIds
66
+ }) : [], __getGroupsForUsers(retryConfig), shouldLoadRoles ? loadRoles({
67
+ retryConfig
68
+ }) : undefined]);
69
+
70
+ // Map user roles and groups to users
71
+ const usersWithRolesAndGroups = users.map(user => {
72
+ var _userUsernames$find;
73
+ // Find user's role IDs
74
+ const userRoleData = userRoles.find(ur => ur.userId === user.id);
75
+ const userRoleIds = (userRoleData == null ? void 0 : userRoleData.roleIds) || [];
76
+ const userRolesFull = roles.filter(role => userRoleIds.includes(role.id));
77
+
78
+ // Find user's group IDs
79
+ const userGroupData = userGroups.find(ug => ug.userId === user.id);
80
+ const userGroupIds = (userGroupData == null ? void 0 : userGroupData.groupIds) || [];
81
+ const userGroupsFull = groups.filter(g => userGroupIds.includes(g.id));
82
+
83
+ // Find user's username
84
+ const userUsername = userUsernames == null ? void 0 : (_userUsernames$find = userUsernames.find(username => username.userId === user.id)) == null ? void 0 : _userUsernames$find.username;
85
+ if (!user.name) {
86
+ user.name = userUsername;
87
+ }
88
+
89
+ //@ts-ignore
90
+ return (0, _extends2.default)({}, user, {
91
+ roles: userRolesFull,
92
+ roleIds: userRoleIds,
93
+ groups: userGroupsFull,
94
+ permissions: userRolesFull.flatMap(role => role.permissions)
95
+ });
96
+ });
97
+
98
+ // Add application data if needed
99
+ const enrichedUsers = await sharedActions.mapUsersWithApplicationData({
100
+ shouldLoadApps,
101
+ users: usersWithRolesAndGroups,
102
+ retryConfig
103
+ });
104
+ return {
105
+ enrichedUsers,
106
+ roles,
107
+ permissions
108
+ };
109
+ };
110
+
111
+ /**
112
+ * @private
113
+ * Sets team state with users data and invokes callback
114
+ */
115
+ const __setUsersStateAndCallback = (enrichedUsers, roles, permissions, totalPages, totalItems, callback) => {
116
+ sharedActions.setTeamState({
117
+ users: enrichedUsers,
118
+ totalPages,
119
+ totalItems,
120
+ roles,
121
+ permissions
122
+ });
123
+ actions.setTeamLoader({
124
+ key: _interfaces.TeamStateKeys.USERS,
125
+ value: false
126
+ });
127
+ callback == null ? void 0 : callback(enrichedUsers);
128
+ };
129
+
130
+ /**
131
+ * @private
132
+ * Handles errors for user loading operations
133
+ */
134
+ const __handleUsersLoadError = (error, callback, errorMessage) => {
135
+ if (errorMessage) {
136
+ console.error(errorMessage, error);
137
+ }
138
+ actions.setTeamError({
139
+ key: _interfaces.TeamStateKeys.USERS,
140
+ value: (0, _helpers.errorHandler)(error)
141
+ });
142
+ actions.setTeamState({
143
+ totalPages: 0,
144
+ users: []
145
+ });
146
+ actions.setTeamLoader({
147
+ key: _interfaces.TeamStateKeys.USERS,
148
+ value: false
149
+ });
150
+ callback == null ? void 0 : callback(null, error);
151
+ };
152
+
153
+ /**
154
+ * @private
155
+ * Generic function to load users by search criteria (phone number, username, email)
156
+ */
157
+ const __loadUsersBySearchCriteria = async (payload, fetchFunction, shouldLoadRoles = true, shouldLoadApps) => {
158
+ var _payload$_limit, _payload$_offset, _payload$shouldShowSu;
159
+ const {
160
+ silentLoading,
161
+ callback,
162
+ retryConfig
163
+ } = payload;
164
+ const teamState = store.auth.teamState;
165
+ const pageSize = (_payload$_limit = payload._limit) != null ? _payload$_limit : teamState.pageSize;
166
+ const pageOffset = (_payload$_offset = payload._offset) != null ? _payload$_offset : teamState.pageOffset;
167
+ const shouldIncludeSubTenants = (_payload$shouldShowSu = payload == null ? void 0 : payload.shouldShowSubTenantUsersIfReseller) != null ? _payload$shouldShowSu : teamState == null ? void 0 : teamState.shouldShowSubTenantUsersIfReseller;
168
+ actions.setTeamLoader({
169
+ key: _interfaces.TeamStateKeys.USERS,
170
+ value: !silentLoading
171
+ });
172
+ actions.setTeamState({
173
+ pageSize,
174
+ pageOffset
175
+ });
176
+ try {
177
+ const response = await fetchFunction(pageOffset, pageSize);
178
+ if (!response.items || response.items.length === 0) {
179
+ sharedActions.setTeamState({
180
+ users: [],
181
+ totalPages: 0,
182
+ totalItems: 0
183
+ });
184
+ actions.setTeamLoader({
185
+ key: _interfaces.TeamStateKeys.USERS,
186
+ value: false
187
+ });
188
+ callback == null ? void 0 : callback([]);
189
+ return;
190
+ }
191
+
192
+ // Extract user IDs
193
+ const userIds = response.items.map(item => item.userId);
194
+
195
+ // Fetch users by IDs (no pagination here - we already have the filtered IDs)
196
+ const {
197
+ items: users
198
+ } = await api.users.getUsersV3({
199
+ ids: userIds.join(','),
200
+ _includeSubTenants: shouldIncludeSubTenants
201
+ });
202
+
203
+ // Enrich users with roles, groups, permissions, and application data
204
+ const {
205
+ enrichedUsers,
206
+ roles,
207
+ permissions
208
+ } = await __enrichUsersWithRolesGroupsAndPermissions(users, {
209
+ shouldLoadRoles,
210
+ shouldLoadApps,
211
+ retryConfig
212
+ });
213
+ __setUsersStateAndCallback(enrichedUsers, roles, permissions, response._metadata.totalPages, response._metadata.totalItems, callback);
214
+ } catch (e) {
215
+ __handleUsersLoadError(e, callback, `Failed to load users by search criteria in fetch function: ${fetchFunction.name}`);
216
+ }
217
+ };
38
218
  const loadRoles = async payload => {
39
219
  actions.setTeamLoader({
40
220
  key: _interfaces.TeamStateKeys.ROLES_AND_PERMISSIONS,
@@ -130,7 +310,7 @@ var _default = (store, api, sharedActions) => {
130
310
 
131
311
  /*** @deprecated loadUsersV2 is deprecated, use loadUsersV3 instead */
132
312
  const loadUsersV2 = async payload => {
133
- var _payload$pageSize2, _payload$pageOffset2, _payload$filter2, _payload$sort2, _payload$shouldShowSu;
313
+ var _payload$pageSize2, _payload$pageOffset2, _payload$filter2, _payload$sort2, _payload$shouldShowSu2;
134
314
  const {
135
315
  silentLoading,
136
316
  callback,
@@ -143,7 +323,7 @@ var _default = (store, api, sharedActions) => {
143
323
  const pageOffset = (_payload$pageOffset2 = payload.pageOffset) != null ? _payload$pageOffset2 : teamState.pageOffset;
144
324
  const filter = (_payload$filter2 = payload.filter) != null ? _payload$filter2 : teamState.filterV2;
145
325
  const sort = (_payload$sort2 = payload.sort) != null ? _payload$sort2 : teamState.sortV2;
146
- const shouldIncludeSubTenants = (_payload$shouldShowSu = payload == null ? void 0 : payload.shouldShowSubTenantUsersIfReseller) != null ? _payload$shouldShowSu : teamState == null ? void 0 : teamState.shouldShowSubTenantUsersIfReseller;
326
+ const shouldIncludeSubTenants = (_payload$shouldShowSu2 = payload == null ? void 0 : payload.shouldShowSubTenantUsersIfReseller) != null ? _payload$shouldShowSu2 : teamState == null ? void 0 : teamState.shouldShowSubTenantUsersIfReseller;
147
327
  actions.setTeamLoader({
148
328
  key: _interfaces.TeamStateKeys.USERS,
149
329
  value: !silentLoading
@@ -221,7 +401,7 @@ var _default = (store, api, sharedActions) => {
221
401
  });
222
402
  };
223
403
  const loadUsersV3 = async payload => {
224
- var _payload$pageSize3, _payload$pageOffset3, _payload$sort3, _payload$shouldShowSu2;
404
+ var _payload$pageSize3, _payload$pageOffset3, _payload$sort3, _payload$shouldShowSu3;
225
405
  const {
226
406
  silentLoading,
227
407
  callback,
@@ -233,7 +413,7 @@ var _default = (store, api, sharedActions) => {
233
413
  const pageSize = (_payload$pageSize3 = payload.pageSize) != null ? _payload$pageSize3 : teamState.pageSize;
234
414
  const pageOffset = (_payload$pageOffset3 = payload.pageOffset) != null ? _payload$pageOffset3 : teamState.pageOffset;
235
415
  const sort = (_payload$sort3 = payload.sort) != null ? _payload$sort3 : teamState.sortV2;
236
- const shouldIncludeSubTenants = (_payload$shouldShowSu2 = payload == null ? void 0 : payload.shouldShowSubTenantUsersIfReseller) != null ? _payload$shouldShowSu2 : teamState == null ? void 0 : teamState.shouldShowSubTenantUsersIfReseller;
416
+ const shouldIncludeSubTenants = (_payload$shouldShowSu3 = payload == null ? void 0 : payload.shouldShowSubTenantUsersIfReseller) != null ? _payload$shouldShowSu3 : teamState == null ? void 0 : teamState.shouldShowSubTenantUsersIfReseller;
237
417
  actions.setTeamLoader({
238
418
  key: _interfaces.TeamStateKeys.USERS,
239
419
  value: !silentLoading
@@ -260,96 +440,42 @@ var _default = (store, api, sharedActions) => {
260
440
  _includeSubTenants: shouldIncludeSubTenants
261
441
  }, getIdentifierFilterForUsersV3(payload)));
262
442
 
263
- // Get user IDs for fetching roles and groups
264
- const userIds = users.map(user => user.id);
265
-
266
- // Fetch roles, permissions, user roles, user groups, and all groups in parallel
267
- const [{
268
- items: userUsernames
269
- }, {
270
- items: roles
271
- }, permissions, userRoles, userGroups, groups] = await Promise.all([userIds.length > 0 ? api.users.getUsersUsernames({
272
- userIds
273
- }) : [], api.teams.loadAvailableRoles(), api.teams.loadAvailablePermissions(), userIds.length > 0 ? api.users.getUsersRoles({
274
- ids: userIds
275
- }) : [], userIds.length > 0 ? api.users.getUsersGroups({
276
- ids: userIds
277
- }) : [], __getGroupsForUsers(retryConfig), shouldLoadRoles ? loadRoles({
278
- retryConfig
279
- }) : undefined]);
280
-
281
- // Map user roles and groups to users
282
- const usersWithRolesAndGroups = users.map(user => {
283
- var _userUsernames$find;
284
- // Find user's role IDs
285
- const userRoleData = userRoles.find(ur => ur.userId === user.id);
286
- const userRoleIds = (userRoleData == null ? void 0 : userRoleData.roleIds) || [];
287
- const userRolesFull = roles.filter(role => userRoleIds.includes(role.id));
288
-
289
- // Find user's group IDs
290
- const userGroupData = userGroups.find(ug => ug.userId === user.id);
291
- const userGroupIds = (userGroupData == null ? void 0 : userGroupData.groupIds) || [];
292
- const userGroupsFull = groups.filter(g => userGroupIds.includes(g.id));
293
-
294
- // Find user's username
295
- const userUsername = userUsernames == null ? void 0 : (_userUsernames$find = userUsernames.find(username => username.userId === user.id)) == null ? void 0 : _userUsernames$find.username;
296
- if (!user.name) {
297
- user.name = userUsername;
298
- }
299
-
300
- //@ts-ignore
301
- return (0, _extends2.default)({}, user, {
302
- roles: userRolesFull,
303
- roleIds: userRoleIds,
304
- groups: userGroupsFull,
305
- permissions: userRolesFull.flatMap(role => role.permissions)
306
- });
307
- });
308
- const mappedUsers = await sharedActions.mapUsersWithApplicationData({
309
- shouldLoadApps,
310
- users: usersWithRolesAndGroups,
311
- retryConfig
312
- });
313
- sharedActions.setTeamState({
314
- users: mappedUsers,
315
- totalPages,
316
- totalItems,
443
+ // Enrich users with roles, groups, permissions, and application data
444
+ const {
445
+ enrichedUsers,
317
446
  roles,
318
447
  permissions
448
+ } = await __enrichUsersWithRolesGroupsAndPermissions(users, {
449
+ shouldLoadRoles,
450
+ shouldLoadApps,
451
+ retryConfig
319
452
  });
320
- callback == null ? void 0 : callback(usersWithRolesAndGroups);
453
+ __setUsersStateAndCallback(enrichedUsers, roles, permissions, totalPages, totalItems, callback);
321
454
  } catch (e) {
322
- console.error('Failed to load users v3', e);
323
- actions.setTeamError({
324
- key: _interfaces.TeamStateKeys.USERS,
325
- value: (0, _helpers.errorHandler)(e)
326
- });
327
- actions.setTeamState({
328
- totalPages: 0,
329
- users: []
330
- });
331
- callback == null ? void 0 : callback(null, e);
455
+ __handleUsersLoadError(e, callback, 'Failed to load users v3');
332
456
  }
333
- actions.setTeamLoader({
334
- key: _interfaces.TeamStateKeys.USERS,
335
- value: false
336
- });
337
457
  };
338
458
  const getIdentifierFilterForUsersV3 = payload => {
339
459
  const {
340
460
  identifier,
341
461
  identifierType,
342
- email
462
+ email,
463
+ namePrefix
343
464
  } = payload;
344
- if (identifierType === 'username' && identifier != null && identifier.length) {
465
+ if (email != null && email.length) {
345
466
  return {
346
- _identifier: identifier,
347
- _identifierType: 'username'
467
+ _email: email
348
468
  };
349
469
  }
350
- if (email != null && email.length) {
470
+ if (namePrefix != null && namePrefix.length) {
351
471
  return {
352
- _email: email
472
+ _namePrefix: namePrefix
473
+ };
474
+ }
475
+ if (identifierType === 'username' && identifier != null && identifier.length) {
476
+ return {
477
+ _identifier: identifier,
478
+ _identifierType: 'username'
353
479
  };
354
480
  }
355
481
  return {};
@@ -709,11 +835,50 @@ var _default = (store, api, sharedActions) => {
709
835
  });
710
836
  }
711
837
  };
838
+ const loadUsersByGetUsersPhoneNumberV2 = async payload => {
839
+ const {
840
+ _phoneNumber,
841
+ shouldLoadRoles = true,
842
+ shouldLoadApps
843
+ } = payload;
844
+ return __loadUsersBySearchCriteria(payload, (pageOffset, pageSize) => api.userPhoneNumbers.getUsersPhoneNumberV2({
845
+ _phoneNumber,
846
+ _offset: pageOffset,
847
+ _limit: pageSize
848
+ }), shouldLoadRoles, shouldLoadApps);
849
+ };
850
+ const loadUsersByGetUsernamesV1 = async payload => {
851
+ const {
852
+ _usernamePrefix,
853
+ shouldLoadRoles = true,
854
+ shouldLoadApps
855
+ } = payload;
856
+ return __loadUsersBySearchCriteria(payload, (pageOffset, pageSize) => api.usernames.getUsernamesV1({
857
+ _usernamePrefix,
858
+ _offset: pageOffset,
859
+ _limit: pageSize
860
+ }), shouldLoadRoles, shouldLoadApps);
861
+ };
862
+ const loadUsersByGetEmailsV1 = async payload => {
863
+ const {
864
+ _email,
865
+ shouldLoadRoles = true,
866
+ shouldLoadApps
867
+ } = payload;
868
+ return __loadUsersBySearchCriteria(payload, (pageOffset, pageSize) => api.usersEmails.getUsersEmailsV1({
869
+ _email,
870
+ _offset: pageOffset,
871
+ _limit: pageSize
872
+ }), shouldLoadRoles, shouldLoadApps);
873
+ };
712
874
  return {
713
875
  loadRoles,
714
876
  loadUsers,
715
877
  loadUsersV2,
716
878
  loadUsersV3,
879
+ loadUsersByGetUsersPhoneNumberV2,
880
+ loadUsersByGetUsernamesV1,
881
+ loadUsersByGetEmailsV1,
717
882
  addUser,
718
883
  addUsersBulk,
719
884
  updateUser,
package/node/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /** @license Frontegg v7.91.0
1
+ /** @license Frontegg v7.93.0-alpha.0
2
2
  *
3
3
  * This source code is licensed under the MIT license found in the
4
4
  * LICENSE file in the root directory of this source tree.
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@frontegg/redux-store",
3
- "version": "7.91.0",
3
+ "version": "7.93.0-alpha.0",
4
4
  "main": "./node/index.js",
5
5
  "license": "MIT",
6
6
  "author": "Frontegg LTD",
7
7
  "dependencies": {
8
8
  "@babel/runtime": "^7.18.6",
9
9
  "@frontegg/entitlements-javascript-commons": "1.1.2",
10
- "@frontegg/rest-api": "7.91.0",
10
+ "@frontegg/rest-api": "7.93.0-alpha.0",
11
11
  "fast-deep-equal": "3.1.3",
12
12
  "get-value": "^3.0.1",
13
13
  "proxy-compare": "^3.0.0",