diff --git a/.yarn/cache/@standardnotes-common-npm-1.36.1-8fadd25f7f-4f2367d461.zip b/.yarn/cache/@standardnotes-common-npm-1.39.0-1e36e2ef74-92cfad04a6.zip similarity index 73% rename from .yarn/cache/@standardnotes-common-npm-1.36.1-8fadd25f7f-4f2367d461.zip rename to .yarn/cache/@standardnotes-common-npm-1.39.0-1e36e2ef74-92cfad04a6.zip index b806c765e..85ed6ebe6 100644 Binary files a/.yarn/cache/@standardnotes-common-npm-1.36.1-8fadd25f7f-4f2367d461.zip and b/.yarn/cache/@standardnotes-common-npm-1.39.0-1e36e2ef74-92cfad04a6.zip differ diff --git a/packages/api/package.json b/packages/api/package.json index c97b82550..48609e15f 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -36,7 +36,7 @@ "typescript": "*" }, "dependencies": { - "@standardnotes/common": "^1.36.1", + "@standardnotes/common": "^1.39.0", "@standardnotes/encryption": "workspace:*", "@standardnotes/models": "workspace:*", "@standardnotes/responses": "workspace:*", diff --git a/packages/api/src/Domain/Client/Workspace/WorkspaceApiOperations.ts b/packages/api/src/Domain/Client/Workspace/WorkspaceApiOperations.ts index 8f1ff5681..889c0dcab 100644 --- a/packages/api/src/Domain/Client/Workspace/WorkspaceApiOperations.ts +++ b/packages/api/src/Domain/Client/Workspace/WorkspaceApiOperations.ts @@ -3,4 +3,5 @@ export enum WorkspaceApiOperations { Inviting, Accepting, ListingWorkspaces, + ListingWorkspaceUsers, } diff --git a/packages/api/src/Domain/Client/Workspace/WorkspaceApiService.spec.ts b/packages/api/src/Domain/Client/Workspace/WorkspaceApiService.spec.ts index 61edf8f72..d252aa3f8 100644 --- a/packages/api/src/Domain/Client/Workspace/WorkspaceApiService.spec.ts +++ b/packages/api/src/Domain/Client/Workspace/WorkspaceApiService.spec.ts @@ -1,9 +1,10 @@ -import { WorkspaceType } from '@standardnotes/common' +import { WorkspaceAccessLevel, WorkspaceType } from '@standardnotes/common' import { HttpStatusCode } from '../../Http' import { WorkspaceCreationResponse } from '../../Response/Workspace/WorkspaceCreationResponse' import { WorkspaceInvitationAcceptingResponse } from '../../Response/Workspace/WorkspaceInvitationAcceptingResponse' import { WorkspaceInvitationResponse } from '../../Response/Workspace/WorkspaceInvitationResponse' import { WorkspaceListResponse } from '../../Response/Workspace/WorkspaceListResponse' +import { WorkspaceUserListResponse } from '../../Response/Workspace/WorkspaceUserListResponse' import { WorkspaceServerInterface } from '../../Server/Workspace/WorkspaceServerInterface' import { WorkspaceApiOperations } from './WorkspaceApiOperations' @@ -29,6 +30,10 @@ describe('WorkspaceApiService', () => { status: HttpStatusCode.Success, data: { ownedWorkspaces: [], joinedWorkspaces: [] }, } as jest.Mocked) + workspaceServer.listWorkspaceUsers = jest.fn().mockReturnValue({ + status: HttpStatusCode.Success, + data: { users: [] }, + } as jest.Mocked) }) it('should create a workspace', async () => { @@ -97,7 +102,7 @@ describe('WorkspaceApiService', () => { const response = await createService().inviteToWorkspace({ workspaceUuid: 'w-1-2-3', inviteeEmail: 'test@test.te', - accessLevel: 'write-and-read', + accessLevel: WorkspaceAccessLevel.WriteAndRead, }) expect(response).toEqual({ @@ -123,7 +128,7 @@ describe('WorkspaceApiService', () => { await service.inviteToWorkspace({ workspaceUuid: 'w-1-2-3', inviteeEmail: 'test@test.te', - accessLevel: 'write-and-read', + accessLevel: WorkspaceAccessLevel.WriteAndRead, }) } catch (caughtError) { error = caughtError @@ -142,7 +147,7 @@ describe('WorkspaceApiService', () => { await createService().inviteToWorkspace({ workspaceUuid: 'w-1-2-3', inviteeEmail: 'test@test.te', - accessLevel: 'write-and-read', + accessLevel: WorkspaceAccessLevel.WriteAndRead, }) } catch (caughtError) { error = caughtError @@ -256,4 +261,47 @@ describe('WorkspaceApiService', () => { expect(error).not.toBeNull() }) + + it('should list workspace users', async () => { + const response = await createService().listWorkspaceUsers({ workspaceUuid: 'w-1-2-3' }) + + expect(response).toEqual({ + status: 200, + data: { + users: [], + }, + }) + expect(workspaceServer.listWorkspaceUsers).toHaveBeenCalledWith({ workspaceUuid: 'w-1-2-3' }) + }) + + it('should not list workspace users if it is already listing them', async () => { + const service = createService() + Object.defineProperty(service, 'operationsInProgress', { + get: () => new Map([[WorkspaceApiOperations.ListingWorkspaceUsers, true]]), + }) + + let error = null + try { + await service.listWorkspaceUsers({ workspaceUuid: 'w-1-2-3' }) + } catch (caughtError) { + error = caughtError + } + + expect(error).not.toBeNull() + }) + + it('should not list workspace users if the server fails', async () => { + workspaceServer.listWorkspaceUsers = jest.fn().mockImplementation(() => { + throw new Error('Oops') + }) + + let error = null + try { + await createService().listWorkspaceUsers({ workspaceUuid: 'w-1-2-3' }) + } catch (caughtError) { + error = caughtError + } + + expect(error).not.toBeNull() + }) }) diff --git a/packages/api/src/Domain/Client/Workspace/WorkspaceApiService.ts b/packages/api/src/Domain/Client/Workspace/WorkspaceApiService.ts index 741cfdf0e..41099857b 100644 --- a/packages/api/src/Domain/Client/Workspace/WorkspaceApiService.ts +++ b/packages/api/src/Domain/Client/Workspace/WorkspaceApiService.ts @@ -1,4 +1,4 @@ -import { Uuid, WorkspaceType } from '@standardnotes/common' +import { Uuid, WorkspaceAccessLevel, WorkspaceType } from '@standardnotes/common' import { ErrorMessage } from '../../Error/ErrorMessage' import { ApiCallError } from '../../Error/ApiCallError' @@ -7,6 +7,7 @@ import { WorkspaceInvitationAcceptingResponse } from '../../Response/Workspace/W import { WorkspaceInvitationResponse } from '../../Response/Workspace/WorkspaceInvitationResponse' import { WorkspaceServerInterface } from '../../Server/Workspace/WorkspaceServerInterface' import { WorkspaceListResponse } from '../../Response/Workspace/WorkspaceListResponse' +import { WorkspaceUserListResponse } from '../../Response/Workspace/WorkspaceUserListResponse' import { WorkspaceApiServiceInterface } from './WorkspaceApiServiceInterface' import { WorkspaceApiOperations } from './WorkspaceApiOperations' @@ -18,6 +19,20 @@ export class WorkspaceApiService implements WorkspaceApiServiceInterface { this.operationsInProgress = new Map() } + async listWorkspaceUsers(dto: { workspaceUuid: string }): Promise { + this.lockOperation(WorkspaceApiOperations.ListingWorkspaceUsers) + + try { + const response = await this.workspaceServer.listWorkspaceUsers({ workspaceUuid: dto.workspaceUuid }) + + this.unlockOperation(WorkspaceApiOperations.ListingWorkspaceUsers) + + return response + } catch (error) { + throw new ApiCallError(ErrorMessage.GenericFail) + } + } + async listWorkspaces(): Promise { this.lockOperation(WorkspaceApiOperations.ListingWorkspaces) @@ -59,7 +74,7 @@ export class WorkspaceApiService implements WorkspaceApiServiceInterface { async inviteToWorkspace(dto: { inviteeEmail: string workspaceUuid: Uuid - accessLevel: string + accessLevel: WorkspaceAccessLevel }): Promise { this.lockOperation(WorkspaceApiOperations.Inviting) diff --git a/packages/api/src/Domain/Client/Workspace/WorkspaceApiServiceInterface.ts b/packages/api/src/Domain/Client/Workspace/WorkspaceApiServiceInterface.ts index 1b6fe08b7..c949ca6a1 100644 --- a/packages/api/src/Domain/Client/Workspace/WorkspaceApiServiceInterface.ts +++ b/packages/api/src/Domain/Client/Workspace/WorkspaceApiServiceInterface.ts @@ -1,9 +1,10 @@ -import { Uuid, WorkspaceType } from '@standardnotes/common' +import { Uuid, WorkspaceAccessLevel, WorkspaceType } from '@standardnotes/common' import { WorkspaceCreationResponse } from '../../Response/Workspace/WorkspaceCreationResponse' import { WorkspaceInvitationAcceptingResponse } from '../../Response/Workspace/WorkspaceInvitationAcceptingResponse' import { WorkspaceInvitationResponse } from '../../Response/Workspace/WorkspaceInvitationResponse' import { WorkspaceListResponse } from '../../Response/Workspace/WorkspaceListResponse' +import { WorkspaceUserListResponse } from '../../Response/Workspace/WorkspaceUserListResponse' export interface WorkspaceApiServiceInterface { createWorkspace(dto: { @@ -16,7 +17,7 @@ export interface WorkspaceApiServiceInterface { inviteToWorkspace(dto: { inviteeEmail: string workspaceUuid: Uuid - accessLevel: string + accessLevel: WorkspaceAccessLevel }): Promise acceptInvite(dto: { inviteUuid: Uuid @@ -25,4 +26,5 @@ export interface WorkspaceApiServiceInterface { encryptedPrivateKey: string }): Promise listWorkspaces(): Promise + listWorkspaceUsers(dto: { workspaceUuid: Uuid }): Promise } diff --git a/packages/api/src/Domain/Request/Workspace/WorkspaceInvitationRequestParams.ts b/packages/api/src/Domain/Request/Workspace/WorkspaceInvitationRequestParams.ts index 2c198faa6..3f9cdced3 100644 --- a/packages/api/src/Domain/Request/Workspace/WorkspaceInvitationRequestParams.ts +++ b/packages/api/src/Domain/Request/Workspace/WorkspaceInvitationRequestParams.ts @@ -1,8 +1,8 @@ -import { Uuid } from '@standardnotes/common' +import { Uuid, WorkspaceAccessLevel } from '@standardnotes/common' export type WorkspaceInvitationRequestParams = { workspaceUuid: Uuid inviteeEmail: string - accessLevel: string + accessLevel: WorkspaceAccessLevel [additionalParam: string]: unknown } diff --git a/packages/api/src/Domain/Request/Workspace/WorkspaceUserListRequestParams.ts b/packages/api/src/Domain/Request/Workspace/WorkspaceUserListRequestParams.ts new file mode 100644 index 000000000..cef93740d --- /dev/null +++ b/packages/api/src/Domain/Request/Workspace/WorkspaceUserListRequestParams.ts @@ -0,0 +1,6 @@ +import { Uuid } from '@standardnotes/common' + +export type WorkspaceUserListRequestParams = { + workspaceUuid: Uuid + [additionalParam: string]: unknown +} diff --git a/packages/api/src/Domain/Request/index.ts b/packages/api/src/Domain/Request/index.ts index 6819f74c2..b0e53a01a 100644 --- a/packages/api/src/Domain/Request/index.ts +++ b/packages/api/src/Domain/Request/index.ts @@ -10,3 +10,4 @@ export * from './Workspace/WorkspaceCreationRequestParams' export * from './Workspace/WorkspaceInvitationAcceptingRequestParams' export * from './Workspace/WorkspaceInvitationRequestParams' export * from './Workspace/WorkspaceListRequestParams' +export * from './Workspace/WorkspaceUserListRequestParams' diff --git a/packages/api/src/Domain/Response/Workspace/WorkspaceUserListResponse.ts b/packages/api/src/Domain/Response/Workspace/WorkspaceUserListResponse.ts new file mode 100644 index 000000000..e339a29e0 --- /dev/null +++ b/packages/api/src/Domain/Response/Workspace/WorkspaceUserListResponse.ts @@ -0,0 +1,9 @@ +import { Either } from '@standardnotes/common' + +import { HttpErrorResponseBody } from '../../Http/HttpErrorResponseBody' +import { HttpResponse } from '../../Http/HttpResponse' +import { WorkspaceUserListResponseBody } from './WorkspaceUserListResponseBody' + +export interface WorkspaceUserListResponse extends HttpResponse { + data: Either +} diff --git a/packages/api/src/Domain/Response/Workspace/WorkspaceUserListResponseBody.ts b/packages/api/src/Domain/Response/Workspace/WorkspaceUserListResponseBody.ts new file mode 100644 index 000000000..c2c810204 --- /dev/null +++ b/packages/api/src/Domain/Response/Workspace/WorkspaceUserListResponseBody.ts @@ -0,0 +1,5 @@ +import { WorkspaceUser } from '@standardnotes/models' + +export type WorkspaceUserListResponseBody = { + users: Array +} diff --git a/packages/api/src/Domain/Server/Workspace/Paths.ts b/packages/api/src/Domain/Server/Workspace/Paths.ts index 1da981566..59abb55f6 100644 --- a/packages/api/src/Domain/Server/Workspace/Paths.ts +++ b/packages/api/src/Domain/Server/Workspace/Paths.ts @@ -3,6 +3,7 @@ import { Uuid } from '@standardnotes/common' const WorkspacePaths = { createWorkspace: '/v1/workspaces', listWorkspaces: '/v1/workspaces', + listWorkspaceUsers: (uuid: Uuid) => `/v1/workspaces/${uuid}/users`, inviteToWorkspace: (uuid: Uuid) => `/v1/workspaces/${uuid}/invites`, acceptInvite: (uuid: Uuid) => `/v1/invites/${uuid}/accept`, } diff --git a/packages/api/src/Domain/Server/Workspace/WorkspaceServer.spec.ts b/packages/api/src/Domain/Server/Workspace/WorkspaceServer.spec.ts index b46abc49d..0340a5891 100644 --- a/packages/api/src/Domain/Server/Workspace/WorkspaceServer.spec.ts +++ b/packages/api/src/Domain/Server/Workspace/WorkspaceServer.spec.ts @@ -1,9 +1,10 @@ -import { WorkspaceType } from '@standardnotes/common' +import { WorkspaceAccessLevel, WorkspaceType } from '@standardnotes/common' import { HttpServiceInterface, HttpStatusCode } from '../../Http' import { WorkspaceCreationResponse } from '../../Response/Workspace/WorkspaceCreationResponse' import { WorkspaceInvitationAcceptingResponse } from '../../Response/Workspace/WorkspaceInvitationAcceptingResponse' import { WorkspaceInvitationResponse } from '../../Response/Workspace/WorkspaceInvitationResponse' import { WorkspaceListResponse } from '../../Response/Workspace/WorkspaceListResponse' +import { WorkspaceUserListResponse } from '../../Response/Workspace/WorkspaceUserListResponse' import { WorkspaceServer } from './WorkspaceServer' @@ -42,7 +43,7 @@ describe('WorkspaceServer', () => { const response = await createServer().inviteToWorkspace({ inviteeEmail: 'test@test.te', workspaceUuid: 'w-1-2-3', - accessLevel: 'write-and-read', + accessLevel: WorkspaceAccessLevel.WriteAndRead, }) expect(response).toEqual({ @@ -84,4 +85,18 @@ describe('WorkspaceServer', () => { data: { ownedWorkspaces: [], joinedWorkspaces: [] }, }) }) + + it('should list workspace users', async () => { + httpService.get = jest.fn().mockReturnValue({ + status: HttpStatusCode.Success, + data: { users: [] }, + } as jest.Mocked) + + const response = await createServer().listWorkspaceUsers({ workspaceUuid: 'w-1-2-3' }) + + expect(response).toEqual({ + status: 200, + data: { users: [] }, + }) + }) }) diff --git a/packages/api/src/Domain/Server/Workspace/WorkspaceServer.ts b/packages/api/src/Domain/Server/Workspace/WorkspaceServer.ts index a50ae1add..f82efcc06 100644 --- a/packages/api/src/Domain/Server/Workspace/WorkspaceServer.ts +++ b/packages/api/src/Domain/Server/Workspace/WorkspaceServer.ts @@ -7,6 +7,8 @@ import { WorkspaceInvitationAcceptingRequestParams } from '../../Request/Workspa import { WorkspaceInvitationAcceptingResponse } from '../../Response/Workspace/WorkspaceInvitationAcceptingResponse' import { WorkspaceListRequestParams } from '../../Request/Workspace/WorkspaceListRequestParams' import { WorkspaceListResponse } from '../../Response/Workspace/WorkspaceListResponse' +import { WorkspaceUserListRequestParams } from '../../Request/Workspace/WorkspaceUserListRequestParams' +import { WorkspaceUserListResponse } from '../../Response/Workspace/WorkspaceUserListResponse' import { Paths } from './Paths' import { WorkspaceServerInterface } from './WorkspaceServerInterface' @@ -14,6 +16,12 @@ import { WorkspaceServerInterface } from './WorkspaceServerInterface' export class WorkspaceServer implements WorkspaceServerInterface { constructor(private httpService: HttpServiceInterface) {} + async listWorkspaceUsers(params: WorkspaceUserListRequestParams): Promise { + const response = await this.httpService.get(Paths.v1.listWorkspaceUsers(params.workspaceUuid), params) + + return response as WorkspaceUserListResponse + } + async listWorkspaces(params: WorkspaceListRequestParams): Promise { const response = await this.httpService.get(Paths.v1.listWorkspaces, params) diff --git a/packages/api/src/Domain/Server/Workspace/WorkspaceServerInterface.ts b/packages/api/src/Domain/Server/Workspace/WorkspaceServerInterface.ts index 1cf263b90..342879205 100644 --- a/packages/api/src/Domain/Server/Workspace/WorkspaceServerInterface.ts +++ b/packages/api/src/Domain/Server/Workspace/WorkspaceServerInterface.ts @@ -6,10 +6,13 @@ import { WorkspaceInvitationAcceptingRequestParams } from '../../Request/Workspa import { WorkspaceInvitationAcceptingResponse } from '../../Response/Workspace/WorkspaceInvitationAcceptingResponse' import { WorkspaceListRequestParams } from '../../Request/Workspace/WorkspaceListRequestParams' import { WorkspaceListResponse } from '../../Response/Workspace/WorkspaceListResponse' +import { WorkspaceUserListRequestParams } from '../../Request/Workspace/WorkspaceUserListRequestParams' +import { WorkspaceUserListResponse } from '../../Response/Workspace/WorkspaceUserListResponse' export interface WorkspaceServerInterface { createWorkspace(params: WorkspaceCreationRequestParams): Promise listWorkspaces(params: WorkspaceListRequestParams): Promise + listWorkspaceUsers(params: WorkspaceUserListRequestParams): Promise inviteToWorkspace(params: WorkspaceInvitationRequestParams): Promise acceptInvite(params: WorkspaceInvitationAcceptingRequestParams): Promise } diff --git a/packages/encryption/package.json b/packages/encryption/package.json index 899abb7ce..44a3a33dd 100644 --- a/packages/encryption/package.json +++ b/packages/encryption/package.json @@ -35,7 +35,7 @@ "typescript": "*" }, "dependencies": { - "@standardnotes/common": "^1.36.1", + "@standardnotes/common": "^1.39.0", "@standardnotes/models": "workspace:*", "@standardnotes/responses": "workspace:*", "@standardnotes/sncrypto-common": "workspace:*", diff --git a/packages/features/package.json b/packages/features/package.json index f1fbc9f15..9003d8d25 100644 --- a/packages/features/package.json +++ b/packages/features/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "@standardnotes/auth": "^3.19.4", - "@standardnotes/common": "^1.36.1", + "@standardnotes/common": "^1.39.0", "@standardnotes/security": "^1.2.0", "reflect-metadata": "^0.1.13" }, diff --git a/packages/filepicker/package.json b/packages/filepicker/package.json index a18e11d50..7dd28b709 100644 --- a/packages/filepicker/package.json +++ b/packages/filepicker/package.json @@ -31,7 +31,7 @@ "ts-node": "^10.5.0" }, "dependencies": { - "@standardnotes/common": "^1.36.1", + "@standardnotes/common": "^1.39.0", "@standardnotes/files": "workspace:*", "@standardnotes/utils": "workspace:*", "@types/wicg-file-system-access": "^2020.9.5", diff --git a/packages/files/package.json b/packages/files/package.json index ec45cf7c5..19bde9adc 100644 --- a/packages/files/package.json +++ b/packages/files/package.json @@ -30,7 +30,7 @@ "ts-jest": "^28.0.5" }, "dependencies": { - "@standardnotes/common": "^1.36.1", + "@standardnotes/common": "^1.39.0", "@standardnotes/encryption": "workspace:*", "@standardnotes/models": "workspace:*", "@standardnotes/responses": "workspace:*", diff --git a/packages/models/package.json b/packages/models/package.json index 75f457b36..c78fc1576 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -31,7 +31,7 @@ "typescript": "*" }, "dependencies": { - "@standardnotes/common": "^1.36.1", + "@standardnotes/common": "^1.39.0", "@standardnotes/features": "workspace:*", "@standardnotes/responses": "workspace:*", "@standardnotes/utils": "workspace:*", diff --git a/packages/models/src/Domain/Api/Workspace/WorkspaceUser.ts b/packages/models/src/Domain/Api/Workspace/WorkspaceUser.ts new file mode 100644 index 000000000..16fcb8e5d --- /dev/null +++ b/packages/models/src/Domain/Api/Workspace/WorkspaceUser.ts @@ -0,0 +1,16 @@ +import { Uuid, WorkspaceAccessLevel, WorkspaceUserStatus } from '@standardnotes/common' + +export type WorkspaceUser = { + uuid: Uuid + accessLevel: WorkspaceAccessLevel + userUuid: Uuid + userDisplayName: string | null + workspaceUuid: Uuid + encryptedWorkspaceKey: string | null + publicKey: string | null + encryptedPrivateKey: string | null + status: WorkspaceUserStatus + keyRotationIndex: number + createdAt: number + updatedAt: number +} diff --git a/packages/models/src/Domain/index.ts b/packages/models/src/Domain/index.ts index de83ff3d9..a93856bb6 100644 --- a/packages/models/src/Domain/index.ts +++ b/packages/models/src/Domain/index.ts @@ -29,6 +29,7 @@ export * from './Api/Subscription/InvitationStatus' export * from './Api/Subscription/InviteeIdentifierType' export * from './Api/Subscription/InviterIdentifierType' export * from './Api/Workspace/Workspace' +export * from './Api/Workspace/WorkspaceUser' export * from './Device/Environment' export * from './Device/Platform' export * from './Local/KeyParams/RootKeyParamsInterface' diff --git a/packages/responses/package.json b/packages/responses/package.json index 6432faf7f..04a1bf28d 100644 --- a/packages/responses/package.json +++ b/packages/responses/package.json @@ -31,7 +31,7 @@ "ts-jest": "^28.0.5" }, "dependencies": { - "@standardnotes/common": "^1.36.1", + "@standardnotes/common": "^1.39.0", "@standardnotes/features": "workspace:*", "@standardnotes/security": "^1.1.0", "reflect-metadata": "^0.1.13" diff --git a/packages/services/package.json b/packages/services/package.json index 3b89b058c..75071dbe1 100644 --- a/packages/services/package.json +++ b/packages/services/package.json @@ -26,7 +26,7 @@ "dependencies": { "@standardnotes/api": "workspace:^", "@standardnotes/auth": "^3.19.4", - "@standardnotes/common": "^1.36.1", + "@standardnotes/common": "^1.39.0", "@standardnotes/encryption": "workspace:^", "@standardnotes/files": "workspace:^", "@standardnotes/models": "workspace:^", diff --git a/packages/services/src/Domain/Workspace/WorkspaceClientInterface.ts b/packages/services/src/Domain/Workspace/WorkspaceClientInterface.ts index 5000d9aa3..f6f86014d 100644 --- a/packages/services/src/Domain/Workspace/WorkspaceClientInterface.ts +++ b/packages/services/src/Domain/Workspace/WorkspaceClientInterface.ts @@ -1,5 +1,5 @@ -import { Uuid, WorkspaceType } from '@standardnotes/common' -import { Workspace } from '@standardnotes/models' +import { Uuid, WorkspaceAccessLevel, WorkspaceType } from '@standardnotes/common' +import { Workspace, WorkspaceUser } from '@standardnotes/models' export interface WorkspaceClientInterface { createWorkspace(dto: { @@ -12,7 +12,7 @@ export interface WorkspaceClientInterface { inviteToWorkspace(dto: { inviteeEmail: string workspaceUuid: Uuid - accessLevel: string + accessLevel: WorkspaceAccessLevel }): Promise<{ uuid: string } | null> acceptInvite(dto: { inviteUuid: Uuid @@ -21,4 +21,5 @@ export interface WorkspaceClientInterface { encryptedPrivateKey: string }): Promise<{ success: boolean }> listWorkspaces(): Promise<{ ownedWorkspaces: Array; joinedWorkspaces: Array }> + listWorkspaceUsers(dto: { workspaceUuid: Uuid }): Promise<{ users: Array }> } diff --git a/packages/services/src/Domain/Workspace/WorkspaceManager.ts b/packages/services/src/Domain/Workspace/WorkspaceManager.ts index baae68710..a62b9dae6 100644 --- a/packages/services/src/Domain/Workspace/WorkspaceManager.ts +++ b/packages/services/src/Domain/Workspace/WorkspaceManager.ts @@ -1,6 +1,6 @@ import { WorkspaceApiServiceInterface } from '@standardnotes/api' -import { Uuid, WorkspaceType } from '@standardnotes/common' -import { Workspace } from '@standardnotes/models' +import { Uuid, WorkspaceAccessLevel, WorkspaceType } from '@standardnotes/common' +import { Workspace, WorkspaceUser } from '@standardnotes/models' import { InternalEventBusInterface } from '../Internal/InternalEventBusInterface' import { AbstractService } from '../Service/AbstractService' @@ -14,6 +14,20 @@ export class WorkspaceManager extends AbstractService implements WorkspaceClient super(internalEventBus) } + async listWorkspaceUsers(dto: { workspaceUuid: string }): Promise<{ users: WorkspaceUser[] }> { + try { + const result = await this.workspaceApiService.listWorkspaceUsers(dto) + + if (result.data.error !== undefined) { + return { users: [] } + } + + return result.data + } catch (error) { + return { users: [] } + } + } + async listWorkspaces(): Promise<{ ownedWorkspaces: Workspace[]; joinedWorkspaces: Workspace[] }> { try { const result = await this.workspaceApiService.listWorkspaces() @@ -50,7 +64,7 @@ export class WorkspaceManager extends AbstractService implements WorkspaceClient async inviteToWorkspace(dto: { inviteeEmail: string workspaceUuid: Uuid - accessLevel: string + accessLevel: WorkspaceAccessLevel }): Promise<{ uuid: string } | null> { try { const result = await this.workspaceApiService.inviteToWorkspace(dto) diff --git a/packages/snjs/package.json b/packages/snjs/package.json index 6eeeef9b7..4211b0922 100644 --- a/packages/snjs/package.json +++ b/packages/snjs/package.json @@ -68,7 +68,7 @@ }, "dependencies": { "@standardnotes/api": "workspace:*", - "@standardnotes/common": "^1.36.1", + "@standardnotes/common": "^1.39.0", "@standardnotes/domain-events": "^2.39.0", "@standardnotes/encryption": "workspace:*", "@standardnotes/features": "workspace:*", diff --git a/packages/ui-services/package.json b/packages/ui-services/package.json index a44d1aa57..1ef7267d2 100644 --- a/packages/ui-services/package.json +++ b/packages/ui-services/package.json @@ -23,7 +23,7 @@ "test": "jest spec --coverage --passWithNoTests" }, "dependencies": { - "@standardnotes/common": "^1.36.1", + "@standardnotes/common": "^1.39.0", "@standardnotes/filepicker": "workspace:^", "@standardnotes/services": "workspace:^", "@standardnotes/styles": "workspace:^", diff --git a/packages/utils/package.json b/packages/utils/package.json index 3103d9fe8..cbaae390f 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -25,7 +25,7 @@ "test": "jest spec" }, "dependencies": { - "@standardnotes/common": "^1.36.1", + "@standardnotes/common": "^1.39.0", "dompurify": "^2.3.8", "lodash": "^4.17.21", "reflect-metadata": "^0.1.13" diff --git a/yarn.lock b/yarn.lock index 30c134afe..20953aaf3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6068,7 +6068,7 @@ __metadata: version: 0.0.0-use.local resolution: "@standardnotes/api@workspace:packages/api" dependencies: - "@standardnotes/common": ^1.36.1 + "@standardnotes/common": ^1.39.0 "@standardnotes/encryption": "workspace:*" "@standardnotes/models": "workspace:*" "@standardnotes/responses": "workspace:*" @@ -6251,12 +6251,12 @@ __metadata: languageName: node linkType: hard -"@standardnotes/common@npm:^1.36.1": - version: 1.36.1 - resolution: "@standardnotes/common@npm:1.36.1" +"@standardnotes/common@npm:^1.39.0": + version: 1.39.0 + resolution: "@standardnotes/common@npm:1.39.0" dependencies: reflect-metadata: ^0.1.13 - checksum: 4f2367d461aa1cd4e3ec132520310773183c3c9f8e423565aec315f5e5dffdce79f9704307a32fbfec17157f99d37d49982ad4272eee5aac0dbe37da34be054c + checksum: 92cfad04a631cdcf971516be4bf0e066e9cb6e894017102ac406cd8964282e088653ebed282d7624f371d617418edce124d12a62964723697ed7fa33b6d6e4d0 languageName: node linkType: hard @@ -6443,7 +6443,7 @@ __metadata: version: 0.0.0-use.local resolution: "@standardnotes/encryption@workspace:packages/encryption" dependencies: - "@standardnotes/common": ^1.36.1 + "@standardnotes/common": ^1.39.0 "@standardnotes/config": 2.4.3 "@standardnotes/models": "workspace:*" "@standardnotes/responses": "workspace:*" @@ -6485,7 +6485,7 @@ __metadata: resolution: "@standardnotes/features@workspace:packages/features" dependencies: "@standardnotes/auth": ^3.19.4 - "@standardnotes/common": ^1.36.1 + "@standardnotes/common": ^1.39.0 "@standardnotes/security": ^1.2.0 "@types/jest": ^28.1.5 "@typescript-eslint/eslint-plugin": ^5.30.0 @@ -6501,7 +6501,7 @@ __metadata: version: 0.0.0-use.local resolution: "@standardnotes/filepicker@workspace:packages/filepicker" dependencies: - "@standardnotes/common": ^1.36.1 + "@standardnotes/common": ^1.39.0 "@standardnotes/files": "workspace:*" "@standardnotes/utils": "workspace:*" "@types/jest": ^28.1.5 @@ -6519,7 +6519,7 @@ __metadata: version: 0.0.0-use.local resolution: "@standardnotes/files@workspace:packages/files" dependencies: - "@standardnotes/common": ^1.36.1 + "@standardnotes/common": ^1.39.0 "@standardnotes/encryption": "workspace:*" "@standardnotes/models": "workspace:*" "@standardnotes/responses": "workspace:*" @@ -6905,7 +6905,7 @@ __metadata: version: 0.0.0-use.local resolution: "@standardnotes/models@workspace:packages/models" dependencies: - "@standardnotes/common": ^1.36.1 + "@standardnotes/common": ^1.39.0 "@standardnotes/features": "workspace:*" "@standardnotes/responses": "workspace:*" "@standardnotes/utils": "workspace:*" @@ -6972,7 +6972,7 @@ __metadata: version: 0.0.0-use.local resolution: "@standardnotes/responses@workspace:packages/responses" dependencies: - "@standardnotes/common": ^1.36.1 + "@standardnotes/common": ^1.39.0 "@standardnotes/features": "workspace:*" "@standardnotes/security": ^1.1.0 "@types/jest": ^28.1.5 @@ -7041,7 +7041,7 @@ __metadata: dependencies: "@standardnotes/api": "workspace:^" "@standardnotes/auth": ^3.19.4 - "@standardnotes/common": ^1.36.1 + "@standardnotes/common": ^1.39.0 "@standardnotes/encryption": "workspace:^" "@standardnotes/files": "workspace:^" "@standardnotes/models": "workspace:^" @@ -7156,7 +7156,7 @@ __metadata: "@babel/core": "*" "@babel/preset-env": "*" "@standardnotes/api": "workspace:*" - "@standardnotes/common": ^1.36.1 + "@standardnotes/common": ^1.39.0 "@standardnotes/domain-events": ^2.39.0 "@standardnotes/encryption": "workspace:*" "@standardnotes/features": "workspace:*" @@ -7309,7 +7309,7 @@ __metadata: version: 0.0.0-use.local resolution: "@standardnotes/ui-services@workspace:packages/ui-services" dependencies: - "@standardnotes/common": ^1.36.1 + "@standardnotes/common": ^1.39.0 "@standardnotes/filepicker": "workspace:^" "@standardnotes/services": "workspace:^" "@standardnotes/styles": "workspace:^" @@ -7329,7 +7329,7 @@ __metadata: version: 0.0.0-use.local resolution: "@standardnotes/utils@workspace:packages/utils" dependencies: - "@standardnotes/common": ^1.36.1 + "@standardnotes/common": ^1.39.0 "@types/dompurify": ^2.3.3 "@types/jest": ^28.1.5 "@types/jsdom": ^16.2.14