aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations/transactions.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2022-10-09 02:23:06 +0200
committerFlorian Dold <florian@dold.me>2022-10-09 02:23:06 +0200
commit19f3e6321d68adbaf9e8ca2d03efac6706d3fdea (patch)
treed5b5999de159db9ccf6496c61a92e51323c4e51c /packages/taler-wallet-core/src/operations/transactions.ts
parent8ac5080607d28f8dcd84a949221a551a3f66cea8 (diff)
downloadwallet-core-19f3e6321d68adbaf9e8ca2d03efac6706d3fdea.tar.xz
wallet-core: put contract terms into separate object store
Diffstat (limited to 'packages/taler-wallet-core/src/operations/transactions.ts')
-rw-r--r--packages/taler-wallet-core/src/operations/transactions.ts78
1 files changed, 56 insertions, 22 deletions
diff --git a/packages/taler-wallet-core/src/operations/transactions.ts b/packages/taler-wallet-core/src/operations/transactions.ts
index d8069436a..6955d7b17 100644
--- a/packages/taler-wallet-core/src/operations/transactions.ts
+++ b/packages/taler-wallet-core/src/operations/transactions.ts
@@ -48,6 +48,7 @@ import {
WalletRefundItem,
WithdrawalGroupRecord,
WithdrawalRecordType,
+ WalletContractData,
} from "../db.js";
import { InternalWalletState } from "../internal-wallet-state.js";
import { checkDbInvariant } from "../util/invariants.js";
@@ -55,7 +56,11 @@ import { RetryTags } from "../util/retries.js";
import { makeEventId, TombstoneTag } from "./common.js";
import { processDepositGroup } from "./deposits.js";
import { getExchangeDetails } from "./exchanges.js";
-import { expectProposalDownload, processPurchasePay } from "./pay-merchant.js";
+import {
+ expectProposalDownload,
+ extractContractData,
+ processPurchasePay,
+} from "./pay-merchant.js";
import { processRefreshGroup } from "./refresh.js";
import { processTip } from "./tip.js";
import {
@@ -199,7 +204,7 @@ export async function getTransactionById(
}),
);
- const download = await expectProposalDownload(purchase);
+ const download = await expectProposalDownload(ws, purchase);
const cleanRefunds = filteredRefunds.filter(
(x): x is WalletRefundItem => !!x,
@@ -214,7 +219,12 @@ export async function getTransactionById(
const payOpId = RetryTags.forPay(purchase);
const payRetryRecord = await tx.operationRetries.get(payOpId);
- return buildTransactionForPurchase(purchase, refunds, payRetryRecord);
+ return buildTransactionForPurchase(
+ purchase,
+ contractData,
+ refunds,
+ payRetryRecord,
+ );
});
} else if (type === TransactionType.Refresh) {
const refreshGroupId = rest[0];
@@ -268,14 +278,19 @@ export async function getTransactionById(
),
);
if (t) throw Error("deleted");
- const download = await expectProposalDownload(purchase);
+ const download = await expectProposalDownload(ws, purchase);
const contractData = download.contractData;
const refunds = mergeRefundByExecutionTime(
[theRefund],
Amounts.getZero(contractData.amount.currency),
);
- return buildTransactionForRefund(purchase, refunds[0], undefined);
+ return buildTransactionForRefund(
+ purchase,
+ contractData,
+ refunds[0],
+ undefined,
+ );
});
} else if (type === TransactionType.PeerPullDebit) {
const peerPullPaymentIncomingId = rest[0];
@@ -572,12 +587,10 @@ function mergeRefundByExecutionTime(
async function buildTransactionForRefund(
purchaseRecord: PurchaseRecord,
+ contractData: WalletContractData,
refundInfo: MergedRefundInfo,
ort?: OperationRetryRecord,
): Promise<Transaction> {
- const download = await expectProposalDownload(purchaseRecord);
- const contractData = download.contractData;
-
const info: OrderShortInfo = {
merchant: contractData.merchant,
orderId: contractData.orderId,
@@ -617,11 +630,10 @@ async function buildTransactionForRefund(
async function buildTransactionForPurchase(
purchaseRecord: PurchaseRecord,
+ contractData: WalletContractData,
refundsInfo: MergedRefundInfo[],
ort?: OperationRetryRecord,
): Promise<Transaction> {
- const download = await expectProposalDownload(purchaseRecord);
- const contractData = download.contractData;
const zero = Amounts.getZero(contractData.amount.currency);
const info: OrderShortInfo = {
@@ -689,7 +701,8 @@ async function buildTransactionForPurchase(
proposalId: purchaseRecord.proposalId,
info,
frozen:
- purchaseRecord.purchaseStatus === PurchaseStatus.PaymentAbortFinished ?? false,
+ purchaseRecord.purchaseStatus === PurchaseStatus.PaymentAbortFinished ??
+ false,
...(ort?.lastError ? { error: ort.lastError } : {}),
};
}
@@ -715,6 +728,7 @@ export async function getTransactions(
x.peerPushPaymentInitiations,
x.planchets,
x.purchases,
+ x.contractTerms,
x.recoupGroups,
x.tips,
x.tombstones,
@@ -814,19 +828,29 @@ export async function getTransactions(
if (!purchase.payInfo) {
return;
}
- if (
- shouldSkipCurrency(
- transactionsRequest,
- download.contractData.amount.currency,
- )
- ) {
+ if (shouldSkipCurrency(transactionsRequest, download.currency)) {
return;
}
- const contractData = download.contractData;
- if (shouldSkipSearch(transactionsRequest, [contractData.summary])) {
+ const contractTermsRecord = await tx.contractTerms.get(
+ download.contractTermsHash,
+ );
+ if (!contractTermsRecord) {
+ return;
+ }
+ if (
+ shouldSkipSearch(transactionsRequest, [
+ contractTermsRecord?.contractTermsRaw?.summary || "",
+ ])
+ ) {
return;
}
+ const contractData = extractContractData(
+ contractTermsRecord?.contractTermsRaw,
+ download.contractTermsHash,
+ download.contractTermsMerchantSig,
+ );
+
const filteredRefunds = await Promise.all(
Object.values(purchase.refunds).map(async (r) => {
const t = await tx.tombstones.get(
@@ -847,19 +871,29 @@ export async function getTransactions(
const refunds = mergeRefundByExecutionTime(
cleanRefunds,
- Amounts.getZero(contractData.amount.currency),
+ Amounts.getZero(download.currency),
);
refunds.forEach(async (refundInfo) => {
transactions.push(
- await buildTransactionForRefund(purchase, refundInfo, undefined),
+ await buildTransactionForRefund(
+ purchase,
+ contractData,
+ refundInfo,
+ undefined,
+ ),
);
});
const payOpId = RetryTags.forPay(purchase);
const payRetryRecord = await tx.operationRetries.get(payOpId);
transactions.push(
- await buildTransactionForPurchase(purchase, refunds, payRetryRecord),
+ await buildTransactionForPurchase(
+ purchase,
+ contractData,
+ refunds,
+ payRetryRecord,
+ ),
);
});