aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-util/src/http-client/bank-core.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-util/src/http-client/bank-core.ts')
-rw-r--r--packages/taler-util/src/http-client/bank-core.ts88
1 files changed, 51 insertions, 37 deletions
diff --git a/packages/taler-util/src/http-client/bank-core.ts b/packages/taler-util/src/http-client/bank-core.ts
index 83adb6370..4557a34e4 100644
--- a/packages/taler-util/src/http-client/bank-core.ts
+++ b/packages/taler-util/src/http-client/bank-core.ts
@@ -15,8 +15,6 @@
*/
import {
- AmountJson,
- Amounts,
HttpStatusCode,
LibtoolVersion,
TalerErrorCode,
@@ -28,12 +26,12 @@ import {
} from "@gnu-taler/taler-util/http";
import { FailCasesByMethod, ResultByMethod, opEmptySuccess, opFixedSuccess, opKnownFailure, opSuccess, opUnknownFailure } from "../operation.js";
import { TalerAuthenticationHttpClient } from "./authentication.js";
+import { TalerBankConversionHttpClient } from "./bank-conversion.js";
import { TalerBankIntegrationHttpClient } from "./bank-integration.js";
import { TalerRevenueHttpClient } from "./bank-revenue.js";
import { TalerWireGatewayHttpClient } from "./bank-wire.js";
-import { AccessToken, PaginationParams, TalerCorebankApi, UserAndToken, codecForAccountData, codecForBankAccountCreateWithdrawalResponse, codecForBankAccountGetWithdrawalResponse, codecForBankAccountTransactionInfo, codecForBankAccountTransactionsResponse, codecForCashinConversionResponse, codecForCashoutConversionResponse, codecForCashoutPending, codecForCashoutStatusResponse, codecForCashouts, codecForCoreBankConfig, codecForGlobalCashouts, codecForListBankAccountsResponse, codecForMonitorResponse, codecForPublicAccountsResponse, codecForRegisterAccountResponse } from "./types.js";
+import { AccessToken, PaginationParams, TalerCorebankApi, UserAndToken, codecForAccountData, codecForBankAccountCreateWithdrawalResponse, codecForBankAccountTransactionInfo, codecForBankAccountTransactionsResponse, codecForCashoutPending, codecForCashoutStatusResponse, codecForCashouts, codecForCoreBankConfig, codecForCreateTransactionResponse, codecForGlobalCashouts, codecForListBankAccountsResponse, codecForMonitorResponse, codecForPublicAccountsResponse, codecForRegisterAccountResponse, codecForWithdrawalPublicInfo } from "./types.js";
import { addPaginationParams, makeBearerTokenAuthHeader } from "./utils.js";
-import { TalerBankConversionHttpClient } from "./bank-conversion.js";
export type TalerCoreBankResultByMethod<prop extends keyof TalerCoreBankHttpClient> = ResultByMethod<TalerCoreBankHttpClient, prop>
@@ -62,7 +60,7 @@ export class TalerCoreBankHttpClient {
}
/**
- * https://docs.taler.net/core/api-corebank.html#get--accounts-$USERNAME
+ * https://docs.taler.net/core/api-corebank.html#config
*
*/
async getConfig() {
@@ -157,10 +155,16 @@ export class TalerCoreBankHttpClient {
case HttpStatusCode.NoContent: return opEmptySuccess()
case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp);
case HttpStatusCode.Unauthorized: return opKnownFailure("unauthorized", resp);
- //FIXME: missing error code for cases:
- // * change legal name
- // * admin tries to change its own account
- case HttpStatusCode.Forbidden: return opKnownFailure("cant-change-legal-name-or-admin", resp);
+ case HttpStatusCode.Conflict: {
+ const body = await resp.json()
+ const details = codecForTalerErrorDetail().decode(body)
+ switch (details.code) {
+ case TalerErrorCode.BANK_PATCH_ADMIN_EXCHANGE: return opKnownFailure("admin-cant-be-exchange", resp);
+ case TalerErrorCode.BANK_NON_ADMIN_PATCH_LEGAL_NAME: return opKnownFailure("user-cant-change-name", resp);
+ case TalerErrorCode.BANK_NON_ADMIN_PATCH_DEBT_LIMIT: return opKnownFailure("user-cant-change-debt", resp);
+ default: return opUnknownFailure(resp, body)
+ }
+ }
default: return opUnknownFailure(resp, await resp.text())
}
}
@@ -182,25 +186,31 @@ export class TalerCoreBankHttpClient {
case HttpStatusCode.NoContent: return opEmptySuccess()
case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp);
case HttpStatusCode.Unauthorized: return opKnownFailure("unauthorized", resp);
- //FIXME: add code to split cases
- // * An admin account tried to make its account an exchange
- // * A non-admin user tried to change properties reserved for the admin
- case HttpStatusCode.Forbidden: return opKnownFailure("old-password-invalid-or-not-allowed", resp);
+ case HttpStatusCode.Conflict: {
+ const body = await resp.json()
+ const details = codecForTalerErrorDetail().decode(body)
+ switch (details.code) {
+ case TalerErrorCode.BANK_NON_ADMIN_PATCH_MISSING_OLD_PASSWORD: return opKnownFailure("user-require-old-password", resp);
+ case TalerErrorCode.BANK_PATCH_BAD_OLD_PASSWORD: return opKnownFailure("wrong-old-password", resp);
+ default: return opUnknownFailure(resp, body)
+ }
+ }
default: return opUnknownFailure(resp, await resp.text())
}
}
/**
- * https://docs.taler.net/core/get-$BANK_API_BASE_URL-public-accounts
+ * https://docs.taler.net/core/api-corebank.html#get--public-accounts
*
*/
- async getPublicAccounts(pagination?: PaginationParams) {
+ async getPublicAccounts(filter: { account?: string } = {}, pagination?: PaginationParams) {
const url = new URL(`public-accounts`, this.baseUrl);
addPaginationParams(url, pagination)
+ if (filter.account !== undefined) {
+ url.searchParams.set("filter_name", filter.account)
+ }
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
- headers: {
- },
});
switch (resp.status) {
case HttpStatusCode.Ok: return opSuccess(resp, codecForPublicAccountsResponse())
@@ -217,7 +227,7 @@ export class TalerCoreBankHttpClient {
async getAccounts(auth: AccessToken, filter: { account?: string } = {}, pagination?: PaginationParams) {
const url = new URL(`accounts`, this.baseUrl);
addPaginationParams(url, pagination)
- if (filter.account) {
+ if (filter.account !== undefined) {
url.searchParams.set("filter_name", filter.account)
}
const resp = await this.httpLib.fetch(url.href, {
@@ -259,7 +269,7 @@ export class TalerCoreBankHttpClient {
//
/**
- * https://docs.taler.net/core/api-corebank.html#get-$BANK_API_BASE_URL-accounts-$account_name-transactions
+ * https://docs.taler.net/core/api-corebank.html#get--accounts-$USERNAME-transactions
*
*/
async getTransactions(auth: UserAndToken, pagination?: PaginationParams) {
@@ -274,14 +284,14 @@ export class TalerCoreBankHttpClient {
switch (resp.status) {
case HttpStatusCode.Ok: return opSuccess(resp, codecForBankAccountTransactionsResponse())
case HttpStatusCode.NoContent: return opFixedSuccess({ transactions: [] })
- case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp);
case HttpStatusCode.Unauthorized: return opKnownFailure("unauthorized", resp);
+ case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp);
default: return opUnknownFailure(resp, await resp.text())
}
}
/**
- * https://docs.taler.net/core/api-corebank.html#get-$BANK_API_BASE_URL-accounts-$account_name-transactions-$transaction_id
+ * https://docs.taler.net/core/api-corebank.html#get--accounts-$USERNAME-transactions-$TRANSACTION_ID
*
*/
async getTransactionById(auth: UserAndToken, txid: number) {
@@ -301,10 +311,10 @@ export class TalerCoreBankHttpClient {
}
/**
- * https://docs.taler.net/core/api-corebank.html#post-$BANK_API_BASE_URL-accounts-$account_name-transactions
+ * https://docs.taler.net/core/api-corebank.html#post--accounts-$USERNAME-transactions
*
*/
- async createTransaction(auth: UserAndToken, body: TalerCorebankApi.CreateBankAccountTransactionCreate) {
+ async createTransaction(auth: UserAndToken, body: TalerCorebankApi.CreateTransactionRequest) {
const url = new URL(`accounts/${auth.username}/transactions`, this.baseUrl);
const resp = await this.httpLib.fetch(url.href, {
method: "POST",
@@ -314,8 +324,7 @@ export class TalerCoreBankHttpClient {
body,
});
switch (resp.status) {
- //FIXME: expect txid as response
- case HttpStatusCode.NoContent: return opEmptySuccess()
+ case HttpStatusCode.Ok: return opSuccess(resp, codecForCreateTransactionResponse())
case HttpStatusCode.BadRequest: return opKnownFailure("invalid-input", resp);
case HttpStatusCode.Unauthorized: return opKnownFailure("unauthorized", resp);
case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp);
@@ -338,7 +347,7 @@ export class TalerCoreBankHttpClient {
//
/**
- * https://docs.taler.net/core/api-corebank.html#post-$BANK_API_BASE_URL-accounts-$account_name-withdrawals
+ * https://docs.taler.net/core/api-corebank.html#post--accounts-$USERNAME-withdrawals
*
*/
async createWithdrawal(auth: UserAndToken, body: TalerCorebankApi.BankAccountCreateWithdrawalRequest) {
@@ -360,13 +369,16 @@ export class TalerCoreBankHttpClient {
}
/**
- * https://docs.taler.net/core/api-corebank.html#post-$BANK_API_BASE_URL-withdrawals-$withdrawal_id-abort
+ * https://docs.taler.net/core/api-corebank.html#post--accounts-$USERNAME-withdrawals-$WITHDRAWAL_ID-abort
*
*/
- async abortWithdrawalById(wid: string) {
- const url = new URL(`withdrawals/${wid}/abort`, this.baseUrl);
+ async abortWithdrawalById(auth: UserAndToken, wid: string) {
+ const url = new URL(`accounts/${auth.username}/withdrawals/${wid}/abort`, this.baseUrl);
const resp = await this.httpLib.fetch(url.href, {
method: "POST",
+ headers: {
+ Authorization: makeBearerTokenAuthHeader(auth.token)
+ },
});
switch (resp.status) {
case HttpStatusCode.NoContent: return opEmptySuccess()
@@ -379,13 +391,16 @@ export class TalerCoreBankHttpClient {
}
/**
- * https://docs.taler.net/core/api-corebank.html#post-$BANK_API_BASE_URL-withdrawals-$withdrawal_id-confirm
+ * https://docs.taler.net/core/api-corebank.html#post--accounts-$USERNAME-withdrawals-$WITHDRAWAL_ID-confirm
*
*/
- async confirmWithdrawalById(wid: string) {
- const url = new URL(`withdrawals/${wid}/confirm`, this.baseUrl);
+ async confirmWithdrawalById(auth: UserAndToken, wid: string) {
+ const url = new URL(`accounts/${auth.username}/withdrawals/${wid}/confirm`, this.baseUrl);
const resp = await this.httpLib.fetch(url.href, {
method: "POST",
+ headers: {
+ Authorization: makeBearerTokenAuthHeader(auth.token)
+ },
});
switch (resp.status) {
case HttpStatusCode.NoContent: return opEmptySuccess()
@@ -396,9 +411,9 @@ export class TalerCoreBankHttpClient {
const body = await resp.json()
const details = codecForTalerErrorDetail().decode(body)
switch (details.code) {
- case TalerErrorCode.BANK_UNALLOWED_DEBIT: return opKnownFailure("insufficient-funds", resp);
- case TalerErrorCode.BANK_CONFIRM_INCOMPLETE: return opKnownFailure("no-exchange-or-reserve-selected", resp);
case TalerErrorCode.BANK_CONFIRM_ABORT_CONFLICT: return opKnownFailure("previously-aborted", resp);
+ case TalerErrorCode.BANK_CONFIRM_INCOMPLETE: return opKnownFailure("no-exchange-or-reserve-selected", resp);
+ case TalerErrorCode.BANK_UNALLOWED_DEBIT: return opKnownFailure("insufficient-funds", resp);
default: return opUnknownFailure(resp, body)
}
}
@@ -407,7 +422,7 @@ export class TalerCoreBankHttpClient {
}
/**
- * https://docs.taler.net/core/api-corebank.html#post-$BANK_API_BASE_URL-accounts-$account_name-withdrawals
+ * https://docs.taler.net/core/api-corebank.html#get--withdrawals-$WITHDRAWAL_ID
*
*/
async getWithdrawalById(wid: string) {
@@ -416,7 +431,7 @@ export class TalerCoreBankHttpClient {
method: "GET",
});
switch (resp.status) {
- case HttpStatusCode.Ok: return opSuccess(resp, codecForBankAccountGetWithdrawalResponse())
+ case HttpStatusCode.Ok: return opSuccess(resp, codecForWithdrawalPublicInfo())
//FIXME: missing in docs
case HttpStatusCode.BadRequest: return opKnownFailure("invalid-id", resp)
case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp)
@@ -477,7 +492,6 @@ export class TalerCoreBankHttpClient {
case HttpStatusCode.NoContent: return opEmptySuccess()
case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp);
case HttpStatusCode.Conflict: return opKnownFailure("already-confirmed", resp);
- //FIXME: should be 404 ?
case HttpStatusCode.NotImplemented: return opKnownFailure("cashout-not-supported", resp);
default: return opUnknownFailure(resp, await resp.text())
}