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:
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)),
};
}