From fe8749c3f81547d080ea23d580497750d52fed91 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 25 May 2023 19:26:40 +0200 Subject: wallet-core: implement cancelAbortingTransaction for deposit groups --- .../taler-wallet-core/src/operations/deposits.ts | 80 +++++++++++++++------- 1 file changed, 54 insertions(+), 26 deletions(-) (limited to 'packages/taler-wallet-core/src/operations/deposits.ts') diff --git a/packages/taler-wallet-core/src/operations/deposits.ts b/packages/taler-wallet-core/src/operations/deposits.ts index 6c41d76f6..dc743e17f 100644 --- a/packages/taler-wallet-core/src/operations/deposits.ts +++ b/packages/taler-wallet-core/src/operations/deposits.ts @@ -167,6 +167,14 @@ export function computeDepositTransactionStatus( return { major: TransactionMajorState.Aborted, } + case DepositOperationStatus.Failed: + return { + major: TransactionMajorState.Failed, + } + case DepositOperationStatus.SuspendedAborting: + return { + major: TransactionMajorState.SuspendedAborting, + } default: throw Error(`unexpected deposit group state (${dg.operationStatus})`); } @@ -184,7 +192,7 @@ export async function suspendDepositGroup( tag: PendingTaskType.Deposit, depositGroupId, }); - let res = await ws.db + const transitionInfo = await ws.db .mktx((x) => [x.depositGroups]) .runReadWrite(async (tx) => { const dg = await tx.depositGroups.get(depositGroupId); @@ -212,14 +220,7 @@ export async function suspendDepositGroup( return undefined; }); stopLongpolling(ws, retryTag); - if (res) { - ws.notify({ - type: NotificationType.TransactionStateTransition, - transactionId, - oldTxState: res.oldTxState, - newTxState: res.newTxState, - }); - } + notifyTransition(ws, transactionId, transitionInfo); } export async function resumeDepositGroup( @@ -230,7 +231,7 @@ export async function resumeDepositGroup( tag: TransactionType.Deposit, depositGroupId, }); - let res = await ws.db + const transitionInfo = await ws.db .mktx((x) => [x.depositGroups]) .runReadWrite(async (tx) => { const dg = await tx.depositGroups.get(depositGroupId); @@ -258,14 +259,7 @@ export async function resumeDepositGroup( return undefined; }); ws.workAvailable.trigger(); - if (res) { - ws.notify({ - type: NotificationType.TransactionStateTransition, - transactionId, - oldTxState: res.oldTxState, - newTxState: res.newTxState, - }); - } + notifyTransition(ws, transactionId, transitionInfo); } export async function abortDepositGroup( @@ -280,7 +274,7 @@ export async function abortDepositGroup( tag: PendingTaskType.Deposit, depositGroupId, }); - let res = await ws.db + const transitionInfo = await ws.db .mktx((x) => [x.depositGroups]) .runReadWrite(async (tx) => { const dg = await tx.depositGroups.get(depositGroupId); @@ -311,14 +305,48 @@ export async function abortDepositGroup( stopLongpolling(ws, retryTag); // Need to process the operation again. ws.workAvailable.trigger(); - if (res) { - ws.notify({ - type: NotificationType.TransactionStateTransition, - transactionId, - oldTxState: res.oldTxState, - newTxState: res.newTxState, + notifyTransition(ws, transactionId, transitionInfo); +} + +export async function cancelAbortingDepositGroup( + ws: InternalWalletState, + depositGroupId: string, +): Promise { + const transactionId = constructTransactionIdentifier({ + tag: TransactionType.Deposit, + depositGroupId, + }); + const retryTag = constructTaskIdentifier({ + tag: PendingTaskType.Deposit, + depositGroupId, + }); + const transitionInfo = await ws.db + .mktx((x) => [x.depositGroups]) + .runReadWrite(async (tx) => { + const dg = await tx.depositGroups.get(depositGroupId); + if (!dg) { + logger.warn( + `can't cancel aborting deposit group, depositGroupId=${depositGroupId} not found`, + ); + return undefined; + } + const oldState = computeDepositTransactionStatus(dg); + switch (dg.operationStatus) { + case DepositOperationStatus.SuspendedAborting: + case DepositOperationStatus.Aborting: { + dg.operationStatus = DepositOperationStatus.Failed; + await tx.depositGroups.put(dg); + return { + oldTxState: oldState, + newTxState: computeDepositTransactionStatus(dg), + }; + } + } + return undefined; }); - } + // FIXME: Also cancel ongoing work (via cancellation token, once implemented) + stopLongpolling(ws, retryTag); + notifyTransition(ws, transactionId, transitionInfo); } export async function deleteDepositGroup( -- cgit v1.2.3