commit 9ced5e05bea5f7d0d664d95c89ff9608ea447b75
parent 96befd3e11dec2ff1dab0f02fb0fbb1ce8d80baa
Author: Florian Dold <florian@dold.me>
Date: Wed, 4 Dec 2024 23:07:11 +0100
wallet-core: allow requesting full contract terms in getTransactionById
Diffstat:
6 files changed, 42 insertions(+), 4 deletions(-)
diff --git a/packages/taler-util/src/types-taler-wallet-transactions.ts b/packages/taler-util/src/types-taler-wallet-transactions.ts
@@ -49,7 +49,11 @@ import {
InternationalizedString,
codecForInternationalizedString,
} from "./types-taler-common.js";
-import { MerchantInfo, codecForMerchantInfo } from "./types-taler-merchant.js";
+import {
+ ContractTerms,
+ MerchantInfo,
+ codecForMerchantInfo,
+} from "./types-taler-merchant.js";
import {
RefreshReason,
ScopeInfo,
@@ -634,6 +638,13 @@ export interface TransactionPayment extends TransactionCommon {
info: OrderShortInfo;
/**
+ * Full contract terms.
+ *
+ * Only included if explicitly included in the request.
+ */
+ contractTerms?: ContractTerms;
+
+ /**
* Amount that must be paid for the contract
*/
amountRaw: AmountString;
@@ -834,12 +845,19 @@ export interface TransactionDeposit extends TransactionCommon {
export interface TransactionByIdRequest {
transactionId: string;
+
+ /**
+ * If set to true, report the full contract terms in the response
+ * if the transaction has them.
+ */
+ includeContractTerms?: boolean;
}
export const codecForTransactionByIdRequest =
(): Codec<TransactionByIdRequest> =>
buildCodecForObject<TransactionByIdRequest>()
.property("transactionId", codecForString())
+ .property("includeContractTerms", codecOptional(codecForBoolean()))
.build("TransactionByIdRequest");
export const codecForGetTransactionsV2Request =
diff --git a/packages/taler-wallet-core/src/common.ts b/packages/taler-wallet-core/src/common.ts
@@ -806,9 +806,14 @@ export interface TransactionContext {
deleteTransaction(): Promise<void>;
lookupFullTransaction(
tx: WalletDbAllStoresReadOnlyTransaction,
+ args?: LookupFullTransactionOpts,
): Promise<Transaction | undefined>;
}
+export interface LookupFullTransactionOpts {
+ includeContractTerms?: boolean;
+}
+
declare const __taskIdStr: unique symbol;
export type TaskIdStr = string & { [__taskIdStr]: true };
diff --git a/packages/taler-wallet-core/src/pay-merchant.ts b/packages/taler-wallet-core/src/pay-merchant.ts
@@ -115,6 +115,7 @@ import {
constructTaskIdentifier,
genericWaitForState,
genericWaitForStateVal,
+ LookupFullTransactionOpts,
PendingTaskType,
spendCoins,
TaskIdentifiers,
@@ -218,6 +219,7 @@ export class PayMerchantTransactionContext implements TransactionContext {
async lookupFullTransaction(
tx: WalletDbAllStoresReadOnlyTransaction,
+ req: LookupFullTransactionOpts,
): Promise<Transaction | undefined> {
const proposalId = this.proposalId;
const purchaseRec = await tx.purchases.get(proposalId);
@@ -305,6 +307,9 @@ export class PayMerchantTransactionContext implements TransactionContext {
}),
abortReason: purchaseRec.abortReason,
info,
+ contractTerms: req.includeContractTerms
+ ? download.contractTermsRaw
+ : undefined,
refundQueryActive:
purchaseRec.purchaseStatus === PurchaseStatus.PendingQueryingRefund,
...(payRetryRec?.lastError ? { error: payRetryRec.lastError } : {}),
diff --git a/packages/taler-wallet-core/src/transactions.ts b/packages/taler-wallet-core/src/transactions.ts
@@ -159,7 +159,9 @@ export async function getTransactionById(
case TransactionType.Refund: {
const ctx = await getContextForTransaction(wex, req.transactionId);
const txDetails = await wex.db.runAllStoresReadOnlyTx({}, async (tx) =>
- ctx.lookupFullTransaction(tx),
+ ctx.lookupFullTransaction(tx, {
+ includeContractTerms: req.includeContractTerms,
+ }),
);
if (!txDetails) {
throw Error("transaction not found");
diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts
@@ -182,7 +182,6 @@ export enum WalletApiOperation {
SharePayment = "sharePayment",
CheckPayForTemplate = "checkPayForTemplate",
PreparePayForTemplate = "preparePayForTemplate",
- GetContractTermsDetails = "getContractTermsDetails",
RunIntegrationTest = "runIntegrationTest",
RunIntegrationTestV2 = "runIntegrationTestV2",
TestCrypto = "testCrypto",
@@ -294,9 +293,17 @@ export enum WalletApiOperation {
HintApplicationResumed = "hintApplicationResumed",
/**
- * @deprecated use checkDeposit instead
+ * @deprecated (2024-12-04)
+ *
+ * use checkDeposit instead
*/
PrepareDeposit = "prepareDeposit",
+
+ /**
+ * @deprecated (2024-12-04)
+ * Use getTransactionById with includeContractTerms: true instead
+ */
+ GetContractTermsDetails = "getContractTermsDetails",
}
// group: Initialization
diff --git a/packages/taler-wallet-webextension/src/components/ShowFullContractTermPopup.tsx b/packages/taler-wallet-webextension/src/components/ShowFullContractTermPopup.tsx
@@ -36,6 +36,7 @@ import { compose, StateViewMap } from "../utils/index.js";
import { Amount } from "./Amount.js";
import { ErrorAlertView } from "./CurrentAlerts.js";
import { Link } from "./styled/index.js";
+import { WxApiType } from "../wxApi.js";
const ContractTermsTable = styled.table`
width: 100%;