From 1b0b40fee2b15dd8847bf91c01630492ced93750 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 4 Feb 2024 17:01:46 -0300 Subject: backward compatible change to acceptReward with txId --- .../taler-wallet-core/src/operations/reward.ts | 40 ++++++++++++++++------ .../src/operations/transactions.ts | 10 +++--- packages/taler-wallet-core/src/wallet.ts | 9 ++--- 3 files changed, 40 insertions(+), 19 deletions(-) (limited to 'packages') diff --git a/packages/taler-wallet-core/src/operations/reward.ts b/packages/taler-wallet-core/src/operations/reward.ts index 62ac81d7f..369c1f40d 100644 --- a/packages/taler-wallet-core/src/operations/reward.ts +++ b/packages/taler-wallet-core/src/operations/reward.ts @@ -37,6 +37,7 @@ import { TalerPreciseTimestamp, TipPlanchetDetail, TransactionAction, + TransactionIdStr, TransactionMajorState, TransactionMinorState, TransactionState, @@ -81,6 +82,7 @@ import { selectWithdrawalDenominations } from "../util/coinSelection.js"; import { constructTransactionIdentifier, notifyTransition, + parseTransactionIdentifier, stopLongpolling, } from "./transactions.js"; import { PendingTaskType } from "../pending-types.js"; @@ -643,18 +645,39 @@ export async function processTip( return TaskRunResult.finished(); } +export async function acceptTipBackwardCompat( + ws: InternalWalletState, + walletTipId: string | undefined, + transactionIdParam: TransactionIdStr | undefined, +): Promise { + if (transactionIdParam) { + return acceptTip(ws, transactionIdParam) + } + if (walletTipId) { + /** + * old clients use still use tipId + */ + const transactionId = constructTransactionIdentifier({ + tag: TransactionType.Reward, + walletRewardId: walletTipId, + }); + return acceptTip(ws, transactionId) + } + throw Error("Unable to accept tip: neither tipId (deprecated) nor transactionId was specified") +} + export async function acceptTip( ws: InternalWalletState, - walletTipId: string, + transactionId: TransactionIdStr, ): Promise { - const transactionId = constructTransactionIdentifier({ - tag: TransactionType.Reward, - walletRewardId: walletTipId, - }); + const pTxId = parseTransactionIdentifier(transactionId) + if (!pTxId) throw Error(`Unable to accept tip: invalid tx tag "${transactionId}"`) + const rewardId = pTxId.tag === TransactionType.Reward ? pTxId.walletRewardId : undefined; + if (!rewardId) throw Error(`Unable to accept tip: txId is not a reward tag "${pTxId.tag}"`) const dbRes = await ws.db .mktx((x) => [x.rewards]) .runReadWrite(async (tx) => { - const tipRecord = await tx.rewards.get(walletTipId); + const tipRecord = await tx.rewards.get(rewardId); if (!tipRecord) { logger.error("tip not found"); return; @@ -682,10 +705,7 @@ export async function acceptTip( const tipRecord = dbRes.tipRecord; return { - transactionId: constructTransactionIdentifier({ - tag: TransactionType.Reward, - walletRewardId: walletTipId, - }), + transactionId, next_url: tipRecord.next_url, }; } diff --git a/packages/taler-wallet-core/src/operations/transactions.ts b/packages/taler-wallet-core/src/operations/transactions.ts index 8fd7afae6..f64d3d21d 100644 --- a/packages/taler-wallet-core/src/operations/transactions.ts +++ b/packages/taler-wallet-core/src/operations/transactions.ts @@ -539,7 +539,7 @@ function buildTransactionForPeerPullCredit( const silentWithdrawalErrorForInvoice = wsrOrt?.lastError && wsrOrt.lastError.code === - TalerErrorCode.WALLET_WITHDRAWAL_GROUP_INCOMPLETE && + TalerErrorCode.WALLET_WITHDRAWAL_GROUP_INCOMPLETE && Object.values(wsrOrt.lastError.errorsPerCoin ?? {}).every((e) => { return ( e.code === TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR && @@ -569,10 +569,10 @@ function buildTransactionForPeerPullCredit( kycUrl: pullCredit.kycUrl, ...(wsrOrt?.lastError ? { - error: silentWithdrawalErrorForInvoice - ? undefined - : wsrOrt.lastError, - } + error: silentWithdrawalErrorForInvoice + ? undefined + : wsrOrt.lastError, + } : {}), }; } diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts index 005fac3c4..6440a9912 100644 --- a/packages/taler-wallet-core/src/wallet.ts +++ b/packages/taler-wallet-core/src/wallet.ts @@ -251,6 +251,7 @@ import { } from "./operations/refresh.js"; import { acceptTip, + acceptTipBackwardCompat, computeRewardTransactionStatus, prepareReward, processTip, @@ -734,9 +735,9 @@ async function dumpCoins(ws: InternalWalletState): Promise { ageCommitmentProof: c.ageCommitmentProof, spend_allocation: c.spendAllocation ? { - amount: c.spendAllocation.amount, - id: c.spendAllocation.id, - } + amount: c.spendAllocation.amount, + id: c.spendAllocation.id, + } : undefined, }); } @@ -1194,7 +1195,7 @@ async function dispatchRequestInternal( } case WalletApiOperation.AcceptReward: { const req = codecForAcceptTipRequest().decode(payload); - return await acceptTip(ws, req.walletRewardId); + return await acceptTipBackwardCompat(ws, req.walletRewardId, req.transactionId); } case WalletApiOperation.AddBackupProvider: { const req = codecForAddBackupProviderRequest().decode(payload); -- cgit v1.2.3