wallet-core: add pay-merchant suspended states

This commit is contained in:
Florian Dold 2023-05-25 11:52:20 +02:00
parent 5f325aa4d3
commit c3ef842df0
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
3 changed files with 91 additions and 33 deletions

View File

@ -1106,6 +1106,14 @@ export enum PurchaseStatus {
PendingAcceptRefund = 16, 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. * Proposal downloaded, but the user needs to accept/reject it.
*/ */

View File

@ -373,7 +373,6 @@ async function processDownloadProposal(
return tx.operationRetries.get(opId); return tx.operationRetries.get(opId);
}); });
// FIXME: Do this in the background using the new return value
const httpResponse = await ws.http.fetch(orderClaimUrl, { const httpResponse = await ws.http.fetch(orderClaimUrl, {
body: requestBody, body: requestBody,
timeout: getProposalRequestTimeout(retryRecord?.retryInfo), timeout: getProposalRequestTimeout(retryRecord?.retryInfo),
@ -1499,6 +1498,13 @@ export async function processPurchase(
case PurchaseStatus.Proposed: case PurchaseStatus.Proposed:
case PurchaseStatus.AbortedProposalRefused: case PurchaseStatus.AbortedProposalRefused:
case PurchaseStatus.AbortedIncompletePayment: 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 { return {
type: OperationAttemptResultType.Finished, type: OperationAttemptResultType.Finished,
result: undefined, result: undefined,
@ -1785,38 +1791,12 @@ export function computePayMerchantTransactionState(
purchaseRecord: PurchaseRecord, purchaseRecord: PurchaseRecord,
): TransactionState { ): TransactionState {
switch (purchaseRecord.purchaseStatus) { switch (purchaseRecord.purchaseStatus) {
// Pending States
case PurchaseStatus.DownloadingProposal: case PurchaseStatus.DownloadingProposal:
return { return {
major: TransactionMajorState.Pending, major: TransactionMajorState.Pending,
minor: TransactionMinorState.ClaimProposal, minor: TransactionMinorState.ClaimProposal,
}; };
case PurchaseStatus.Done:
return {
major: TransactionMajorState.Done,
};
case PurchaseStatus.AbortedIncompletePayment:
return {
major: TransactionMajorState.Aborted,
};
case PurchaseStatus.Proposed:
return {
major: TransactionMajorState.Dialog,
minor: TransactionMinorState.MerchantOrderProposed,
};
case PurchaseStatus.FailedClaim:
return {
major: TransactionMajorState.Failed,
minor: TransactionMinorState.ClaimProposal,
};
case PurchaseStatus.RepurchaseDetected:
return {
major: TransactionMajorState.Failed,
minor: TransactionMinorState.Repurchase,
};
case PurchaseStatus.AbortingWithRefund:
return {
major: TransactionMajorState.Aborting,
};
case PurchaseStatus.Paying: case PurchaseStatus.Paying:
return { return {
major: TransactionMajorState.Pending, major: TransactionMajorState.Pending,
@ -1827,11 +1807,6 @@ export function computePayMerchantTransactionState(
major: TransactionMajorState.Pending, major: TransactionMajorState.Pending,
minor: TransactionMinorState.RebindSession, minor: TransactionMinorState.RebindSession,
}; };
case PurchaseStatus.AbortedProposalRefused:
return {
major: TransactionMajorState.Failed,
minor: TransactionMinorState.Refused,
};
case PurchaseStatus.QueryingAutoRefund: case PurchaseStatus.QueryingAutoRefund:
return { return {
major: TransactionMajorState.Pending, major: TransactionMajorState.Pending,
@ -1847,6 +1822,77 @@ export function computePayMerchantTransactionState(
major: TransactionMajorState.Pending, major: TransactionMajorState.Pending,
minor: TransactionMinorState.AcceptRefund, minor: TransactionMinorState.AcceptRefund,
}; };
// Suspended Pending States
case PurchaseStatus.SuspendedDownloadingProposal:
return {
major: TransactionMajorState.Suspended,
minor: TransactionMinorState.ClaimProposal,
};
case PurchaseStatus.SuspendedPaying:
return {
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,
};
// Suspended Aborting States
case PurchaseStatus.SuspendedAbortingWithRefund:
return {
major: TransactionMajorState.SuspendedAborting,
};
// Dialog States
case PurchaseStatus.Proposed:
return {
major: TransactionMajorState.Dialog,
minor: TransactionMinorState.MerchantOrderProposed,
};
// Final States
case PurchaseStatus.AbortedProposalRefused:
return {
major: TransactionMajorState.Failed,
minor: TransactionMinorState.Refused,
};
case PurchaseStatus.Done:
return {
major: TransactionMajorState.Done,
};
case PurchaseStatus.RepurchaseDetected:
return {
major: TransactionMajorState.Failed,
minor: TransactionMinorState.Repurchase,
};
case PurchaseStatus.AbortedIncompletePayment:
return {
major: TransactionMajorState.Aborted,
};
case PurchaseStatus.FailedClaim:
return {
major: TransactionMajorState.Failed,
minor: TransactionMinorState.ClaimProposal,
};
} }
} }

View File

@ -76,6 +76,7 @@ import {
import { import {
computeDepositTransactionStatus, computeDepositTransactionStatus,
processDepositGroup, processDepositGroup,
resumeDepositGroup,
suspendDepositGroup, suspendDepositGroup,
} from "./deposits.js"; } from "./deposits.js";
import { getExchangeDetails } from "./exchanges.js"; import { getExchangeDetails } from "./exchanges.js";
@ -1429,6 +1430,9 @@ export async function resumeTransaction(
throw Error("invalid transaction ID"); throw Error("invalid transaction ID");
} }
switch (tx.tag) { switch (tx.tag) {
case TransactionType.Deposit:
await resumeDepositGroup(ws, tx.depositGroupId);
return;
default: default:
logger.warn(`unable to resume transaction of type '${tx.tag}'`); logger.warn(`unable to resume transaction of type '${tx.tag}'`);
} }