chore: fix handling failures upon shared vault invite accepting (#2443)
This commit is contained in:
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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>>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user