aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-util/src/bank-api-client.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2023-09-21 17:56:29 +0200
committerFlorian Dold <florian@dold.me>2023-09-21 17:56:29 +0200
commit58debefbe0456ce203877f1cc417c42f4abb0685 (patch)
treeda8e0ffdca8825eb2a59c81b699fd3e6b2913037 /packages/taler-util/src/bank-api-client.ts
parent0388d31d364139d0a3999126b06d8ac850117ab9 (diff)
downloadwallet-core-58debefbe0456ce203877f1cc417c42f4abb0685.tar.xz
wallet-core,harness: towards corebank API instead of fakebank/nexus API
Diffstat (limited to 'packages/taler-util/src/bank-api-client.ts')
-rw-r--r--packages/taler-util/src/bank-api-client.ts126
1 files changed, 97 insertions, 29 deletions
diff --git a/packages/taler-util/src/bank-api-client.ts b/packages/taler-util/src/bank-api-client.ts
index cc4123500..164cd333d 100644
--- a/packages/taler-util/src/bank-api-client.ts
+++ b/packages/taler-util/src/bank-api-client.ts
@@ -146,11 +146,87 @@ export class WireGatewayApiClient {
}
}
+export interface ChallengeContactData {
+ // E-Mail address
+ email?: string;
+
+ // Phone number.
+ phone?: string;
+}
+
+export interface Balance {
+ amount: AmountString;
+ credit_debit_indicator: "credit" | "debit";
+}
+
+export interface RegisterAccountRequest {
+ // Username
+ username: string;
+
+ // Password.
+ password: string;
+
+ // Legal name of the account owner
+ name: string;
+
+ // Defaults to false.
+ is_public?: boolean;
+
+ // Is this a taler exchange account?
+ // If true:
+ // - incoming transactions to the account that do not
+ // have a valid reserve public key are automatically
+ // - the account provides the taler-wire-gateway-api endpoints
+ // Defaults to false.
+ is_taler_exchange?: boolean;
+
+ // Addresses where to send the TAN for transactions.
+ // Currently only used for cashouts.
+ // If missing, cashouts will fail.
+ // In the future, might be used for other transactions
+ // as well.
+ challenge_contact_data?: ChallengeContactData;
+
+ // 'payto' address pointing a bank account
+ // external to the libeufin-bank.
+ // Payments will be sent to this bank account
+ // when the user wants to convert the local currency
+ // back to fiat currency outside libeufin-bank.
+ cashout_payto_uri?: string;
+
+ // Internal payto URI of this bank account.
+ // Used mostly for testing.
+ internal_payto_uri?: string;
+}
+
+export interface AccountData {
+ // Legal name of the account owner.
+ name: string;
+
+ // Available balance on the account.
+ balance: Balance;
+
+ // payto://-URI of the account.
+ payto_uri: string;
+
+ // Number indicating the max debit allowed for the requesting user.
+ debit_threshold: AmountString;
+
+ contact_data?: ChallengeContactData;
+
+ // 'payto' address pointing the bank account
+ // where to send cashouts. This field is optional
+ // because not all the accounts are required to participate
+ // in the merchants' circuit. One example is the exchange:
+ // that never cashouts. Registering these accounts can
+ // be done via the access API.
+ cashout_payto_uri?: string;
+}
+
/**
- * This API look like it belongs to harness
- * but it will be nice to have in utils to be used by others
+ * Client for the Taler corebank API.
*/
-export class BankAccessApiClient {
+export class TalerCorebankApiClient {
httpLib: HttpRequestLibrary;
constructor(
@@ -215,23 +291,22 @@ export class BankAccessApiClient {
return await readSuccessResponseJsonOrThrow(resp, codecForAny());
}
- async registerAccount(
- username: string,
- password: string,
- options: {
- iban?: string;
- } = {},
- ): Promise<BankUser> {
- const url = new URL("testing/register", this.baseUrl);
+ /**
+ * Register a new account and return information about it.
+ *
+ * This is a helper, as it does both the registration and the
+ * account info query.
+ */
+ async registerAccount(username: string, password: string): Promise<BankUser> {
+ const url = new URL("accounts", this.baseUrl);
const resp = await this.httpLib.fetch(url.href, {
method: "POST",
body: {
username,
password,
- iban: options?.iban,
+ name: username,
},
});
- let paytoUri = `payto://x-taler-bank/localhost/${username}`;
if (resp.status !== 200 && resp.status !== 202 && resp.status !== 204) {
logger.error(`${j2s(await resp.json())}`);
throw TalerError.fromDetail(
@@ -241,31 +316,24 @@ export class BankAccessApiClient {
},
);
}
- try {
- // Pybank has no body, thus this might throw.
- const respJson = await resp.json();
- // LibEuFin demobank returns payto URI in response
- if (respJson.paytoUri) {
- paytoUri = respJson.paytoUri;
- }
- } catch (e) {
- // Do nothing
- }
+ const infoUrl = new URL(`accounts/${username}`, this.baseUrl);
+ const infoResp = await this.httpLib.fetch(infoUrl.href);
+ // FIXME: Validate!
+ const acctInfo: AccountData = await readSuccessResponseJsonOrThrow(
+ infoResp,
+ codecForAny(),
+ );
return {
password,
username,
- accountPaytoUri: paytoUri,
+ accountPaytoUri: acctInfo.payto_uri,
};
}
async createRandomBankUser(): Promise<BankUser> {
const username = "user-" + encodeCrock(getRandomBytes(10)).toLowerCase();
const password = "pw-" + encodeCrock(getRandomBytes(10)).toLowerCase();
- // FIXME: This is just a temporary workaround, because demobank is running out of short IBANs
- const iban = generateIban("DE", 15);
- return await this.registerAccount(username, password, {
- iban,
- });
+ return await this.registerAccount(username, password);
}
async createWithdrawalOperation(