taler-typescript-core

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

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:
Mpackages/taler-util/src/types-taler-wallet-transactions.ts | 20+++++++++++++++++++-
Mpackages/taler-wallet-core/src/common.ts | 5+++++
Mpackages/taler-wallet-core/src/pay-merchant.ts | 5+++++
Mpackages/taler-wallet-core/src/transactions.ts | 4+++-
Mpackages/taler-wallet-core/src/wallet-api-types.ts | 11+++++++++--
Mpackages/taler-wallet-webextension/src/components/ShowFullContractTermPopup.tsx | 1+
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%;