From b3ae213bc5987fbb6a2ce5c08d626f9f65508b03 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 8 Mar 2024 10:08:15 -0300 Subject: remove http resp from operation --- packages/taler-util/src/MerchantApiClient.ts | 6 +-- packages/taler-util/src/errors.ts | 5 +++ .../taler-util/src/http-client/authentication.ts | 4 +- .../taler-util/src/http-client/bank-conversion.ts | 8 ++-- packages/taler-util/src/http-client/bank-core.ts | 46 +++++++++++----------- .../taler-util/src/http-client/bank-integration.ts | 8 ++-- .../taler-util/src/http-client/bank-revenue.ts | 4 +- packages/taler-util/src/http-client/bank-wire.ts | 14 +++---- packages/taler-util/src/http-client/exchange.ts | 14 +++---- packages/taler-util/src/operation.ts | 39 +++++++----------- 10 files changed, 72 insertions(+), 76 deletions(-) (limited to 'packages/taler-util/src') diff --git a/packages/taler-util/src/MerchantApiClient.ts b/packages/taler-util/src/MerchantApiClient.ts index 8afacfa46..a71887940 100644 --- a/packages/taler-util/src/MerchantApiClient.ts +++ b/packages/taler-util/src/MerchantApiClient.ts @@ -44,7 +44,7 @@ import { ResultByMethod, opEmptySuccess, opKnownHttpFailure, - opSuccess, + opSuccessFromHttp, opUnknownFailure, } from "./operation.js"; import { AmountString } from "./taler-types.js"; @@ -318,7 +318,7 @@ export class MerchantApiClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForAny()); + return opSuccessFromHttp(resp, codecForAny()); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); default: @@ -341,7 +341,7 @@ export class MerchantApiClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForMerchantConfig()); + return opSuccessFromHttp(resp, codecForMerchantConfig()); default: return opUnknownFailure(resp, await resp.text()); } diff --git a/packages/taler-util/src/errors.ts b/packages/taler-util/src/errors.ts index 3ada34d63..c5110bda8 100644 --- a/packages/taler-util/src/errors.ts +++ b/packages/taler-util/src/errors.ts @@ -108,6 +108,11 @@ export interface DetailsMap { */ contentType?: string; }; + [TalerErrorCode.GENERIC_CLIENT_INTERNAL_ERROR]: { + operation: string; + error: string; + detail: TalerErrorDetail | undefined; + } [TalerErrorCode.WALLET_EXCHANGE_COIN_SIGNATURE_INVALID]: empty; [TalerErrorCode.WALLET_WITHDRAWAL_GROUP_INCOMPLETE]: { numErrors: number; diff --git a/packages/taler-util/src/http-client/authentication.ts b/packages/taler-util/src/http-client/authentication.ts index b17ede458..e8ef6a274 100644 --- a/packages/taler-util/src/http-client/authentication.ts +++ b/packages/taler-util/src/http-client/authentication.ts @@ -27,7 +27,7 @@ import { LibtoolVersion } from "../libtool-version.js"; import { opEmptySuccess, opKnownHttpFailure, - opSuccess, + opSuccessFromHttp, opUnknownFailure, } from "../operation.js"; import { @@ -74,7 +74,7 @@ export class TalerAuthenticationHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForTokenSuccessResponse()); + return opSuccessFromHttp(resp, codecForTokenSuccessResponse()); //FIXME: missing in docs case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); diff --git a/packages/taler-util/src/http-client/bank-conversion.ts b/packages/taler-util/src/http-client/bank-conversion.ts index 5242a5fc6..91d07b11b 100644 --- a/packages/taler-util/src/http-client/bank-conversion.ts +++ b/packages/taler-util/src/http-client/bank-conversion.ts @@ -27,7 +27,7 @@ import { ResultByMethod, opEmptySuccess, opKnownHttpFailure, - opSuccess, + opSuccessFromHttp, opUnknownFailure, } from "../operation.js"; import { TalerErrorCode } from "../taler-error-codes.js"; @@ -79,7 +79,7 @@ export class TalerBankConversionHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForConversionBankConfig()); + return opSuccessFromHttp(resp, codecForConversionBankConfig()); case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: @@ -107,7 +107,7 @@ export class TalerBankConversionHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForCashinConversionResponse()); + return opSuccessFromHttp(resp, codecForCashinConversionResponse()); case HttpStatusCode.BadRequest: { const body = await resp.json(); const details = codecForTalerErrorDetail().decode(body); @@ -154,7 +154,7 @@ export class TalerBankConversionHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForCashoutConversionResponse()); + return opSuccessFromHttp(resp, codecForCashoutConversionResponse()); case HttpStatusCode.BadRequest: { const body = await resp.json(); const details = codecForTalerErrorDetail().decode(body); diff --git a/packages/taler-util/src/http-client/bank-core.ts b/packages/taler-util/src/http-client/bank-core.ts index 90ba88b6a..40e29dcef 100644 --- a/packages/taler-util/src/http-client/bank-core.ts +++ b/packages/taler-util/src/http-client/bank-core.ts @@ -35,7 +35,7 @@ import { ResultByMethod, opEmptySuccess, opFixedSuccess, - opSuccess, + opSuccessFromHttp, opUnknownFailure, } from "../operation.js"; import { TalerAuthenticationHttpClient } from "./authentication.js"; @@ -115,7 +115,7 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForCoreBankConfig()); + return opSuccessFromHttp(resp, codecForCoreBankConfig()); default: return opUnknownFailure(resp, await resp.text()); } @@ -143,7 +143,7 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForRegisterAccountResponse()); + return opSuccessFromHttp(resp, codecForRegisterAccountResponse()); case HttpStatusCode.BadRequest: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Unauthorized: @@ -339,11 +339,11 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForPublicAccountsResponse()); + return opSuccessFromHttp(resp, codecForPublicAccountsResponse()); case HttpStatusCode.NoContent: - return opFixedSuccess(resp, { public_accounts: [] }); + return opFixedSuccess({ public_accounts: [] }); case HttpStatusCode.NotFound: - return opFixedSuccess(resp, { public_accounts: [] }); + return opFixedSuccess({ public_accounts: [] }); default: return opUnknownFailure(resp, await resp.text()); } @@ -371,9 +371,9 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForListBankAccountsResponse()); + return opSuccessFromHttp(resp, codecForListBankAccountsResponse()); case HttpStatusCode.NoContent: - return opFixedSuccess(resp, { accounts: [] }); + return opFixedSuccess({ accounts: [] }); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); default: @@ -395,7 +395,7 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForAccountData()); + return opSuccessFromHttp(resp, codecForAccountData()); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -428,9 +428,9 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForBankAccountTransactionsResponse()); + return opSuccessFromHttp(resp, codecForBankAccountTransactionsResponse()); case HttpStatusCode.NoContent: - return opFixedSuccess(resp, { transactions: [] }); + return opFixedSuccess({ transactions: [] }); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -457,7 +457,7 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForBankAccountTransactionInfo()); + return opSuccessFromHttp(resp, codecForBankAccountTransactionInfo()); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Unauthorized: @@ -487,7 +487,7 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForCreateTransactionResponse()); + return opSuccessFromHttp(resp, codecForCreateTransactionResponse()); case HttpStatusCode.Accepted: return opKnownAlternativeFailure( resp, @@ -541,7 +541,7 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForBankAccountCreateWithdrawalResponse()); + return opSuccessFromHttp(resp, codecForBankAccountCreateWithdrawalResponse()); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: @@ -656,7 +656,7 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForWithdrawalPublicInfo()); + return opSuccessFromHttp(resp, codecForWithdrawalPublicInfo()); //FIXME: missing in docs case HttpStatusCode.BadRequest: return opKnownHttpFailure(resp.status, resp); @@ -691,7 +691,7 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForCashoutPending()); + return opSuccessFromHttp(resp, codecForCashoutPending()); case HttpStatusCode.Accepted: return opKnownAlternativeFailure( resp, @@ -750,7 +750,7 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForCashoutStatusResponse()); + return opSuccessFromHttp(resp, codecForCashoutStatusResponse()); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotImplemented: @@ -775,9 +775,9 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForCashouts()); + return opSuccessFromHttp(resp, codecForCashouts()); case HttpStatusCode.NoContent: - return opFixedSuccess(resp, { cashouts: [] }); + return opFixedSuccess({ cashouts: [] }); case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: @@ -800,9 +800,9 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForGlobalCashouts()); + return opSuccessFromHttp(resp, codecForGlobalCashouts()); case HttpStatusCode.NoContent: - return opFixedSuccess(resp, { cashouts: [] }); + return opFixedSuccess({ cashouts: [] }); case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: @@ -831,7 +831,7 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForTanTransmission()); + return opSuccessFromHttp(resp, codecForTanTransmission()); case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.NotFound: @@ -930,7 +930,7 @@ export class TalerCoreBankHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForMonitorResponse()); + return opSuccessFromHttp(resp, codecForMonitorResponse()); case HttpStatusCode.BadRequest: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Unauthorized: diff --git a/packages/taler-util/src/http-client/bank-integration.ts b/packages/taler-util/src/http-client/bank-integration.ts index 938249daf..a224c1f09 100644 --- a/packages/taler-util/src/http-client/bank-integration.ts +++ b/packages/taler-util/src/http-client/bank-integration.ts @@ -24,7 +24,7 @@ import { opEmptySuccess, opKnownHttpFailure, opKnownTalerFailure, - opSuccess, + opSuccessFromHttp, opUnknownFailure, } from "../operation.js"; import { TalerErrorCode } from "../taler-error-codes.js"; @@ -77,7 +77,7 @@ export class TalerBankIntegrationHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForIntegrationBankConfig()); + return opSuccessFromHttp(resp, codecForIntegrationBankConfig()); default: return opUnknownFailure(resp, await resp.text()); } @@ -106,7 +106,7 @@ export class TalerBankIntegrationHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForBankWithdrawalOperationStatus()); + return opSuccessFromHttp(resp, codecForBankWithdrawalOperationStatus()); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); default: @@ -129,7 +129,7 @@ export class TalerBankIntegrationHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForBankWithdrawalOperationPostResponse()); + return opSuccessFromHttp(resp, codecForBankWithdrawalOperationPostResponse()); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: { diff --git a/packages/taler-util/src/http-client/bank-revenue.ts b/packages/taler-util/src/http-client/bank-revenue.ts index fb90f9c1c..3b6b3c258 100644 --- a/packages/taler-util/src/http-client/bank-revenue.ts +++ b/packages/taler-util/src/http-client/bank-revenue.ts @@ -21,7 +21,7 @@ import { FailCasesByMethod, ResultByMethod, opKnownHttpFailure, - opSuccess, + opSuccessFromHttp, opUnknownFailure, } from "../operation.js"; import { @@ -90,7 +90,7 @@ export class TalerRevenueHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForMerchantIncomingHistory()); + return opSuccessFromHttp(resp, codecForMerchantIncomingHistory()); case HttpStatusCode.BadRequest: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Unauthorized: diff --git a/packages/taler-util/src/http-client/bank-wire.ts b/packages/taler-util/src/http-client/bank-wire.ts index ba68d26ef..54211fef7 100644 --- a/packages/taler-util/src/http-client/bank-wire.ts +++ b/packages/taler-util/src/http-client/bank-wire.ts @@ -22,7 +22,7 @@ import { ResultByMethod, opFixedSuccess, opKnownHttpFailure, - opSuccess, + opSuccessFromHttp, opUnknownFailure, } from "../operation.js"; import { @@ -96,7 +96,7 @@ export class TalerWireGatewayHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForTransferResponse()); + return opSuccessFromHttp(resp, codecForTransferResponse()); //FIXME: show more details in docs case HttpStatusCode.BadRequest: return opKnownHttpFailure(resp.status, resp); @@ -131,10 +131,10 @@ export class TalerWireGatewayHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForIncomingHistory()); + return opSuccessFromHttp(resp, codecForIncomingHistory()); //FIXME: account should not be returned or make it optional case HttpStatusCode.NoContent: - return opFixedSuccess(resp, { + return opFixedSuccess({ incoming_transactions: [], credit_account: undefined, }); @@ -170,10 +170,10 @@ export class TalerWireGatewayHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForOutgoingHistory()); + return opSuccessFromHttp(resp, codecForOutgoingHistory()); //FIXME: account should not be returned or make it optional case HttpStatusCode.NoContent: - return opFixedSuccess(resp, { + return opFixedSuccess({ outgoing_transactions: [], debit_account: undefined, }); @@ -208,7 +208,7 @@ export class TalerWireGatewayHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForAddIncomingResponse()); + return opSuccessFromHttp(resp, codecForAddIncomingResponse()); //FIXME: show more details in docs case HttpStatusCode.BadRequest: return opKnownHttpFailure(resp.status, resp); diff --git a/packages/taler-util/src/http-client/exchange.ts b/packages/taler-util/src/http-client/exchange.ts index 003410ddb..c61ba1f8d 100644 --- a/packages/taler-util/src/http-client/exchange.ts +++ b/packages/taler-util/src/http-client/exchange.ts @@ -9,7 +9,7 @@ import { opEmptySuccess, opFixedSuccess, opKnownHttpFailure, - opSuccess, + opSuccessFromHttp, opUnknownFailure, } from "../operation.js"; import { @@ -70,7 +70,7 @@ export class TalerExchangeHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForExchangeConfig()); + return opSuccessFromHttp(resp, codecForExchangeConfig()); default: return opUnknownFailure(resp, await resp.text()); } @@ -87,7 +87,7 @@ export class TalerExchangeHttpClient { }); switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForExchangeKeys()); + return opSuccessFromHttp(resp, codecForExchangeKeys()); default: return opUnknownFailure(resp, await resp.text()); } @@ -123,9 +123,9 @@ export class TalerExchangeHttpClient { switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForAmlRecords()); + return opSuccessFromHttp(resp, codecForAmlRecords()); case HttpStatusCode.NoContent: - return opFixedSuccess(resp, { records: [] }); + return opFixedSuccess({ records: [] }); //this should be unauthorized case HttpStatusCode.Forbidden: return opKnownHttpFailure(resp.status, resp); @@ -156,9 +156,9 @@ export class TalerExchangeHttpClient { switch (resp.status) { case HttpStatusCode.Ok: - return opSuccess(resp, codecForAmlDecisionDetails()); + return opSuccessFromHttp(resp, codecForAmlDecisionDetails()); case HttpStatusCode.NoContent: - return opFixedSuccess(resp, { aml_history: [], kyc_attributes: [] }); + return opFixedSuccess({ aml_history: [], kyc_attributes: [] }); //this should be unauthorized case HttpStatusCode.Forbidden: return opKnownHttpFailure(resp.status, resp); diff --git a/packages/taler-util/src/operation.ts b/packages/taler-util/src/operation.ts index 02cf70196..ecf4a020a 100644 --- a/packages/taler-util/src/operation.ts +++ b/packages/taler-util/src/operation.ts @@ -57,8 +57,6 @@ export function isOperationFail( export interface OperationOk { type: "ok"; - httpResp: HttpResponse; - /** * Parsed response body. */ @@ -71,8 +69,6 @@ export interface OperationOk { export interface OperationFail { type: "fail"; - httpResp: HttpResponse; - /** * Error case (either HTTP status code or TalerErrorCode) */ @@ -87,8 +83,6 @@ export interface OperationFail { export interface OperationAlternative { type: "fail"; - httpResp: HttpResponse; - case: T; body: B; } @@ -102,24 +96,24 @@ export interface OperationFailWithBody { body: B[OperationFailWithBody["case"]]; } -export async function opSuccess( +export async function opSuccessFromHttp( resp: HttpResponse, codec: Codec, ): Promise> { const body = await readSuccessResponseJsonOrThrow(resp, codec); - return { type: "ok" as const, body, httpResp: resp }; + return { type: "ok" as const, body }; } /** * Success case, but instead of the body we're returning a fixed response * to the client. */ -export function opFixedSuccess(resp: HttpResponse, body: T): OperationOk { - return { type: "ok" as const, body, httpResp: resp }; +export function opFixedSuccess(body: T): OperationOk { + return { type: "ok" as const, body }; } export function opEmptySuccess(resp: HttpResponse): OperationOk { - return { type: "ok" as const, body: void 0, httpResp: resp }; + return { type: "ok" as const, body: void 0 }; } export async function opKnownFailureWithBody( @@ -135,7 +129,7 @@ export async function opKnownAlternativeFailure( codec: Codec, ): Promise> { const body = await readSuccessResponseJsonOrThrow(resp, codec); - return { type: "fail", case: s, body, httpResp: resp }; + return { type: "fail", case: s, body }; } export async function opKnownHttpFailure( @@ -143,7 +137,7 @@ export async function opKnownHttpFailure( resp: HttpResponse, ): Promise> { const detail = await readTalerErrorResponse(resp); - return { type: "fail", case: s, detail, httpResp: resp }; + return { type: "fail", case: s, detail }; } export async function opKnownTalerFailure( @@ -151,7 +145,7 @@ export async function opKnownTalerFailure( resp: HttpResponse, ): Promise> { const detail = await readTalerErrorResponse(resp); - return { type: "fail", case: s, detail, httpResp: resp }; + return { type: "fail", case: s, detail }; } export function opUnknownFailure(resp: HttpResponse, text: string): never { @@ -171,24 +165,21 @@ export function opUnknownFailure(resp: HttpResponse, text: string): never { * Convenience function to throw an error if the operation is not a success. */ export function narrowOpSuccessOrThrow( + opName: string, opRes: OperationResult, ): asserts opRes is OperationOk { - const httpResponse = opRes.httpResp; if (opRes.type !== "ok") { throw TalerError.fromDetail( - TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR, + TalerErrorCode.GENERIC_CLIENT_INTERNAL_ERROR, { - requestUrl: httpResponse.requestUrl, - requestMethod: httpResponse.requestMethod, - httpStatusCode: httpResponse.status, - errorResponse: + operation: opName, + error: String(opRes.case), + detail: "detail" in opRes ? opRes.detail - : "body" in opRes - ? opRes.body - : undefined, + : undefined, }, - `Unexpected HTTP status ${httpResponse.status} in response`, + `Operation ${opName} failed: ${String(opRes.case)}`, ); } } -- cgit v1.2.3