diff options
author | Florian Dold <florian@dold.me> | 2023-05-30 12:28:21 +0200 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2023-05-30 12:28:21 +0200 |
commit | 000359a5e746d9b704b05f2f3eb8442e10a31f75 (patch) | |
tree | 9d6d2a1dc2f094ec5de2aeb2ae9a8cb43c238906 /packages/taler-wallet-core/src/operations/tip.ts | |
parent | d1dade44265ce515526cef90cb4651bb905b17ee (diff) | |
download | wallet-core-000359a5e746d9b704b05f2f3eb8442e10a31f75.tar.xz |
finish implementation of abort / cancelAborting on all tx types
Diffstat (limited to 'packages/taler-wallet-core/src/operations/tip.ts')
-rw-r--r-- | packages/taler-wallet-core/src/operations/tip.ts | 97 |
1 files changed, 83 insertions, 14 deletions
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<void> { + // 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<void> { + 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); } |