aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-util
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2024-01-30 22:25:54 +0100
committerFlorian Dold <florian@dold.me>2024-01-30 22:25:54 +0100
commitc5f97c8f493b52f9e083548d0ac71592c56a2b79 (patch)
treed45ed40257d77880157a61919140d6e972bc60f1 /packages/taler-util
parentd4429ff5acac01c5a7ef32efa3b3f2402627a71a (diff)
downloadwallet-core-c5f97c8f493b52f9e083548d0ac71592c56a2b79.tar.xz
harness: work on otp test
Diffstat (limited to 'packages/taler-util')
-rw-r--r--packages/taler-util/src/MerchantApiClient.ts29
-rw-r--r--packages/taler-util/src/merchant-api-types.ts38
-rw-r--r--packages/taler-util/src/operation.ts26
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,