commit 938b379c05bff150d7bf468029d1db90739814a3
parent adc791b93045f539ffa9390d149e9dfb88541f19
Author: Florian Dold <florian@dold.me>
Date: Thu, 25 Sep 2025 13:03:11 +0200
harness: donau provisioning helper
Diffstat:
4 files changed, 76 insertions(+), 1 deletion(-)
diff --git a/packages/taler-harness/src/index.ts b/packages/taler-harness/src/index.ts
@@ -24,6 +24,7 @@ import {
Amounts,
BalancesResponse,
Configuration,
+ DonauHttpClient,
Duration,
EddsaPrivP,
HttpStatusCode,
@@ -1323,6 +1324,75 @@ deploymentCli
});
deploymentCli
+ .subcommand("provisionMerchantDonau", "provision-merchant-donau", {
+ help: "Provision a merchant and donau connection.",
+ })
+ .requiredOption(
+ "merchantAuthToken",
+ ["--merchant-auth-token"],
+ clk.STRING,
+ {},
+ )
+ .requiredOption("donauAuthToken", ["--donau-auth-token"], clk.STRING, {})
+ .requiredOption("merchantBaseUrl", ["--merchant-base-url"], clk.STRING, {})
+ .requiredOption("donauBaseUrl", ["--donau-base-url"], clk.STRING, {})
+ .requiredOption("currency", ["--currency"], clk.STRING, {})
+ .action(async (args) => {
+ const httpLib = createPlatformHttpLib({});
+ const donauBaseUrl = args.provisionMerchantDonau.donauBaseUrl;
+ const merchantUrl = args.provisionMerchantDonau.merchantBaseUrl;
+ const merchantClient = new TalerMerchantInstanceHttpClient(
+ merchantUrl,
+ httpLib,
+ );
+ const currency = args.provisionMerchantDonau.currency;
+ const merchantToken = args.provisionMerchantDonau
+ .merchantAuthToken as AccessToken;
+ const donauToken = args.provisionMerchantDonau
+ .donauAuthToken as AccessToken;
+ const instInfo = succeedOrThrow(
+ await merchantClient.getCurrentInstanceDetails(merchantToken),
+ );
+ const merchantPub = instInfo.merchant_pub;
+ const donauClient = new DonauHttpClient(donauBaseUrl, {
+ httpClient: httpLib,
+ });
+ const myCharities = succeedOrThrow(
+ await donauClient.getCharities(donauToken),
+ );
+
+ let existingCharity = myCharities.charities.find(
+ (x) => x.charity_pub === merchantPub,
+ );
+ let charityId: number;
+ if (!existingCharity) {
+ const charityResp = succeedOrThrow(
+ await donauClient.createCharity(donauToken, {
+ charity_name: instInfo.name,
+ charity_pub: merchantPub,
+ charity_url: merchantUrl,
+ current_year: new Date().getFullYear(),
+ max_per_year: `${currency}:100000`,
+ receipts_to_date: `${currency}:0`,
+ }),
+ );
+ charityId = charityResp.charity_id;
+ } else {
+ charityId = existingCharity.charity_id;
+ }
+ succeedOrThrow(
+ await merchantClient.postDonau({
+ token: merchantToken,
+ body: {
+ charity_id: charityId,
+ donau_url: donauBaseUrl,
+ },
+ }),
+ );
+ logger.info(`configured charity ${charityId} for ${merchantUrl}`);
+ });
+
+deploymentCli
.subcommand("provisionBankAccount", "provision-bank-account", {
help: "Provision a corebank account.",
})
diff --git a/packages/taler-harness/src/integrationtests/testrunner.ts b/packages/taler-harness/src/integrationtests/testrunner.ts
@@ -51,6 +51,7 @@ import { runDepositLargeTest } from "./test-deposit-large.js";
import { runDepositMergeTest } from "./test-deposit-merge.js";
import { runDepositTooLargeTest } from "./test-deposit-too-large.js";
import { runDepositTest } from "./test-deposit.js";
+import { runDonauCharityManagementTest } from "./test-donau-charity-management.js";
import { runDonauCompatTest } from "./test-donau-compat.js";
import { runDonauMinusTTest } from "./test-donau-minus-t.js";
import { runDonauTest } from "./test-donau.js";
@@ -383,6 +384,7 @@ const allTests: TestMainFunction[] = [
runDonauCompatTest,
runDonauTest,
runDonauMinusTTest,
+ runDonauCharityManagementTest,
];
export interface TestRunSpec {
diff --git a/packages/taler-util/src/http-client/donau-client.ts b/packages/taler-util/src/http-client/donau-client.ts
@@ -21,6 +21,7 @@ import { LibtoolVersion } from "../libtool-version.js";
import {
carefullyParseConfig,
opEmptySuccess,
+ OperationOk,
opFixedSuccess,
opKnownFailure,
opKnownHttpFailure,
@@ -246,7 +247,7 @@ export class DonauHttpClient {
* @param args
* @returns
*/
- async getCharities(token: AccessToken) {
+ async getCharities(token: AccessToken): Promise<OperationOk<Charities>> {
const url = new URL(`charities`, this.baseUrl);
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
diff --git a/packages/taler-util/src/types-donau.ts b/packages/taler-util/src/types-donau.ts
@@ -374,10 +374,12 @@ export interface Charities {
export interface CharitySummary {
charity_id: Integer;
+ charity_pub: EddsaPublicKeyString;
name: string;
max_per_year: AmountString;
receipts_to_date: AmountString;
}
+
export interface Charity {
charity_pub: EddsaPublicKey;
name: string;