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
62 changes: 62 additions & 0 deletions src/clients/workspace-users-client.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { http, HttpResponse } from 'msw'
import { beforeEach, describe, expect, it } from 'vitest'
import { apiUrl } from '../testUtils/msw-handlers'
import { server } from '../testUtils/msw-setup'
import { mockWorkspaceUser, TEST_API_TOKEN } from '../testUtils/test-defaults'
import { WorkspaceUsersClient } from './workspace-users-client'

const removedWorkspaceUser = {
...mockWorkspaceUser,
id: 2,
fullName: 'Removed User',
shortName: 'RU',
removed: true,
}

describe('WorkspaceUsersClient', () => {
let client: WorkspaceUsersClient

beforeEach(() => {
client = new WorkspaceUsersClient({ apiToken: TEST_API_TOKEN })
})

describe('getWorkspaceUsers', () => {
it('excludes removed users by default and sends no server-side filter param', async () => {
server.use(
http.get(apiUrl('api/v1/workspace_users/get'), ({ request }) => {
const url = new URL(request.url)
expect(url.searchParams.get('id')).toBe('123')
expect(url.searchParams.has('include_removed')).toBe(false)
expect(url.searchParams.has('with_removed')).toBe(false)
return HttpResponse.json([mockWorkspaceUser, removedWorkspaceUser])
}),
)

const result = await client.getWorkspaceUsers({ workspaceId: 123 })

expect(result).toHaveLength(1)
expect(result[0].id).toBe(mockWorkspaceUser.id)
expect(result.some((user) => user.removed)).toBe(false)
})

it('includes removed users when includeRemoved is true and sends no server-side filter param', async () => {
server.use(
http.get(apiUrl('api/v1/workspace_users/get'), ({ request }) => {
const url = new URL(request.url)
expect(url.searchParams.get('id')).toBe('123')
expect(url.searchParams.has('include_removed')).toBe(false)
expect(url.searchParams.has('with_removed')).toBe(false)
return HttpResponse.json([mockWorkspaceUser, removedWorkspaceUser])
}),
)

const result = await client.getWorkspaceUsers({
workspaceId: 123,
includeRemoved: true,
})

expect(result).toHaveLength(2)
expect(result.map((user) => user.id)).toEqual([1, 2])
})
})
})
12 changes: 11 additions & 1 deletion src/clients/workspace-users-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,13 @@ export class WorkspaceUsersClient extends BaseClient {
/**
* Returns a list of workspace user objects for the given workspace id.
*
* Removed users are excluded by default; set `args.includeRemoved` to `true` to include them.
* The Comms API always returns removed users, so the filtering happens client-side.
*
* @param args - The arguments for getting workspace users.
* @param args.workspaceId - The workspace ID.
* @param args.archived - Optional flag to filter archived users.
* @param args.includeRemoved - Include users removed from the workspace. Defaults to `false`.
* @returns An array of workspace user objects.
*
* @example
Expand All @@ -30,14 +34,20 @@ export class WorkspaceUsersClient extends BaseClient {
* ```
*/
getWorkspaceUsers(args: GetWorkspaceUsersArgs): Promise<WorkspaceUser[]> {
const includeRemoved = args.includeRemoved ?? false
return request<WorkspaceUser[]>({
httpMethod: 'GET',
baseUri: this.getBaseUri(),
relativePath: 'workspace_users/get',
apiToken: this.apiToken,
payload: { id: args.workspaceId, archived: args.archived },
customFetch: this.customFetch,
}).then((response) => response.data.map((user) => WorkspaceUserSchema.parse(user)))
}).then((response) => {
const rawUsers = includeRemoved
? response.data
: response.data.filter((user) => !user.removed)
return rawUsers.map((user) => WorkspaceUserSchema.parse(user))
})
}

/**
Expand Down
5 changes: 5 additions & 0 deletions src/types/requests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,11 @@ export type RemoveGroupUsersArgs = {
export type GetWorkspaceUsersArgs = {
workspaceId: number
archived?: boolean
/**
* Include users who have been removed from the workspace. Defaults to `false`.
* The Comms API always returns removed users, so the SDK filters them client-side.
*/
includeRemoved?: boolean
}

export type GetUserByIdArgs = {
Expand Down
Loading