taler-typescript-core

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

commit 3c5d1c26fb5237f9e878ff561d9fc31bbd7c5a56
parent cba2930d743a0f6a42420ea4d3dc43241477e386
Author: Iván Ávalos <avalos@disroot.org>
Date:   Sat, 23 May 2026 18:13:29 +0200

wallet-core: add merchantInfo to listDiscounts/listSubscriptions

Diffstat:
Mpackages/taler-util/src/types-taler-wallet.ts | 6++++++
Mpackages/taler-wallet-core/src/tokenFamilies.ts | 40++++++++++++++++++++++++++++++++++++----
2 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts @@ -95,6 +95,7 @@ import { MerchantContractTerms, MerchantContractTermsV0, MerchantContractTermsV1, + MerchantInfo, TokenEnvelope, TokenIssuePublicKey, WalletTemplateDetailsResponse, @@ -2758,6 +2759,11 @@ export interface DiscountListDetail { merchantBaseUrl: string; /** + * Name of the merchant instance issuing the token. + */ + merchantInfo?: MerchantInfo; + + /** * Human-readable name for the token family. */ name: string; diff --git a/packages/taler-wallet-core/src/tokenFamilies.ts b/packages/taler-wallet-core/src/tokenFamilies.ts @@ -26,16 +26,23 @@ import { ListSubscriptionsResponse, Logger, MerchantContractTokenKind, + MerchantInfo, SubscriptionListDetail, } from "@gnu-taler/taler-util"; import { WalletExecutionContext } from "./index.js"; import { TokenRecord } from "./db.js"; import { isTokenInUse, isTokenValid } from "./tokenSelection.js"; +import { expectProposalDownloadInTx } from "./pay-merchant.js"; const logger = new Logger("tokenFamilies.ts"); +export type MerchantInfos = { [purchaseId: string]: MerchantInfo }; + // FIXME: unit test for discount grouping -function groupDiscounts(tokens: TokenRecord[]): DiscountListDetail[] { +function groupDiscounts( + tokens: TokenRecord[], + merchantInfos: MerchantInfos, +): DiscountListDetail[] { const groupedIdx: number[] = []; const items: DiscountListDetail[] = []; tokens = tokens @@ -51,6 +58,7 @@ function groupDiscounts(tokens: TokenRecord[]): DiscountListDetail[] { tokenFamilyHash: tokenA.tokenFamilyHash!, tokenIssuePubHash: tokenA.tokenIssuePubHash, merchantBaseUrl: tokenA.merchantBaseUrl, + merchantInfo: merchantInfos[tokenA.purchaseId], name: tokenA.name, description: tokenA.description, descriptionI18n: tokenA.descriptionI18n, @@ -77,7 +85,10 @@ function groupDiscounts(tokens: TokenRecord[]): DiscountListDetail[] { } // FIXME: unit test for subscription grouping -function groupSubscriptions(tokens: TokenRecord[]): SubscriptionListDetail[] { +function groupSubscriptions( + tokens: TokenRecord[], + merchantInfos: MerchantInfos, +): SubscriptionListDetail[] { const groupedIdx: number[] = []; const items: SubscriptionListDetail[] = []; tokens = tokens @@ -93,6 +104,7 @@ function groupSubscriptions(tokens: TokenRecord[]): SubscriptionListDetail[] { tokenFamilyHash: tokenA.tokenFamilyHash!, tokenIssuePubHash: tokenA.tokenIssuePubHash, merchantBaseUrl: tokenA.merchantBaseUrl, + merchantInfo: merchantInfos[tokenA.purchaseId], name: tokenA.name, description: tokenA.description, descriptionI18n: tokenA.descriptionI18n, @@ -116,6 +128,24 @@ function groupSubscriptions(tokens: TokenRecord[]): SubscriptionListDetail[] { return items; } +async function getMerchantInfos( + wex: WalletExecutionContext, + tokens: TokenRecord[], +): Promise<MerchantInfos> { + const merchantInfos: MerchantInfos = {}; + await wex.runLegacyWalletDbTx(async (tx) => { + for (const t of tokens) { + if (t.purchaseId in merchantInfos) continue; + const purchase = await tx.purchases.get(t.purchaseId); + if (!purchase) continue; + const download = await expectProposalDownloadInTx(wex, tx, purchase); + const contractData = download.contractTerms; + merchantInfos[t.purchaseId] = contractData.merchant; + } + }); + return merchantInfos; +} + export async function listDiscounts( wex: WalletExecutionContext, tokenIssuePubHash?: string, @@ -136,7 +166,8 @@ export async function listDiscounts( } return { - discounts: groupDiscounts(tokens), + discounts: groupDiscounts(tokens, + await getMerchantInfos(wex, tokens)), }; } @@ -160,7 +191,8 @@ export async function listSubscriptions( } return { - subscriptions: groupSubscriptions(tokens), + subscriptions: groupSubscriptions(tokens, + await getMerchantInfos(wex, tokens)), }; }