chore: fix handling failures upon shared vault invite accepting (#2443)

This commit is contained in:
Karol Sójko
2023-08-23 11:52:00 +02:00
committed by GitHub
parent 474ba7c318
commit c26f0c4c02
4 changed files with 29 additions and 11 deletions

View File

@@ -1,9 +1,11 @@
import { AsymmetricMessageSharedVaultInvite } from '@standardnotes/models' import { AsymmetricMessageSharedVaultInvite } from '@standardnotes/models'
import { SharedVaultInvitesServerInterface } from '@standardnotes/api' import { SharedVaultInvitesServerInterface } from '@standardnotes/api'
import { SharedVaultInviteServerHash } from '@standardnotes/responses' import { SharedVaultInviteServerHash, getErrorFromErrorResponse, isErrorResponse } from '@standardnotes/responses'
import { Result, UseCaseInterface } from '@standardnotes/domain-core'
import { ProcessAcceptedVaultInvite } from '../../AsymmetricMessage/UseCase/ProcessAcceptedVaultInvite' import { ProcessAcceptedVaultInvite } from '../../AsymmetricMessage/UseCase/ProcessAcceptedVaultInvite'
export class AcceptVaultInvite { export class AcceptVaultInvite implements UseCaseInterface<void> {
constructor( constructor(
private inviteServer: SharedVaultInvitesServerInterface, private inviteServer: SharedVaultInvitesServerInterface,
private processInvite: ProcessAcceptedVaultInvite, private processInvite: ProcessAcceptedVaultInvite,
@@ -12,12 +14,17 @@ export class AcceptVaultInvite {
async execute(dto: { async execute(dto: {
invite: SharedVaultInviteServerHash invite: SharedVaultInviteServerHash
message: AsymmetricMessageSharedVaultInvite message: AsymmetricMessageSharedVaultInvite
}): Promise<void> { }): Promise<Result<void>> {
await this.processInvite.execute(dto.message, dto.invite.shared_vault_uuid, dto.invite.sender_uuid) const acceptResponse = await this.inviteServer.acceptInvite({
await this.inviteServer.acceptInvite({
sharedVaultUuid: dto.invite.shared_vault_uuid, sharedVaultUuid: dto.invite.shared_vault_uuid,
inviteUuid: dto.invite.uuid, inviteUuid: dto.invite.uuid,
}) })
if (isErrorResponse(acceptResponse)) {
return Result.fail(`Could not accept vault invitation: ${getErrorFromErrorResponse(acceptResponse).message}`)
}
await this.processInvite.execute(dto.message, dto.invite.shared_vault_uuid, dto.invite.sender_uuid)
return Result.ok()
} }
} }

View File

@@ -135,12 +135,18 @@ export class VaultInviteService
return response.data.invites return response.data.invites
} }
public async acceptInvite(pendingInvite: InviteRecord): Promise<void> { public async acceptInvite(pendingInvite: InviteRecord): Promise<Result<void>> {
if (!pendingInvite.trusted) { if (!pendingInvite.trusted) {
throw new Error('Cannot accept untrusted invite') return Result.fail('Cannot accept untrusted invite')
} }
await this._acceptVaultInvite.execute({ invite: pendingInvite.invite, message: pendingInvite.message }) const acceptResult = await this._acceptVaultInvite.execute({
invite: pendingInvite.invite,
message: pendingInvite.message,
})
if (acceptResult.isFailed()) {
return Result.fail(acceptResult.getError())
}
delete this.pendingInvites[pendingInvite.invite.uuid] delete this.pendingInvites[pendingInvite.invite.uuid]
@@ -149,6 +155,8 @@ export class VaultInviteService
await this._decryptErroredPayloads.execute() await this._decryptErroredPayloads.execute()
await this.sync.syncSharedVaultsFromScratch([pendingInvite.invite.shared_vault_uuid]) await this.sync.syncSharedVaultsFromScratch([pendingInvite.invite.shared_vault_uuid])
return Result.ok()
} }
public async getInvitableContactsForSharedVault( public async getInvitableContactsForSharedVault(

View File

@@ -18,5 +18,5 @@ export interface VaultInviteServiceInterface extends ApplicationServiceInterface
getOutboundInvites( getOutboundInvites(
sharedVault?: SharedVaultListingInterface, sharedVault?: SharedVaultListingInterface,
): Promise<SharedVaultInviteServerHash[] | ClientDisplayableError> ): Promise<SharedVaultInviteServerHash[] | ClientDisplayableError>
acceptInvite(pendingInvite: InviteRecord): Promise<void> acceptInvite(pendingInvite: InviteRecord): Promise<Result<void>>
} }

View File

@@ -23,7 +23,10 @@ const InviteItem = ({ inviteRecord }: Props) => {
}, []) }, [])
const acceptInvite = useCallback(async () => { const acceptInvite = useCallback(async () => {
await application.vaultInvites.acceptInvite(inviteRecord) const result = await application.vaultInvites.acceptInvite(inviteRecord)
if (result.isFailed()) {
await application.alerts.alert(result.getError())
}
}, [application, inviteRecord]) }, [application, inviteRecord])
const closeAddContactModal = () => setIsAddContactModalOpen(false) const closeAddContactModal = () => setIsAddContactModalOpen(false)