Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -868,7 +868,8 @@ usersRes.data.forEach((user) => {
// Search all users, optionally according to tenant and/or role filter
// Results can be paginated using the limit and page parameters
const usersRes = await descopeClient.management.user.search({ tenantIds: ['tenant-ID'] });
usersRes.data.forEach((user) => {
console.log('Total users:', usersRes.data.total);
usersRes.data.users.forEach((user) => {
// do something
});

Expand Down Expand Up @@ -1698,8 +1699,9 @@ await descopeClient.management.user.createTestUser('desmond@descope.com', {
});

// Search all test users according to various parameters
const searchRes = await descopeClient.management.user.searchTestUsers(['id']);
searchRes.data.forEach((user) => {
const searchRes = await descopeClient.management.user.searchTestUsers({ userIds: ['id'] });
console.log('Total test users:', searchRes.data.total);
searchRes.data.users.forEach((user) => {
// do something
});

Expand Down
5 changes: 5 additions & 0 deletions lib/management/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -582,6 +582,11 @@ export type PatchUserBatchResponse = {
additionalErrors: Record<string, string>;
};

export type UserSearchResponse = {
users: UserResponse[];
total: number;
};

/**
* Search options to filter which audit records we should retrieve.
* All parameters are optional. `From` is currently limited to 30 days.
Expand Down
10 changes: 6 additions & 4 deletions lib/management/user.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
CreateOrInviteBatchResponse,
PatchUserBatchResponse,
UserPasswordHashed,
UserSearchResponse,
} from './types';

const management = withManagement(mockHttpClient);
Expand All @@ -25,6 +26,7 @@ const mockMgmtUserResponse = {

const mockMgmtUsersResponse = {
users: [mockUserResponse],
total: 1,
};

const mockMgmtInviteBatchResponse = {
Expand Down Expand Up @@ -1012,7 +1014,7 @@ describe('Management User', () => {
};
mockHttpClient.post.mockResolvedValue(httpResponse);
const now = new Date().getTime();
const resp: SdkResponse<UserResponse[]> = await management.user.searchTestUsers({
const resp: SdkResponse<UserSearchResponse> = await management.user.searchTestUsers({
tenantIds: ['t1'],
roles: ['r1'],
limit: 100,
Expand Down Expand Up @@ -1050,7 +1052,7 @@ describe('Management User', () => {

expect(resp).toEqual({
code: 200,
data: [mockUserResponse],
data: { users: [mockUserResponse], total: 1 },
ok: true,
response: httpResponse,
});
Expand All @@ -1069,7 +1071,7 @@ describe('Management User', () => {
};
mockHttpClient.post.mockResolvedValue(httpResponse);
const now = new Date().getTime();
const resp: SdkResponse<UserResponse[]> = await management.user.search({
const resp: SdkResponse<UserSearchResponse> = await management.user.search({
tenantIds: ['t1'],
roles: ['r1'],
limit: 100,
Expand Down Expand Up @@ -1105,7 +1107,7 @@ describe('Management User', () => {

expect(resp).toEqual({
code: 200,
data: [mockUserResponse],
data: { users: [mockUserResponse], total: 1 },
ok: true,
response: httpResponse,
});
Expand Down
13 changes: 7 additions & 6 deletions lib/management/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
TemplateOptions,
ProviderTokenOptions,
UserOptions,
UserSearchResponse,
} from './types';
import { DeliveryMethodForTestUser } from '../types';
import apiPaths from './paths';
Expand Down Expand Up @@ -618,25 +619,25 @@ const withUser = (httpClient: HttpClient) => {
}),
(data) => data.users,
),
searchTestUsers: (searchReq: SearchRequest): Promise<SdkResponse<UserResponse[]>> =>
transformResponse<MultipleUsersResponse, UserResponse[]>(
searchTestUsers: (searchReq: SearchRequest): Promise<SdkResponse<UserSearchResponse>> =>
transformResponse<UserSearchResponse, UserSearchResponse>(
httpClient.post(apiPaths.user.searchTestUsers, {
...searchReq,
withTestUser: true,
testUsersOnly: true,
roleNames: searchReq.roles,
roles: undefined,
}),
(data) => data.users,
(data) => ({ users: data.users, total: data.total }),
),
search: (searchReq: SearchRequest): Promise<SdkResponse<UserResponse[]>> =>
transformResponse<MultipleUsersResponse, UserResponse[]>(
search: (searchReq: SearchRequest): Promise<SdkResponse<UserSearchResponse>> =>
transformResponse<UserSearchResponse, UserSearchResponse>(
httpClient.post(apiPaths.user.search, {
...searchReq,
roleNames: searchReq.roles,
roles: undefined,
}),
(data) => data.users,
(data) => ({ users: data.users, total: data.total }),
),
/**
* Get the provider token for the given login ID.
Expand Down