diff options
Diffstat (limited to 'packages/taler-wallet-core/src/operations/pay-merchant.ts')
-rw-r--r-- | packages/taler-wallet-core/src/operations/pay-merchant.ts | 83 |
1 files changed, 65 insertions, 18 deletions
diff --git a/packages/taler-wallet-core/src/operations/pay-merchant.ts b/packages/taler-wallet-core/src/operations/pay-merchant.ts index 30c75f695..8462f2fb9 100644 --- a/packages/taler-wallet-core/src/operations/pay-merchant.ts +++ b/packages/taler-wallet-core/src/operations/pay-merchant.ts @@ -1508,6 +1508,7 @@ export async function processPurchase( case PurchaseStatus.SuspendedPendingAcceptRefund: case PurchaseStatus.SuspendedQueryingAutoRefund: case PurchaseStatus.SuspendedQueryingRefund: + case PurchaseStatus.FailedAbort: return { type: OperationAttemptResultType.Finished, result: undefined, @@ -1790,10 +1791,55 @@ export async function abortPayMerchant( ws.workAvailable.trigger(); } +export async function cancelAbortingPaymentTransaction( + ws: InternalWalletState, + proposalId: string, +): Promise<void> { + const transactionId = constructTransactionIdentifier({ + tag: TransactionType.Payment, + proposalId, + }); + const opId = constructTaskIdentifier({ + tag: PendingTaskType.Purchase, + proposalId, + }); + const transitionInfo = await ws.db + .mktx((x) => [ + x.purchases, + x.refreshGroups, + x.denominations, + x.coinAvailability, + x.coins, + x.operationRetries, + ]) + .runReadWrite(async (tx) => { + const purchase = await tx.purchases.get(proposalId); + if (!purchase) { + throw Error("purchase not found"); + } + const oldTxState = computePayMerchantTransactionState(purchase); + let newState: PurchaseStatus | undefined = undefined; + switch (purchase.purchaseStatus) { + case PurchaseStatus.AbortingWithRefund: + newState = PurchaseStatus.FailedAbort; + break; + } + if (newState) { + purchase.purchaseStatus = newState; + await tx.purchases.put(purchase); + } + const newTxState = computePayMerchantTransactionState(purchase); + return { oldTxState, newTxState }; + }); + notifyTransition(ws, transactionId, transitionInfo); + ws.workAvailable.trigger(); +} -const transitionSuspend: { [x in PurchaseStatus]?: { - next: PurchaseStatus | undefined, -} } = { +const transitionSuspend: { + [x in PurchaseStatus]?: { + next: PurchaseStatus | undefined; + }; +} = { [PurchaseStatus.PendingDownloadingProposal]: { next: PurchaseStatus.SuspendedDownloadingProposal, }, @@ -1808,12 +1854,14 @@ const transitionSuspend: { [x in PurchaseStatus]?: { }, [PurchaseStatus.PendingQueryingAutoRefund]: { next: PurchaseStatus.SuspendedQueryingAutoRefund, - } -} + }, +}; -const transitionResume: { [x in PurchaseStatus]?: { - next: PurchaseStatus | undefined, -} } = { +const transitionResume: { + [x in PurchaseStatus]?: { + next: PurchaseStatus | undefined; + }; +} = { [PurchaseStatus.SuspendedDownloadingProposal]: { next: PurchaseStatus.PendingDownloadingProposal, }, @@ -1828,9 +1876,8 @@ const transitionResume: { [x in PurchaseStatus]?: { }, [PurchaseStatus.SuspendedQueryingAutoRefund]: { next: PurchaseStatus.PendingQueryingAutoRefund, - } -} - + }, +}; export async function suspendPayMerchant( ws: InternalWalletState, @@ -1846,9 +1893,7 @@ export async function suspendPayMerchant( }); stopLongpolling(ws, opId); const transitionInfo = await ws.db - .mktx((x) => [ - x.purchases, - ]) + .mktx((x) => [x.purchases]) .runReadWrite(async (tx) => { const purchase = await tx.purchases.get(proposalId); if (!purchase) { @@ -1867,7 +1912,6 @@ export async function suspendPayMerchant( ws.workAvailable.trigger(); } - export async function resumePayMerchant( ws: InternalWalletState, proposalId: string, @@ -1882,9 +1926,7 @@ export async function resumePayMerchant( }); stopLongpolling(ws, opId); const transitionInfo = await ws.db - .mktx((x) => [ - x.purchases, - ]) + .mktx((x) => [x.purchases]) .runReadWrite(async (tx) => { const purchase = await tx.purchases.get(proposalId); if (!purchase) { @@ -2010,6 +2052,11 @@ export function computePayMerchantTransactionState( major: TransactionMajorState.Failed, minor: TransactionMinorState.ClaimProposal, }; + case PurchaseStatus.FailedAbort: + return { + major: TransactionMajorState.Failed, + minor: TransactionMinorState.AbortingBank, + }; } } |