diff options
author | Florian Dold <florian@dold.me> | 2024-01-30 22:25:54 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2024-01-30 22:25:54 +0100 |
commit | c5f97c8f493b52f9e083548d0ac71592c56a2b79 (patch) | |
tree | d45ed40257d77880157a61919140d6e972bc60f1 /packages/taler-util | |
parent | d4429ff5acac01c5a7ef32efa3b3f2402627a71a (diff) | |
download | wallet-core-c5f97c8f493b52f9e083548d0ac71592c56a2b79.tar.xz |
harness: work on otp test
Diffstat (limited to 'packages/taler-util')
-rw-r--r-- | packages/taler-util/src/MerchantApiClient.ts | 29 | ||||
-rw-r--r-- | packages/taler-util/src/merchant-api-types.ts | 38 | ||||
-rw-r--r-- | packages/taler-util/src/operation.ts | 26 |
3 files changed, 73 insertions, 20 deletions
diff --git a/packages/taler-util/src/MerchantApiClient.ts b/packages/taler-util/src/MerchantApiClient.ts index 561226ba9..db1ffef4e 100644 --- a/packages/taler-util/src/MerchantApiClient.ts +++ b/packages/taler-util/src/MerchantApiClient.ts @@ -362,8 +362,30 @@ export class MerchantApiClient { body: req, headers: this.makeAuthHeader(), }); - if (resp.status !== 204) { - throw Error("failed to create template"); + switch (resp.status) { + case HttpStatusCode.Ok: + case HttpStatusCode.NoContent: + return opEmptySuccess(resp); + case HttpStatusCode.NotFound: + return opKnownHttpFailure(resp.status, resp); + default: + return opUnknownFailure(resp, await resp.text()); + } + } + + async getTemplate(templateId: string) { + let url = new URL(`private/templates/${templateId}`, this.baseUrl); + const resp = await this.httpClient.fetch(url.href, { + method: "GET", + headers: this.makeAuthHeader(), + }); + switch (resp.status) { + case HttpStatusCode.Ok: + return opSuccess(resp, codecForAny()); + case HttpStatusCode.NotFound: + return opKnownHttpFailure(resp.status, resp); + default: + return opUnknownFailure(resp, await resp.text()); } } @@ -391,7 +413,7 @@ export class MerchantApiClient { async createOtpDevice( req: OtpDeviceAddDetails, ): Promise<OperationOk<void> | OperationFail<HttpStatusCode.NotFound>> { - let url = new URL("private/templates", this.baseUrl); + let url = new URL("private/otp-devices", this.baseUrl); const resp = await this.httpClient.fetch(url.href, { method: "POST", body: req, @@ -399,6 +421,7 @@ export class MerchantApiClient { }); switch (resp.status) { case HttpStatusCode.Ok: + case HttpStatusCode.NoContent: return opEmptySuccess(resp); case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); diff --git a/packages/taler-util/src/merchant-api-types.ts b/packages/taler-util/src/merchant-api-types.ts index 999246597..724e99b55 100644 --- a/packages/taler-util/src/merchant-api-types.ts +++ b/packages/taler-util/src/merchant-api-types.ts @@ -25,29 +25,29 @@ * Imports. */ import { - MerchantContractTerms, - Codec, - buildCodecForObject, - codecForString, - codecOptional, - codecForConstString, - codecForBoolean, - codecForNumber, - codecForMerchantContractTerms, - codecForAny, - buildCodecForUnion, - AmountString, AbsoluteTime, + AmountString, + Codec, CoinPublicKeyString, EddsaPublicKeyString, - codecForAmountString, + ExchangeWireAccount, + FacadeCredentials, + MerchantContractTerms, TalerProtocolDuration, - codecForTimestamp, TalerProtocolTimestamp, - ExchangeWireAccount, + buildCodecForObject, + buildCodecForUnion, + codecForAmountString, + codecForAny, + codecForBoolean, + codecForConstString, codecForExchangeWireAccount, codecForList, - FacadeCredentials, + codecForMerchantContractTerms, + codecForNumber, + codecForString, + codecForTimestamp, + codecOptional, } from "@gnu-taler/taler-util"; export interface MerchantPostOrderRequest { @@ -345,7 +345,7 @@ export interface MerchantTemplateContractDetails { // The price is imposed by the merchant and cannot be changed by the customer. // This parameter is optional. - amount?: AmountString; + amount?: string; // Minimum age buyer must have (in years). Default is 0. minimum_age: number; @@ -369,6 +369,10 @@ export interface MerchantTemplateAddDetails { // Additional information in a separate template. template_contract: MerchantTemplateContractDetails; + + // OTP device ID. + // This parameter is optional. + otp_id?: string; } export interface MerchantReserveCreateConfirmation { diff --git a/packages/taler-util/src/operation.ts b/packages/taler-util/src/operation.ts index 213bfeecd..a554e1f31 100644 --- a/packages/taler-util/src/operation.ts +++ b/packages/taler-util/src/operation.ts @@ -147,6 +147,32 @@ export function opUnknownFailure(resp: HttpResponse, text: string): never { ); } +/** + * Convenience function to throw an error if the operation is not a success. + */ +export function narrowOpSuccessOrThrow<Body, ErrorEnum>( + opRes: OperationResult<Body, ErrorEnum>, +): asserts opRes is OperationOk<Body> { + const httpResponse = opRes.httpResp; + if (opRes.type !== "ok") { + throw TalerError.fromDetail( + TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR, + { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status, + errorResponse: + "detail" in opRes + ? opRes.detail + : "body" in opRes + ? opRes.body + : undefined, + }, + `Unexpected HTTP status ${httpResponse.status} in response`, + ); + } +} + export type ResultByMethod< TT extends object, p extends keyof TT, |