Просмотр исходного кода

feat: shared vault users controller. (#643)

Co-authored-by: Mo <mo@standardnotes.com>
Karol Sójko 1 год назад
Родитель
Сommit
b2c32ce70e

+ 2 - 0
packages/syncing-server/src/Bootstrap/Types.ts

@@ -42,6 +42,8 @@ const TYPES = {
   Sync_CreateSharedVault: Symbol.for('Sync_CreateSharedVault'),
   Sync_DeleteSharedVault: Symbol.for('Sync_DeleteSharedVault'),
   Sync_CreateSharedVaultFileValetToken: Symbol.for('Sync_CreateSharedVaultFileValetToken'),
+  Sync_GetSharedVaultUsers: Symbol.for('Sync_GetSharedVaultUsers'),
+  Sync_RemoveSharedVaultUser: Symbol.for('Sync_RemoveSharedVaultUser'),
   // Handlers
   Sync_AccountDeletionRequestedEventHandler: Symbol.for('Sync_AccountDeletionRequestedEventHandler'),
   Sync_DuplicateItemSyncedEventHandler: Symbol.for('Sync_DuplicateItemSyncedEventHandler'),

+ 73 - 0
packages/syncing-server/src/Infra/InversifyExpressUtils/HomeServer/HomeServerSharedVaultUsersController.ts

@@ -0,0 +1,73 @@
+import { Request, Response } from 'express'
+import { BaseHttpController, results } from 'inversify-express-utils'
+import { HttpStatusCode } from '@standardnotes/responses'
+import { ControllerContainerInterface, MapperInterface } from '@standardnotes/domain-core'
+
+import { SharedVaultUser } from '../../../Domain/SharedVault/User/SharedVaultUser'
+import { SharedVaultUserHttpRepresentation } from '../../../Mapping/Http/SharedVaultUserHttpRepresentation'
+import { GetSharedVaultUsers } from '../../../Domain/UseCase/GetSharedVaultUsers/GetSharedVaultUsers'
+import { RemoveUserFromSharedVault } from '../../../Domain/UseCase/RemoveUserFromSharedVault/RemoveUserFromSharedVault'
+
+export class HomeServerSharedVaultUsersController extends BaseHttpController {
+  constructor(
+    protected getSharedVaultUsersUseCase: GetSharedVaultUsers,
+    protected removeUserFromSharedVaultUseCase: RemoveUserFromSharedVault,
+    protected sharedVaultUserHttpMapper: MapperInterface<SharedVaultUser, SharedVaultUserHttpRepresentation>,
+    private controllerContainer?: ControllerContainerInterface,
+  ) {
+    super()
+
+    if (this.controllerContainer !== undefined) {
+      this.controllerContainer.register('sync.shared-vault-users.get-users', this.getSharedVaultUsers.bind(this))
+      this.controllerContainer.register(
+        'sync.shared-vault-users.remove-user',
+        this.removeUserFromSharedVault.bind(this),
+      )
+    }
+  }
+
+  async getSharedVaultUsers(request: Request, response: Response): Promise<results.JsonResult> {
+    const result = await this.getSharedVaultUsersUseCase.execute({
+      originatorUuid: response.locals.user.uuid,
+      sharedVaultUuid: request.params.sharedVaultUuid,
+    })
+
+    if (result.isFailed()) {
+      return this.json(
+        {
+          error: {
+            message: result.getError(),
+          },
+        },
+        HttpStatusCode.BadRequest,
+      )
+    }
+
+    return this.json({
+      users: result.getValue().map((sharedVault) => this.sharedVaultUserHttpMapper.toProjection(sharedVault)),
+    })
+  }
+
+  async removeUserFromSharedVault(request: Request, response: Response): Promise<results.JsonResult> {
+    const result = await this.removeUserFromSharedVaultUseCase.execute({
+      sharedVaultUuid: request.params.sharedVaultUuid,
+      userUuid: request.params.userUuid,
+      originatorUuid: response.locals.user.uuid,
+    })
+
+    if (result.isFailed()) {
+      return this.json(
+        {
+          error: {
+            message: result.getError(),
+          },
+        },
+        HttpStatusCode.BadRequest,
+      )
+    }
+
+    return this.json({
+      success: true,
+    })
+  }
+}

+ 1 - 1
packages/syncing-server/src/Infra/InversifyExpressUtils/HomeServer/HomeServerSharedVaultsController.ts

@@ -8,7 +8,7 @@ import { SharedVault } from '../../../Domain/SharedVault/SharedVault'
 import { SharedVaultHttpRepresentation } from '../../../Mapping/Http/SharedVaultHttpRepresentation'
 import { CreateSharedVault } from '../../../Domain/UseCase/CreateSharedVault/CreateSharedVault'
 import { SharedVaultUser } from '../../../Domain/SharedVault/User/SharedVaultUser'
-import { SharedVaultUserHttpRepresentation } from '../../../Mapping/Http/SharedVaultUserHttpRepresentation copy'
+import { SharedVaultUserHttpRepresentation } from '../../../Mapping/Http/SharedVaultUserHttpRepresentation'
 import { DeleteSharedVault } from '../../../Domain/UseCase/DeleteSharedVault/DeleteSharedVault'
 import { CreateSharedVaultFileValetToken } from '../../../Domain/UseCase/CreateSharedVaultFileValetToken/CreateSharedVaultFileValetToken'
 

+ 33 - 0
packages/syncing-server/src/Infra/InversifyExpressUtils/InversifyExpressSharedVaultUsersController.ts

@@ -0,0 +1,33 @@
+import { controller, httpDelete, httpGet, results } from 'inversify-express-utils'
+import { inject } from 'inversify'
+import { MapperInterface } from '@standardnotes/domain-core'
+import { Request, Response } from 'express'
+
+import { HomeServerSharedVaultUsersController } from './HomeServer/HomeServerSharedVaultUsersController'
+import TYPES from '../../Bootstrap/Types'
+import { SharedVaultUser } from '../../Domain/SharedVault/User/SharedVaultUser'
+import { SharedVaultUserHttpRepresentation } from '../../Mapping/Http/SharedVaultUserHttpRepresentation'
+import { GetSharedVaultUsers } from '../../Domain/UseCase/GetSharedVaultUsers/GetSharedVaultUsers'
+import { RemoveUserFromSharedVault } from '../../Domain/UseCase/RemoveUserFromSharedVault/RemoveUserFromSharedVault'
+
+@controller('/shared-vaults/:sharedVaultUuid/users', TYPES.Sync_AuthMiddleware)
+export class InversifyExpressSharedVaultUsersController extends HomeServerSharedVaultUsersController {
+  constructor(
+    @inject(TYPES.Sync_GetSharedVaultUsers) override getSharedVaultUsersUseCase: GetSharedVaultUsers,
+    @inject(TYPES.Sync_RemoveSharedVaultUser) override removeUserFromSharedVaultUseCase: RemoveUserFromSharedVault,
+    @inject(TYPES.Sync_SharedVaultUserHttpMapper)
+    override sharedVaultUserHttpMapper: MapperInterface<SharedVaultUser, SharedVaultUserHttpRepresentation>,
+  ) {
+    super(getSharedVaultUsersUseCase, removeUserFromSharedVaultUseCase, sharedVaultUserHttpMapper)
+  }
+
+  @httpGet('/')
+  override async getSharedVaultUsers(request: Request, response: Response): Promise<results.JsonResult> {
+    return super.getSharedVaultUsers(request, response)
+  }
+
+  @httpDelete('/:userUuid')
+  override async removeUserFromSharedVault(request: Request, response: Response): Promise<results.JsonResult> {
+    return super.removeUserFromSharedVault(request, response)
+  }
+}

+ 1 - 1
packages/syncing-server/src/Infra/InversifyExpressUtils/InversifyExpressSharedVaultsController.ts

@@ -12,7 +12,7 @@ import { CreateSharedVaultFileValetToken } from '../../Domain/UseCase/CreateShar
 import { DeleteSharedVault } from '../../Domain/UseCase/DeleteSharedVault/DeleteSharedVault'
 import { GetSharedVaults } from '../../Domain/UseCase/GetSharedVaults/GetSharedVaults'
 import { SharedVaultHttpRepresentation } from '../../Mapping/Http/SharedVaultHttpRepresentation'
-import { SharedVaultUserHttpRepresentation } from '../../Mapping/Http/SharedVaultUserHttpRepresentation copy'
+import { SharedVaultUserHttpRepresentation } from '../../Mapping/Http/SharedVaultUserHttpRepresentation'
 
 @controller('/shared-vaults', TYPES.Sync_AuthMiddleware)
 export class InversifyExpressSharedVaultsController extends HomeServerSharedVaultsController {

+ 1 - 1
packages/syncing-server/src/Mapping/Http/SharedVaultUserHttpMapper.ts

@@ -1,7 +1,7 @@
 import { MapperInterface } from '@standardnotes/domain-core'
 
 import { SharedVaultUser } from '../../Domain/SharedVault/User/SharedVaultUser'
-import { SharedVaultUserHttpRepresentation } from './SharedVaultUserHttpRepresentation copy'
+import { SharedVaultUserHttpRepresentation } from './SharedVaultUserHttpRepresentation'
 
 export class SharedVaultUserHttpMapper implements MapperInterface<SharedVaultUser, SharedVaultUserHttpRepresentation> {
   toDomain(_projection: SharedVaultUserHttpRepresentation): SharedVaultUser {

+ 0 - 0
packages/syncing-server/src/Mapping/Http/SharedVaultUserHttpRepresentation copy.ts → packages/syncing-server/src/Mapping/Http/SharedVaultUserHttpRepresentation.ts