feat: add removing revisions from shared vaults (#811)

This commit is contained in:
Karol Sójko
2023-09-07 12:02:38 +02:00
committed by GitHub
parent 376466d9b2
commit 3bd63f7674
18 changed files with 316 additions and 29 deletions
@@ -111,6 +111,9 @@ describe('UpdateExistingItem', () => {
domainEventFactory.createItemRevisionCreationRequested = jest
.fn()
.mockReturnValue({} as jest.Mocked<DomainEventInterface>)
domainEventFactory.createItemRemovedFromSharedVaultEvent = jest
.fn()
.mockReturnValue({} as jest.Mocked<DomainEventInterface>)
determineSharedVaultOperationOnItem = {} as jest.Mocked<DetermineSharedVaultOperationOnItem>
determineSharedVaultOperationOnItem.execute = jest.fn().mockResolvedValue(
@@ -400,6 +403,47 @@ describe('UpdateExistingItem', () => {
expect(item1.props.sharedVaultAssociation).not.toBeUndefined()
})
it('should remove a shared vault association and publish an event that item has been removed from shared vault', async () => {
const useCase = createUseCase()
item1.props.sharedVaultAssociation = SharedVaultAssociation.create({
sharedVaultUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
lastEditedBy: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
}).getValue()
const itemHash = ItemHash.create({
...itemHash1.props,
shared_vault_uuid: null,
}).getValue()
determineSharedVaultOperationOnItem.execute = jest.fn().mockReturnValue(
Result.ok(
SharedVaultOperationOnItem.create({
existingItem: item1,
incomingItemHash: itemHash1,
sharedVaultUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
type: SharedVaultOperationOnItem.TYPES.RemoveFromSharedVault,
userUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
}).getValue(),
),
)
const result = await useCase.execute({
existingItem: item1,
itemHash,
sessionUuid: '00000000-0000-0000-0000-000000000000',
performingUserUuid: '00000000-0000-0000-0000-000000000000',
roleNames: [RoleName.NAMES.CoreUser],
})
expect(result.isFailed()).toBeFalsy()
expect(item1.props.sharedVaultAssociation).toBeUndefined()
expect(domainEventFactory.createItemRemovedFromSharedVaultEvent).toHaveBeenCalled()
expect(domainEventPublisher.publish).toHaveBeenCalled()
})
it('should return error if shared vault association could not be created', async () => {
const useCase = createUseCase()
@@ -37,16 +37,6 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
) {}
async execute(dto: UpdateExistingItemDTO): Promise<Result<Item>> {
let sessionUuid = null
if (dto.sessionUuid) {
const sessionUuidOrError = Uuid.create(dto.sessionUuid)
if (sessionUuidOrError.isFailed()) {
return Result.fail(sessionUuidOrError.getError())
}
sessionUuid = sessionUuidOrError.getValue()
}
dto.existingItem.props.updatedWithSession = sessionUuid
const userUuidOrError = Uuid.create(dto.performingUserUuid)
if (userUuidOrError.isFailed()) {
return Result.fail(userUuidOrError.getError())
@@ -59,6 +49,29 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
}
const roleNames = roleNamesOrError.getValue()
let sharedVaultOperation: SharedVaultOperationOnItem | null = null
if (dto.itemHash.representsASharedVaultItem() || dto.existingItem.isAssociatedWithASharedVault()) {
const sharedVaultOperationOrError = await this.determineSharedVaultOperationOnItem.execute({
existingItem: dto.existingItem,
itemHash: dto.itemHash,
userUuid: userUuid.value,
})
if (sharedVaultOperationOrError.isFailed()) {
return Result.fail(sharedVaultOperationOrError.getError())
}
sharedVaultOperation = sharedVaultOperationOrError.getValue()
}
let sessionUuid = null
if (dto.sessionUuid) {
const sessionUuidOrError = Uuid.create(dto.sessionUuid)
if (sessionUuidOrError.isFailed()) {
return Result.fail(sessionUuidOrError.getError())
}
sessionUuid = sessionUuidOrError.getValue()
}
dto.existingItem.props.updatedWithSession = sessionUuid
if (dto.itemHash.props.content) {
dto.existingItem.props.content = dto.itemHash.props.content
}
@@ -128,7 +141,6 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
dto.existingItem.props.contentSize = Buffer.byteLength(JSON.stringify(dto.existingItem))
let sharedVaultOperation: SharedVaultOperationOnItem | null = null
if (dto.itemHash.representsASharedVaultItem()) {
const sharedVaultAssociationOrError = SharedVaultAssociation.create({
lastEditedBy: userUuid,
@@ -140,16 +152,6 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
}
dto.existingItem.props.sharedVaultAssociation = sharedVaultAssociationOrError.getValue()
const sharedVaultOperationOrError = await this.determineSharedVaultOperationOnItem.execute({
existingItem: dto.existingItem,
itemHash: dto.itemHash,
userUuid: userUuid.value,
})
if (sharedVaultOperationOrError.isFailed()) {
return Result.fail(sharedVaultOperationOrError.getError())
}
sharedVaultOperation = sharedVaultOperationOrError.getValue()
} else {
dto.existingItem.props.sharedVaultAssociation = undefined
}
@@ -209,7 +211,7 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
)
}
const notificationsResult = await this.addNotifications(dto.existingItem.uuid, userUuid, sharedVaultOperation)
const notificationsResult = await this.addNotificationsAndPublishEvents(userUuid, sharedVaultOperation, dto)
if (notificationsResult.isFailed()) {
return Result.fail(notificationsResult.getError())
}
@@ -217,10 +219,10 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
return Result.ok(dto.existingItem)
}
private async addNotifications(
itemUuid: Uuid,
private async addNotificationsAndPublishEvents(
userUuid: Uuid,
sharedVaultOperation: SharedVaultOperationOnItem | null,
dto: UpdateExistingItemDTO,
): Promise<Result<void>> {
if (
sharedVaultOperation &&
@@ -229,7 +231,7 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
const notificationPayloadOrError = NotificationPayload.create({
sharedVaultUuid: sharedVaultOperation.props.sharedVaultUuid,
type: NotificationType.create(NotificationType.TYPES.SharedVaultItemRemoved).getValue(),
itemUuid: itemUuid,
itemUuid: dto.existingItem.uuid,
version: '1.0',
})
if (notificationPayloadOrError.isFailed()) {
@@ -246,6 +248,15 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
if (result.isFailed()) {
return Result.fail(result.getError())
}
await this.domainEventPublisher.publish(
this.domainEventFactory.createItemRemovedFromSharedVaultEvent({
sharedVaultUuid: sharedVaultOperation.props.sharedVaultUuid.value,
itemUuid: dto.existingItem.uuid.value,
userUuid: userUuid.value,
roleNames: dto.roleNames,
}),
)
}
if (sharedVaultOperation && sharedVaultOperation.props.type === SharedVaultOperationOnItem.TYPES.AddToSharedVault) {