taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit c3ef842df0ca80c5fe8deb5dabea44d5c817d7ed
parent 5f325aa4d33b4f33a2afd7d7f8aa33807c521017
Author: Florian Dold <florian@dold.me>
Date:   Thu, 25 May 2023 11:52:20 +0200

wallet-core: add pay-merchant suspended states

Diffstat:
Mpackages/taler-wallet-core/src/db.ts | 8++++++++
Mpackages/taler-wallet-core/src/operations/pay-merchant.ts | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
Mpackages/taler-wallet-core/src/operations/transactions.ts | 4++++
3 files changed, 86 insertions(+), 28 deletions(-)

diff --git a/packages/taler-wallet-core/src/db.ts b/packages/taler-wallet-core/src/db.ts @@ -1106,6 +1106,14 @@ export enum PurchaseStatus { PendingAcceptRefund = 16, + SuspendedDownloadingProposal = 20, + SuspendedPaying = 21, + SuspendedAbortingWithRefund = 22, + SuspendedPayingReplay = 23, + SuspendedQueryingRefund = 24, + SuspendedQueryingAutoRefund = 25, + SuspendedPendingAcceptRefund = 26, + /** * Proposal downloaded, but the user needs to accept/reject it. */ diff --git a/packages/taler-wallet-core/src/operations/pay-merchant.ts b/packages/taler-wallet-core/src/operations/pay-merchant.ts @@ -373,7 +373,6 @@ async function processDownloadProposal( return tx.operationRetries.get(opId); }); - // FIXME: Do this in the background using the new return value const httpResponse = await ws.http.fetch(orderClaimUrl, { body: requestBody, timeout: getProposalRequestTimeout(retryRecord?.retryInfo), @@ -1499,6 +1498,13 @@ export async function processPurchase( case PurchaseStatus.Proposed: case PurchaseStatus.AbortedProposalRefused: case PurchaseStatus.AbortedIncompletePayment: + case PurchaseStatus.SuspendedAbortingWithRefund: + case PurchaseStatus.SuspendedDownloadingProposal: + case PurchaseStatus.SuspendedPaying: + case PurchaseStatus.SuspendedPayingReplay: + case PurchaseStatus.SuspendedPendingAcceptRefund: + case PurchaseStatus.SuspendedQueryingAutoRefund: + case PurchaseStatus.SuspendedQueryingRefund: return { type: OperationAttemptResultType.Finished, result: undefined, @@ -1785,67 +1791,107 @@ export function computePayMerchantTransactionState( purchaseRecord: PurchaseRecord, ): TransactionState { switch (purchaseRecord.purchaseStatus) { + // Pending States case PurchaseStatus.DownloadingProposal: return { major: TransactionMajorState.Pending, minor: TransactionMinorState.ClaimProposal, }; - case PurchaseStatus.Done: + case PurchaseStatus.Paying: return { - major: TransactionMajorState.Done, + major: TransactionMajorState.Pending, + minor: TransactionMinorState.SubmitPayment, }; - case PurchaseStatus.AbortedIncompletePayment: + case PurchaseStatus.PayingReplay: return { - major: TransactionMajorState.Aborted, + major: TransactionMajorState.Pending, + minor: TransactionMinorState.RebindSession, }; - case PurchaseStatus.Proposed: + case PurchaseStatus.QueryingAutoRefund: return { - major: TransactionMajorState.Dialog, - minor: TransactionMinorState.MerchantOrderProposed, + major: TransactionMajorState.Pending, + minor: TransactionMinorState.AutoRefund, }; - case PurchaseStatus.FailedClaim: + case PurchaseStatus.QueryingRefund: return { - major: TransactionMajorState.Failed, + major: TransactionMajorState.Pending, + minor: TransactionMinorState.CheckRefund, + }; + case PurchaseStatus.PendingAcceptRefund: + return { + major: TransactionMajorState.Pending, + minor: TransactionMinorState.AcceptRefund, + }; + // Suspended Pending States + case PurchaseStatus.SuspendedDownloadingProposal: + return { + major: TransactionMajorState.Suspended, minor: TransactionMinorState.ClaimProposal, }; - case PurchaseStatus.RepurchaseDetected: + case PurchaseStatus.SuspendedPaying: return { - major: TransactionMajorState.Failed, - minor: TransactionMinorState.Repurchase, + major: TransactionMajorState.Suspended, + minor: TransactionMinorState.SubmitPayment, + }; + case PurchaseStatus.SuspendedPayingReplay: + return { + major: TransactionMajorState.Suspended, + minor: TransactionMinorState.RebindSession, + }; + case PurchaseStatus.SuspendedQueryingAutoRefund: + return { + major: TransactionMajorState.Suspended, + minor: TransactionMinorState.AutoRefund, + }; + case PurchaseStatus.SuspendedQueryingRefund: + return { + major: TransactionMajorState.Suspended, + minor: TransactionMinorState.CheckRefund, + }; + case PurchaseStatus.SuspendedPendingAcceptRefund: + return { + major: TransactionMajorState.Suspended, + minor: TransactionMinorState.AcceptRefund, }; + // Aborting States case PurchaseStatus.AbortingWithRefund: return { major: TransactionMajorState.Aborting, }; - case PurchaseStatus.Paying: + // Suspended Aborting States + case PurchaseStatus.SuspendedAbortingWithRefund: return { - major: TransactionMajorState.Pending, - minor: TransactionMinorState.SubmitPayment, + major: TransactionMajorState.SuspendedAborting, }; - case PurchaseStatus.PayingReplay: + // Dialog States + case PurchaseStatus.Proposed: return { - major: TransactionMajorState.Pending, - minor: TransactionMinorState.RebindSession, + major: TransactionMajorState.Dialog, + minor: TransactionMinorState.MerchantOrderProposed, }; + // Final States case PurchaseStatus.AbortedProposalRefused: return { major: TransactionMajorState.Failed, minor: TransactionMinorState.Refused, }; - case PurchaseStatus.QueryingAutoRefund: + case PurchaseStatus.Done: return { - major: TransactionMajorState.Pending, - minor: TransactionMinorState.AutoRefund, + major: TransactionMajorState.Done, }; - case PurchaseStatus.QueryingRefund: + case PurchaseStatus.RepurchaseDetected: return { - major: TransactionMajorState.Pending, - minor: TransactionMinorState.CheckRefund, + major: TransactionMajorState.Failed, + minor: TransactionMinorState.Repurchase, }; - case PurchaseStatus.PendingAcceptRefund: + case PurchaseStatus.AbortedIncompletePayment: return { - major: TransactionMajorState.Pending, - minor: TransactionMinorState.AcceptRefund, + major: TransactionMajorState.Aborted, + }; + case PurchaseStatus.FailedClaim: + return { + major: TransactionMajorState.Failed, + minor: TransactionMinorState.ClaimProposal, }; } } diff --git a/packages/taler-wallet-core/src/operations/transactions.ts b/packages/taler-wallet-core/src/operations/transactions.ts @@ -76,6 +76,7 @@ import { import { computeDepositTransactionStatus, processDepositGroup, + resumeDepositGroup, suspendDepositGroup, } from "./deposits.js"; import { getExchangeDetails } from "./exchanges.js"; @@ -1429,6 +1430,9 @@ export async function resumeTransaction( throw Error("invalid transaction ID"); } switch (tx.tag) { + case TransactionType.Deposit: + await resumeDepositGroup(ws, tx.depositGroupId); + return; default: logger.warn(`unable to resume transaction of type '${tx.tag}'`); }