From 000359a5e746d9b704b05f2f3eb8442e10a31f75 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Tue, 30 May 2023 12:28:21 +0200 Subject: finish implementation of abort / cancelAborting on all tx types --- packages/taler-wallet-core/src/operations/tip.ts | 97 ++++++++++++++++++++---- 1 file changed, 83 insertions(+), 14 deletions(-) (limited to 'packages/taler-wallet-core/src/operations/tip.ts') diff --git a/packages/taler-wallet-core/src/operations/tip.ts b/packages/taler-wallet-core/src/operations/tip.ts index 70b595c2f..0bee2b406 100644 --- a/packages/taler-wallet-core/src/operations/tip.ts +++ b/packages/taler-wallet-core/src/operations/tip.ts @@ -87,21 +87,28 @@ const logger = new Logger("operations/tip.ts"); export function computeTipTransactionStatus( tipRecord: TipRecord, ): TransactionState { - if (tipRecord.pickedUpTimestamp) { - return { - major: TransactionMajorState.Done, - }; - } - if (tipRecord.acceptedTimestamp) { - return { - major: TransactionMajorState.Pending, - minor: TransactionMinorState.Pickup, - }; + switch (tipRecord.status) { + case TipRecordStatus.Done: + return { + major: TransactionMajorState.Done, + }; + case TipRecordStatus.Aborted: + return { + major: TransactionMajorState.Aborted, + }; + case TipRecordStatus.PendingPickup: + return { + major: TransactionMajorState.Pending, + minor: TransactionMinorState.Pickup, + }; + case TipRecordStatus.SuspendidPickup: + return { + major: TransactionMajorState.Pending, + minor: TransactionMinorState.User, + }; + default: + assertUnreachable(tipRecord.status); } - return { - major: TransactionMajorState.Pending, - minor: TransactionMinorState.User, - }; } export async function prepareTip( @@ -445,6 +452,7 @@ export async function suspendTipTransaction( switch (tipRec.status) { case TipRecordStatus.Done: case TipRecordStatus.SuspendidPickup: + case TipRecordStatus.Aborted: break; case TipRecordStatus.PendingPickup: newStatus = TipRecordStatus.SuspendidPickup; @@ -492,11 +500,72 @@ export async function resumeTipTransaction( let newStatus: TipRecordStatus | undefined = undefined; switch (tipRec.status) { case TipRecordStatus.Done: + break; case TipRecordStatus.SuspendidPickup: newStatus = TipRecordStatus.PendingPickup; break; case TipRecordStatus.PendingPickup: break; + case TipRecordStatus.Aborted: + break; + default: + assertUnreachable(tipRec.status); + } + if (newStatus != null) { + const oldTxState = computeTipTransactionStatus(tipRec); + tipRec.status = newStatus; + const newTxState = computeTipTransactionStatus(tipRec); + await tx.tips.put(tipRec); + return { + oldTxState, + newTxState, + }; + } + return undefined; + }); + notifyTransition(ws, transactionId, transitionInfo); +} + +export async function cancelAbortingTipTransaction( + ws: InternalWalletState, + walletTipId: string, +): Promise { + // We don't have an "aborting" state, so this should never happen! + throw Error("can't run cance-aborting on tip transaction"); +} + +export async function abortTipTransaction( + ws: InternalWalletState, + walletTipId: string, +): Promise { + const taskId = constructTaskIdentifier({ + tag: PendingTaskType.TipPickup, + walletTipId, + }); + const transactionId = constructTransactionIdentifier({ + tag: TransactionType.Tip, + walletTipId, + }); + stopLongpolling(ws, taskId); + const transitionInfo = await ws.db + .mktx((x) => [x.tips]) + .runReadWrite(async (tx) => { + const tipRec = await tx.tips.get(walletTipId); + if (!tipRec) { + logger.warn(`transaction tip ${walletTipId} not found`); + return; + } + let newStatus: TipRecordStatus | undefined = undefined; + switch (tipRec.status) { + case TipRecordStatus.Done: + break; + case TipRecordStatus.SuspendidPickup: + newStatus = TipRecordStatus.Aborted; + break; + case TipRecordStatus.PendingPickup: + break; + case TipRecordStatus.Aborted: + break; default: assertUnreachable(tipRec.status); } -- cgit v1.2.3