diff options
author | Sebastian <sebasjm@gmail.com> | 2023-10-19 02:44:28 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2023-10-19 02:56:14 -0300 |
commit | f89e27a4e39412c4863fe26f821988a65ecec1b9 (patch) | |
tree | 2bc1a5c3971a38fa32268593ccce69f0281858e6 /packages/taler-util/src/http-client/bank-core.ts | |
parent | c6968c3c21d70bd76ce50f232650d183fa8cfa6e (diff) | |
download | wallet-core-f89e27a4e39412c4863fe26f821988a65ecec1b9.tar.gz wallet-core-f89e27a4e39412c4863fe26f821988a65ecec1b9.tar.bz2 wallet-core-f89e27a4e39412c4863fe26f821988a65ecec1b9.zip |
update api
Diffstat (limited to 'packages/taler-util/src/http-client/bank-core.ts')
-rw-r--r-- | packages/taler-util/src/http-client/bank-core.ts | 284 |
1 files changed, 145 insertions, 139 deletions
diff --git a/packages/taler-util/src/http-client/bank-core.ts b/packages/taler-util/src/http-client/bank-core.ts index 7b4bb53d4..593daa2c3 100644 --- a/packages/taler-util/src/http-client/bank-core.ts +++ b/packages/taler-util/src/http-client/bank-core.ts @@ -18,63 +18,50 @@ import { AmountJson, Amounts, HttpStatusCode, - Logger + LibtoolVersion } from "@gnu-taler/taler-util"; import { HttpRequestLibrary, - createPlatformHttpLib, - expectSuccessResponseOrThrow, - readSuccessResponseJsonOrThrow + createPlatformHttpLib } from "@gnu-taler/taler-util/http"; import { TalerBankIntegrationHttpClient } from "./bank-integration.js"; import { TalerRevenueHttpClient } from "./bank-revenue.js"; import { TalerWireGatewayHttpClient } from "./bank-wire.js"; -import { AccessToken, TalerAuthentication, TalerCorebankApi, codecForAccountData, codecForBankAccountCreateWithdrawalResponse, codecForBankAccountGetWithdrawalResponse, codecForBankAccountTransactionInfo, codecForBankAccountTransactionsResponse, codecForCashoutConversionResponse, codecForCashoutPending, codecForCashoutStatusResponse, codecForCashouts, codecForConversionRatesResponse, codecForCoreBankConfig, codecForGlobalCashouts, codecForListBankAccountsResponse, codecForMonitorResponse, codecForPublicAccountsResponse, codecForTokenSuccessResponse } from "./types.js"; -import { PaginationParams, UserAndPassword, UserAndToken, addPaginationParams, httpEmptySuccess, httpSuccess, knownFailure, makeBasicAuthHeader, makeBearerTokenAuthHeader, unknownFailure } from "./utils.js"; +import { AccessToken, OperationOk, PaginationParams, TalerCorebankApi, UserAndToken, codecForAccountData, codecForBankAccountCreateWithdrawalResponse, codecForBankAccountGetWithdrawalResponse, codecForBankAccountTransactionInfo, codecForBankAccountTransactionsResponse, codecForCashoutConversionResponse, codecForCashoutPending, codecForCashoutStatusResponse, codecForCashouts, codecForConversionRatesResponse, codecForCoreBankConfig, codecForGlobalCashouts, codecForListBankAccountsResponse, codecForMonitorResponse, codecForPublicAccountsResponse } from "./types.js"; +import { addPaginationParams, opFixedSuccess, opEmptySuccess, opSuccess, opKnownFailure, makeBearerTokenAuthHeader, opUnknownFailure } from "./utils.js"; +import { TalerAuthenticationHttpClient } from "./authentication.js"; -const logger = new Logger("http-client/core-bank.ts"); +type props = keyof TalerCoreBankHttpClient + +export type TalerCoreBankResultByMethod<p extends props> = TalerCoreBankHttpClient[p] extends (...args: any[]) => infer Ret ? + Ret extends Promise<infer Result> ? + Result : + never : //api always use Promises + never; //error cases just for functions + +export type TalerCoreBankErrorsByMethod<p extends props> = Exclude<TalerCoreBankResultByMethod<p>, OperationOk<any>> + +/** + * Protocol version spoken with the bank. + * + * Uses libtool's current:revision:age versioning. + */ export class TalerCoreBankHttpClient { + public readonly PROTOCOL_VERSION = "0:0:0"; + httpLib: HttpRequestLibrary; constructor( - private baseUrl: string, + readonly baseUrl: string, httpClient?: HttpRequestLibrary, ) { this.httpLib = httpClient ?? createPlatformHttpLib(); } - /** - * https://docs.taler.net/core/api-corebank.html#post--accounts-$USERNAME-token - * - * @returns - */ - async createAccessToken( - auth: UserAndPassword, - body: TalerAuthentication.TokenRequest, - ): Promise<TalerAuthentication.TokenSuccessResponse> { - const url = new URL(`accounts/${auth.username}/token`, this.baseUrl); - const resp = await this.httpLib.fetch(url.href, { - method: "POST", - headers: { - Authorization: makeBasicAuthHeader(auth.username, auth.password), - }, - body - }); - return readSuccessResponseJsonOrThrow(resp, codecForTokenSuccessResponse()); - } - - async deleteAccessToken( - auth: UserAndToken, - ): Promise<void> { - const url = new URL(`accounts/${auth.username}/token`, this.baseUrl); - const resp = await this.httpLib.fetch(url.href, { - method: "DELETE", - headers: { - Authorization: makeBearerTokenAuthHeader(auth.token), - } - }); - return expectSuccessResponseOrThrow(resp); + isCompatible(version: string): boolean { + const compare = LibtoolVersion.compare(this.PROTOCOL_VERSION, version) + return compare?.compatible ?? false } /** @@ -88,8 +75,8 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { //FIXME: missing in docs - case HttpStatusCode.Ok: return httpSuccess(resp, codecForCoreBankConfig()) - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opSuccess(resp, codecForCoreBankConfig()) + default: return opUnknownFailure(resp, await resp.text()) } } @@ -111,17 +98,19 @@ export class TalerCoreBankHttpClient { }, }); switch (resp.status) { - case HttpStatusCode.NoContent: return httpEmptySuccess() - case HttpStatusCode.BadRequest: return knownFailure("invalid-input", resp); + //FIXME: NOT IN THE DOOOCS + case HttpStatusCode.Created: return opEmptySuccess() + case HttpStatusCode.NoContent: return opEmptySuccess() + case HttpStatusCode.BadRequest: return opKnownFailure("invalid-input", resp); case HttpStatusCode.Forbidden: { if (body.username === "bank" || body.username === "admin") { - return knownFailure("unable-to-create", resp); + return opKnownFailure("unable-to-create", resp); } else { - return knownFailure("unauthorized", resp); + return opKnownFailure("unauthorized", resp); } } - case HttpStatusCode.Conflict: return knownFailure("already-exist", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Conflict: return opKnownFailure("already-exist", resp); + default: return opUnknownFailure(resp, await resp.text()) } } /** @@ -137,17 +126,17 @@ export class TalerCoreBankHttpClient { }, }); switch (resp.status) { - case HttpStatusCode.NoContent: return httpEmptySuccess() - case HttpStatusCode.NotFound: return knownFailure("not-found", resp); + case HttpStatusCode.NoContent: return opEmptySuccess() + case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp); case HttpStatusCode.Forbidden: { if (auth.username === "bank" || auth.username === "admin") { - return knownFailure("unable-to-delete", resp); + return opKnownFailure("unable-to-delete", resp); } else { - return knownFailure("unauthorized", resp); + return opKnownFailure("unauthorized", resp); } } - case HttpStatusCode.PreconditionFailed: return knownFailure("balance-not-zero", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.PreconditionFailed: return opKnownFailure("balance-not-zero", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -165,10 +154,10 @@ export class TalerCoreBankHttpClient { }, }); switch (resp.status) { - case HttpStatusCode.NoContent: return httpEmptySuccess() - case HttpStatusCode.NotFound: return knownFailure("not-found", resp); - case HttpStatusCode.Forbidden: return knownFailure("unauthorized", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.NoContent: return opEmptySuccess() + case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp); + case HttpStatusCode.Forbidden: return opKnownFailure("unauthorized", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -186,12 +175,12 @@ export class TalerCoreBankHttpClient { }, }); switch (resp.status) { - case HttpStatusCode.NoContent: return httpEmptySuccess() + case HttpStatusCode.NoContent: return opEmptySuccess() //FIXME: missing in docs - case HttpStatusCode.NotFound: return knownFailure("not-found", resp); + case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp); //FIXME: missing in docs - case HttpStatusCode.Forbidden: return knownFailure("unauthorized", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Forbidden: return opKnownFailure("unauthorized", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -199,8 +188,10 @@ export class TalerCoreBankHttpClient { * https://docs.taler.net/core/get-$BANK_API_BASE_URL-public-accounts * */ - async getPublicAccounts() { + async getPublicAccounts(pagination?: PaginationParams) { const url = new URL(`public-accounts`, this.baseUrl); + //FIXME: missing pagination in docs + addPaginationParams(url, pagination) const resp = await this.httpLib.fetch(url.href, { method: "GET", headers: { @@ -208,10 +199,10 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { //FIXME: missing in docs - case HttpStatusCode.Ok: return httpSuccess(resp, codecForPublicAccountsResponse()) + case HttpStatusCode.Ok: return opSuccess(resp, codecForPublicAccountsResponse()) //FIXME: missing in docs - case HttpStatusCode.NoContent: return httpEmptySuccess() - default: return unknownFailure(url, resp) + case HttpStatusCode.NoContent: return opFixedSuccess({ public_accounts: [] }) + default: return opUnknownFailure(resp, await resp.text()) } } @@ -219,8 +210,9 @@ export class TalerCoreBankHttpClient { * https://docs.taler.net/core/api-corebank.html#get--accounts * */ - async getAccounts(auth: AccessToken) { + async getAccounts(auth: AccessToken, pagination?: PaginationParams) { const url = new URL(`accounts`, this.baseUrl); + addPaginationParams(url, pagination) const resp = await this.httpLib.fetch(url.href, { method: "GET", headers: { @@ -228,10 +220,10 @@ export class TalerCoreBankHttpClient { }, }); switch (resp.status) { - case HttpStatusCode.Ok: return httpSuccess(resp, codecForListBankAccountsResponse()) - case HttpStatusCode.NoContent: return httpEmptySuccess() - case HttpStatusCode.Forbidden: return knownFailure("unauthorized", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opSuccess(resp, codecForListBankAccountsResponse()) + case HttpStatusCode.NoContent: return opFixedSuccess({ accounts: [] }) + case HttpStatusCode.Forbidden: return opKnownFailure("unauthorized", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -248,12 +240,12 @@ export class TalerCoreBankHttpClient { }, }); switch (resp.status) { - case HttpStatusCode.Ok: return httpSuccess(resp, codecForAccountData()) + case HttpStatusCode.Ok: return opSuccess(resp, codecForAccountData()) //FIXME: missing in docs - case HttpStatusCode.NotFound: return knownFailure("not-found", resp); + case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp); //FIXME: missing in docs - case HttpStatusCode.Forbidden: return knownFailure("unauthorized", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Forbidden: return opKnownFailure("unauthorized", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -275,14 +267,14 @@ export class TalerCoreBankHttpClient { }, }); switch (resp.status) { - case HttpStatusCode.Ok: return httpSuccess(resp, codecForBankAccountTransactionsResponse()) + case HttpStatusCode.Ok: return opSuccess(resp, codecForBankAccountTransactionsResponse()) //FIXME: missing in docs - case HttpStatusCode.NoContent: return httpEmptySuccess() + case HttpStatusCode.NoContent: return opFixedSuccess({ transactions: [] }) //FIXME: missing in docs - case HttpStatusCode.NotFound: return knownFailure("not-found", resp); + case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp); //FIXME: missing in docs - case HttpStatusCode.Forbidden: return knownFailure("unauthorized", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Forbidden: return opKnownFailure("unauthorized", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -299,12 +291,12 @@ export class TalerCoreBankHttpClient { }, }); switch (resp.status) { - case HttpStatusCode.Ok: return httpSuccess(resp, codecForBankAccountTransactionInfo()) + case HttpStatusCode.Ok: return opSuccess(resp, codecForBankAccountTransactionInfo()) //FIXME: missing in docs - case HttpStatusCode.NotFound: return knownFailure("not-found", resp); + case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp); //FIXME: missing in docs - case HttpStatusCode.Forbidden: return knownFailure("unauthorized", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Forbidden: return opKnownFailure("unauthorized", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -323,12 +315,12 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { //FIXME: fix docs... it should be NoContent - case HttpStatusCode.Ok: return httpEmptySuccess() - case HttpStatusCode.NoContent: return httpEmptySuccess() - case HttpStatusCode.BadRequest: return knownFailure("invalid-input", resp); + case HttpStatusCode.Ok: return opEmptySuccess() + case HttpStatusCode.NoContent: return opEmptySuccess() + case HttpStatusCode.BadRequest: return opKnownFailure("invalid-input", resp); //FIXME: missing in docs - case HttpStatusCode.Forbidden: return knownFailure("unauthorized", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Forbidden: return opKnownFailure("unauthorized", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -351,9 +343,9 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { //FIXME: missing in docs - case HttpStatusCode.Ok: return httpSuccess(resp, codecForBankAccountCreateWithdrawalResponse()) - case HttpStatusCode.Forbidden: return knownFailure("insufficient-funds", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opSuccess(resp, codecForBankAccountCreateWithdrawalResponse()) + case HttpStatusCode.Forbidden: return opKnownFailure("insufficient-funds", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -368,8 +360,9 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { //FIXME: missing in docs - case HttpStatusCode.Ok: return httpSuccess(resp, codecForBankAccountGetWithdrawalResponse()) - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opSuccess(resp, codecForBankAccountGetWithdrawalResponse()) + case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp) + default: return opUnknownFailure(resp, await resp.text()) } } @@ -384,10 +377,10 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { //FIXME: fix docs... it should be NoContent - case HttpStatusCode.Ok: return httpEmptySuccess() - case HttpStatusCode.NoContent: return httpEmptySuccess() - case HttpStatusCode.Conflict: return knownFailure("previously-confirmed", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opEmptySuccess() + case HttpStatusCode.NoContent: return opEmptySuccess() + case HttpStatusCode.Conflict: return opKnownFailure("previously-confirmed", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -402,11 +395,11 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { //FIXME: fix docs... it should be NoContent - case HttpStatusCode.Ok: return httpEmptySuccess() - case HttpStatusCode.NoContent: return httpEmptySuccess() - case HttpStatusCode.Conflict: return knownFailure("previously-aborted", resp); - case HttpStatusCode.UnprocessableEntity: return knownFailure("no-exchange-or-reserve-selected", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opEmptySuccess() + case HttpStatusCode.NoContent: return opEmptySuccess() + case HttpStatusCode.Conflict: return opKnownFailure("previously-aborted", resp); + case HttpStatusCode.UnprocessableEntity: return opKnownFailure("no-exchange-or-reserve-selected", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -428,11 +421,17 @@ export class TalerCoreBankHttpClient { body, }); switch (resp.status) { - case HttpStatusCode.Accepted: return httpSuccess(resp, codecForCashoutPending()) + case HttpStatusCode.Accepted: return opSuccess(resp, codecForCashoutPending()) //FIXME: it should be precondition-failed - case HttpStatusCode.Conflict: return knownFailure("invalid-state", resp); - case HttpStatusCode.ServiceUnavailable: return knownFailure("tan-not-supported", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Conflict: return opKnownFailure("no-contact-info", resp); + //FIXME: missing in the docs + case HttpStatusCode.Forbidden: return opKnownFailure("no-allowed", resp); + //FIXME: missing in the docs + case HttpStatusCode.PreconditionFailed: return opKnownFailure("no-enough-balance", resp); + //FIXME: missing in the docs + case HttpStatusCode.BadRequest: return opKnownFailure("incorrect-exchange-rate", resp); + case HttpStatusCode.ServiceUnavailable: return opKnownFailure("tan-not-supported", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -449,10 +448,10 @@ export class TalerCoreBankHttpClient { }, }); switch (resp.status) { - case HttpStatusCode.NoContent: return httpEmptySuccess() - case HttpStatusCode.NotFound: return knownFailure("not-found", resp); - case HttpStatusCode.Conflict: return knownFailure("already-confirmed", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.NoContent: return opEmptySuccess() + case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp); + case HttpStatusCode.Conflict: return opKnownFailure("already-confirmed", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -470,11 +469,11 @@ export class TalerCoreBankHttpClient { body, }); switch (resp.status) { - case HttpStatusCode.NoContent: return httpEmptySuccess() - case HttpStatusCode.Forbidden: return knownFailure("wrong-tan-or-credential", resp); - case HttpStatusCode.NotFound: return knownFailure("not-found", resp); - case HttpStatusCode.Conflict: return knownFailure("cashout-address-changed", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.NoContent: return opEmptySuccess() + case HttpStatusCode.Forbidden: return opKnownFailure("wrong-tan-or-credential", resp); + case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp); + case HttpStatusCode.Conflict: return opKnownFailure("cashout-address-changed", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -494,10 +493,10 @@ export class TalerCoreBankHttpClient { method: "GET", }); switch (resp.status) { - case HttpStatusCode.Ok: return httpSuccess(resp, codecForCashoutConversionResponse()) - case HttpStatusCode.BadRequest: return knownFailure("wrong-calculation", resp); - case HttpStatusCode.NotFound: return knownFailure("not-supported", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opSuccess(resp, codecForCashoutConversionResponse()) + case HttpStatusCode.BadRequest: return opKnownFailure("wrong-calculation", resp); + case HttpStatusCode.NotFound: return opKnownFailure("not-supported", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -514,9 +513,9 @@ export class TalerCoreBankHttpClient { }, }); switch (resp.status) { - case HttpStatusCode.Ok: return httpSuccess(resp, codecForCashouts()) - case HttpStatusCode.NoContent: return httpEmptySuccess(); - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opSuccess(resp, codecForCashouts()) + case HttpStatusCode.NoContent: return opFixedSuccess({ cashouts: [] }); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -533,9 +532,9 @@ export class TalerCoreBankHttpClient { }, }); switch (resp.status) { - case HttpStatusCode.Ok: return httpSuccess(resp, codecForGlobalCashouts()) - case HttpStatusCode.NoContent: return httpEmptySuccess(); - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opSuccess(resp, codecForGlobalCashouts()) + case HttpStatusCode.NoContent: return opFixedSuccess({ cashouts: [] }); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -553,9 +552,9 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { //FIXME: missing in docs - case HttpStatusCode.Ok: return httpSuccess(resp, codecForCashoutStatusResponse()) - case HttpStatusCode.NotFound: return knownFailure("already-aborted", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opSuccess(resp, codecForCashoutStatusResponse()) + case HttpStatusCode.NotFound: return opKnownFailure("already-aborted", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -573,9 +572,9 @@ export class TalerCoreBankHttpClient { method: "GET", }); switch (resp.status) { - case HttpStatusCode.Ok: return httpSuccess(resp, codecForConversionRatesResponse()) - case HttpStatusCode.NotFound: return knownFailure("not-supported", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opSuccess(resp, codecForConversionRatesResponse()) + case HttpStatusCode.NotFound: return opKnownFailure("not-supported", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -595,10 +594,10 @@ export class TalerCoreBankHttpClient { method: "GET", }); switch (resp.status) { - case HttpStatusCode.Ok: return httpSuccess(resp, codecForMonitorResponse()) - case HttpStatusCode.NotFound: return knownFailure("not-supported", resp); - case HttpStatusCode.BadRequest: return knownFailure("invalid-input", resp); - default: return unknownFailure(url, resp) + case HttpStatusCode.Ok: return opSuccess(resp, codecForMonitorResponse()) + case HttpStatusCode.NotFound: return opKnownFailure("not-supported", resp); + case HttpStatusCode.BadRequest: return opKnownFailure("invalid-input", resp); + default: return opUnknownFailure(resp, await resp.text()) } } @@ -611,7 +610,7 @@ export class TalerCoreBankHttpClient { * */ getIntegrationAPI(): TalerBankIntegrationHttpClient { - const url = new URL(`taler-integration`, this.baseUrl); + const url = new URL(`taler-integration/`, this.baseUrl); return new TalerBankIntegrationHttpClient(url.href, this.httpLib) } @@ -620,7 +619,7 @@ export class TalerCoreBankHttpClient { * */ getWireGatewayAPI(username: string): TalerWireGatewayHttpClient { - const url = new URL(`accounts/${username}/taler-wire-gateway`, this.baseUrl); + const url = new URL(`accounts/${username}/taler-wire-gateway/`, this.baseUrl); return new TalerWireGatewayHttpClient(url.href, username, this.httpLib) } @@ -629,9 +628,16 @@ export class TalerCoreBankHttpClient { * */ getRevenueAPI(username: string): TalerRevenueHttpClient { - const url = new URL(`accounts/${username}/taler-revenue`, this.baseUrl); + const url = new URL(`accounts/${username}/taler-revenue/`, this.baseUrl); return new TalerRevenueHttpClient(url.href, username, this.httpLib,) } + /** + * https://docs.taler.net/core/api-corebank.html#post--accounts-$USERNAME-token + * + */ + getAuthenticationAPI(username: string): TalerAuthenticationHttpClient { + const url = new URL(`accounts/${username}/`, this.baseUrl); + return new TalerAuthenticationHttpClient(url.href, username, this.httpLib,) + } } - |