summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2024-03-20 00:19:29 -0300
committerSebastian <sebasjm@gmail.com>2024-03-20 00:19:29 -0300
commit62d5a5ef7b1ff9f9c63d9a4eba21620aa8a2fad9 (patch)
tree263bb9db784a64bd77a1c7538407e164c704cb01
parentc09caa5fdca91fb6ded6b2ce8caf1620c0273b80 (diff)
downloadwallet-core-dev/sebasjm/merchant-api.tar.gz
wallet-core-dev/sebasjm/merchant-api.tar.bz2
wallet-core-dev/sebasjm/merchant-api.zip
wip, MerchantRefundResponse is deprecateddev/sebasjm/merchant-api
-rw-r--r--packages/taler-util/src/http-client/merchant.ts359
-rw-r--r--packages/taler-util/src/http-client/types.ts248
-rw-r--r--packages/taler-util/src/taler-types.ts28
-rw-r--r--packages/taler-util/src/taleruri.ts10
4 files changed, 560 insertions, 85 deletions
diff --git a/packages/taler-util/src/http-client/merchant.ts b/packages/taler-util/src/http-client/merchant.ts
index e9fda5075..1cc410191 100644
--- a/packages/taler-util/src/http-client/merchant.ts
+++ b/packages/taler-util/src/http-client/merchant.ts
@@ -25,10 +25,14 @@ import {
codecForAccountsSummaryResponse,
codecForBankAccountEntry,
codecForClaimResponse,
+ codecForInstancesResponse,
codecForInventorySummaryResponse,
codecForMerchantConfig,
codecForMerchantOrderPrivateStatusResponse,
+ codecForMerchantRefundResponse,
codecForOrderHistory,
+ codecForOtpDeviceDetails,
+ codecForOtpDeviceSummaryResponse,
codecForOutOfStockResponse,
codecForPaidRefundStatusResponse,
codecForPaymentResponse,
@@ -38,13 +42,22 @@ import {
codecForStatusGoto,
codecForStatusPaid,
codecForStatusStatusUnpaid,
+ codecForTansferList,
+ codecForTemplateDetails,
+ codecForTemplateSummaryResponse,
+ codecForTokenFamiliesList,
+ codecForTokenFamilyDetails,
codecForWalletRefundResponse,
+ codecForWalletTemplateDetails,
+ codecForWebhookDetails,
+ codecForWebhookSummaryResponse,
opEmptySuccess,
opKnownAlternativeFailure,
opKnownHttpFailure
} from "@gnu-taler/taler-util";
import {
HttpRequestLibrary,
+ HttpResponse,
createPlatformHttpLib,
} from "@gnu-taler/taler-util/http";
import { opSuccessFromHttp, opUnknownFailure } from "../operation.js";
@@ -714,7 +727,10 @@ export class TalerMerchantInstanceHttpClient {
method: "POST",
body,
});
+ return TalerMerchantInstanceHttpClient.procesOrderCreationResponse(resp)
+ }
+ private static async procesOrderCreationResponse(resp: HttpResponse) {
switch (resp.status) {
case HttpStatusCode.Ok:
return opSuccessFromHttp(resp, codecForPostOrderResponse())
@@ -738,9 +754,6 @@ export class TalerMerchantInstanceHttpClient {
if (params.date) {
url.searchParams.set("date_s", String(params.date));
}
- if (params.delta) {
- url.searchParams.set("delta", String(params.delta));
- }
if (params.fulfillmentUrl) {
url.searchParams.set("fulfillment_url", params.fulfillmentUrl);
}
@@ -753,15 +766,13 @@ export class TalerMerchantInstanceHttpClient {
if (params.sessionId) {
url.searchParams.set("session_id", params.sessionId);
}
- if (params.start) {
- url.searchParams.set("start", String(params.start));
- }
if (params.timeout) {
url.searchParams.set("timeout", String(params.timeout));
}
if (params.wired) {
url.searchParams.set("wired", "YES");
}
+ addMerchantPaginationParams(url, params)
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
@@ -824,6 +835,20 @@ export class TalerMerchantInstanceHttpClient {
body,
});
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opEmptySuccess(resp)
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp)
+ case HttpStatusCode.BadRequest:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.Conflict:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -835,6 +860,17 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "DELETE",
});
+
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp)
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.Conflict:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
//
@@ -851,6 +887,21 @@ export class TalerMerchantInstanceHttpClient {
method: "POST",
body,
});
+
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForMerchantRefundResponse())
+ case HttpStatusCode.Forbidden:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.Gone:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.Conflict:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
//
@@ -867,6 +918,17 @@ export class TalerMerchantInstanceHttpClient {
method: "POST",
body,
});
+
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp)
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.Conflict:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -883,22 +945,24 @@ export class TalerMerchantInstanceHttpClient {
if (params.before) {
url.searchParams.set("before", String(params.before));
}
- if (params.limit) {
- url.searchParams.set("limit", String(params.limit));
- }
- if (params.offset) {
- url.searchParams.set("offset", String(params.offset));
- }
if (params.paytoURI) {
url.searchParams.set("payto_uri", params.paytoURI);
}
if (params.verified) {
url.searchParams.set("verified", "YES");
}
+ addMerchantPaginationParams(url, params)
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForTansferList())
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -910,6 +974,17 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "DELETE",
});
+
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp)
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.Conflict:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
//
@@ -926,6 +1001,15 @@ export class TalerMerchantInstanceHttpClient {
method: "POST",
body,
});
+
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp)
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -941,6 +1025,16 @@ export class TalerMerchantInstanceHttpClient {
method: "PATCH",
body,
});
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp)
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.Conflict:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -952,6 +1046,14 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForOtpDeviceSummaryResponse())
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -972,6 +1074,15 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForOtpDeviceDetails())
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -983,6 +1094,14 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "DELETE",
});
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
//
@@ -999,6 +1118,14 @@ export class TalerMerchantInstanceHttpClient {
method: "POST",
body,
});
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1014,6 +1141,16 @@ export class TalerMerchantInstanceHttpClient {
method: "PATCH",
body,
});
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.Conflict:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1025,6 +1162,14 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForTemplateSummaryResponse());
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1036,6 +1181,14 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForTemplateDetails());
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1047,6 +1200,14 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "DELETE",
});
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1058,6 +1219,14 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForWalletTemplateDetails());
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1073,6 +1242,8 @@ export class TalerMerchantInstanceHttpClient {
method: "POST",
body,
});
+
+ return TalerMerchantInstanceHttpClient.procesOrderCreationResponse(resp)
}
//
@@ -1089,6 +1260,16 @@ export class TalerMerchantInstanceHttpClient {
method: "POST",
body,
});
+
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp)
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
+
}
/**
@@ -1104,6 +1285,18 @@ export class TalerMerchantInstanceHttpClient {
method: "PATCH",
body,
});
+
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp)
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.Conflict:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
+
}
/**
@@ -1115,6 +1308,16 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opSuccessFromHttp(resp, codecForWebhookSummaryResponse())
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
+
}
/**
@@ -1126,6 +1329,14 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opSuccessFromHttp(resp, codecForWebhookDetails())
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1137,6 +1348,15 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "DELETE",
});
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
+
}
//
@@ -1153,6 +1373,15 @@ export class TalerMerchantInstanceHttpClient {
method: "POST",
body,
});
+
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1160,7 +1389,7 @@ export class TalerMerchantInstanceHttpClient {
*/
async updateTokenFamily(
tokenSlug: string,
- body: TalerMerchantApi.TokenFamilyCreateRequest,
+ body: TalerMerchantApi.TokenFamilyUpdateRequest,
) {
const url = new URL(`private/tokenfamilies/${tokenSlug}`, this.baseUrl);
@@ -1168,6 +1397,14 @@ export class TalerMerchantInstanceHttpClient {
method: "POST",
body,
});
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForTokenFamilyDetails());
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1179,6 +1416,15 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForTokenFamiliesList());
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1190,6 +1436,15 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForTokenFamilyDetails());
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1201,6 +1456,14 @@ export class TalerMerchantInstanceHttpClient {
const resp = await this.httpLib.fetch(url.href, {
method: "DELETE",
});
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
}
@@ -1232,7 +1495,14 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp
body,
});
- //
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.Conflict:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1248,22 +1518,37 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp
body,
});
- //
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
* https://docs.taler.net/core/api-merchant.html#patch--management-instances-$INSTANCE
*/
async updateInstance(
- isntanceId: string,
+ instanceId: string,
body: TalerMerchantApi.InstanceReconfigurationMessage,
) {
- const url = new URL(`management/instances/${isntanceId}`, this.baseUrl);
+ const url = new URL(`management/instances/${instanceId}`, this.baseUrl);
const resp = await this.httpLib.fetch(url.href, {
method: "PATCH",
body,
});
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1275,6 +1560,13 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForInstancesResponse())
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1287,6 +1579,13 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+
+ switch (resp.status) {
+ case HttpStatusCode.Ok:
+ return opSuccessFromHttp(resp, codecForQueryInstancesResponse())
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1302,6 +1601,18 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp
const resp = await this.httpLib.fetch(url.href, {
method: "DELETE",
});
+ switch (resp.status) {
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.Unauthorized:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.NotFound:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.Conflict:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
/**
@@ -1326,5 +1637,19 @@ export class TalerMerchantManagementHttpClient extends TalerMerchantInstanceHttp
const resp = await this.httpLib.fetch(url.href, {
method: "GET",
});
+ switch (resp.status) {
+ case HttpStatusCode.Accepted:
+ return opSuccessFromHttp(resp, codecForAccountKycRedirects());
+ case HttpStatusCode.NoContent:
+ return opEmptySuccess(resp);
+ case HttpStatusCode.BadGateway:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.ServiceUnavailable:
+ return opKnownHttpFailure(resp.status, resp);
+ case HttpStatusCode.Conflict:
+ return opKnownHttpFailure(resp.status, resp);
+ default:
+ return opUnknownFailure(resp, await resp.text());
+ }
}
}
diff --git a/packages/taler-util/src/http-client/types.ts b/packages/taler-util/src/http-client/types.ts
index 67719ddd9..5fa3d0e7a 100644
--- a/packages/taler-util/src/http-client/types.ts
+++ b/packages/taler-util/src/http-client/types.ts
@@ -21,7 +21,7 @@ import {
codecForInternationalizedString,
codecForLocation,
} from "../taler-types.js";
-import { TalerActionString, codecForTalerActionString } from "../taleruri.js";
+import { TalerUriString, codecForTalerUriString } from "../taleruri.js";
import {
AbsoluteTime,
TalerProtocolDuration,
@@ -68,7 +68,7 @@ export type PaginationParams = {
/**
* order
*/
- order: "asc" | "dec";
+ order?: "asc" | "dec";
};
export type LongPollParams = {
@@ -355,7 +355,7 @@ export const codecForStatusStatusUnpaid =
.property("type", codecForConstString("unpaid"))
.property("already_paid_order_id", codecOptional(codecForString()))
.property("fulfillment_url", codecOptional(codecForString()))
- .property("taler_pay_uri", codecForString())
+ .property("taler_pay_uri", codecForTalerUriString())
.build("TalerMerchantApi.PaymentResponse");
export const codecForPaidRefundStatusResponse =
@@ -679,7 +679,7 @@ export const codecForCheckPaymentUnpaidResponse =
(): Codec<TalerMerchantApi.CheckPaymentUnpaidResponse> =>
buildCodecForObject<TalerMerchantApi.CheckPaymentUnpaidResponse>()
.property("order_status", codecForConstString("unpaid"))
- .property("taler_pay_uri", codecForString())
+ .property("taler_pay_uri", codecForTalerUriString())
.property("creation_time", codecForTimestamp)
.property("summary", codecForString())
.property("total_amount", codecForAmountString())
@@ -735,6 +735,175 @@ export const codecForTransactionWireReport =
.property("coin_pub", codecForString())
.build("TalerMerchantApi.TransactionWireReport");
+export const codecForMerchantRefundResponse =
+ (): Codec<TalerMerchantApi.MerchantRefundResponse> =>
+ buildCodecForObject<TalerMerchantApi.MerchantRefundResponse>()
+ .property("taler_refund_uri", codecForTalerUriString())
+ .property("h_contract", codecForString())
+ .build("TalerMerchantApi.MerchantRefundResponse");
+
+export const codecForTansferList =
+ (): Codec<TalerMerchantApi.TransferList> =>
+ buildCodecForObject<TalerMerchantApi.TransferList>()
+ .property("transfers", codecForList(codecForTransferDetails()))
+ .build("TalerMerchantApi.TransferList");
+
+export const codecForTransferDetails =
+ (): Codec<TalerMerchantApi.TransferDetails> =>
+ buildCodecForObject<TalerMerchantApi.TransferDetails>()
+ .property("credit_amount", codecForAmountString())
+ .property("wtid", codecForString())
+ .property("payto_uri", codecForPaytoString())
+ .property("exchange_url", codecForURL())
+ .property("transfer_serial_id", codecForNumber())
+ .property("execution_time", codecForTimestamp)
+ .property("verified", codecOptional(codecForBoolean()))
+ .property("confirmed", codecOptional(codecForBoolean()))
+ .build("TalerMerchantApi.TransferDetails");
+
+export const codecForOtpDeviceSummaryResponse =
+ (): Codec<TalerMerchantApi.OtpDeviceSummaryResponse> =>
+ buildCodecForObject<TalerMerchantApi.OtpDeviceSummaryResponse>()
+ .property("otp_devices", codecForList(codecForOtpDeviceEntry()))
+ .build("TalerMerchantApi.OtpDeviceSummaryResponse");
+
+export const codecForOtpDeviceEntry =
+ (): Codec<TalerMerchantApi.OtpDeviceEntry> =>
+ buildCodecForObject<TalerMerchantApi.OtpDeviceEntry>()
+ .property("otp_device_id", codecForString())
+ .property("device_description", codecForString())
+ .build("TalerMerchantApi.OtpDeviceEntry");
+
+export const codecForOtpDeviceDetails =
+ (): Codec<TalerMerchantApi.OtpDeviceDetails> =>
+ buildCodecForObject<TalerMerchantApi.OtpDeviceDetails>()
+ .property("device_description", codecForString())
+ .property("otp_algorithm", codecForNumber())
+ .property("otp_ctr", codecOptional(codecForNumber()))
+ .property("otp_timestamp", codecForNumber())
+ .property("otp_code", codecOptional(codecForString()))
+ .build("TalerMerchantApi.OtpDeviceDetails");
+
+
+export const codecForTemplateSummaryResponse =
+ (): Codec<TalerMerchantApi.TemplateSummaryResponse> =>
+ buildCodecForObject<TalerMerchantApi.TemplateSummaryResponse>()
+ .property("templates_list", codecForList(codecForTemplateEntry()))
+ .build("TalerMerchantApi.TemplateSummaryResponse");
+
+export const codecForTemplateEntry =
+ (): Codec<TalerMerchantApi.TemplateEntry> =>
+ buildCodecForObject<TalerMerchantApi.TemplateEntry>()
+ .property("template_id", codecForString())
+ .property("template_description", codecForString())
+ .build("TalerMerchantApi.TemplateEntry");
+
+export const codecForTemplateDetails =
+ (): Codec<TalerMerchantApi.TemplateDetails> =>
+ buildCodecForObject<TalerMerchantApi.TemplateDetails>()
+ .property("template_description", codecForString())
+ .property("otp_id", codecOptional(codecForString()))
+ .property("template_contract", codecForTemplateContractDetails())
+ .build("TalerMerchantApi.TemplateDetails");
+
+export const codecForTemplateContractDetails =
+ (): Codec<TalerMerchantApi.TemplateContractDetails> =>
+ buildCodecForObject<TalerMerchantApi.TemplateContractDetails>()
+ .property("summary", codecOptional(codecForString()))
+ .property("currency", codecOptional(codecForString()))
+ .property("amount", codecOptional(codecForAmountString()))
+ .property("minimum_age", codecForNumber())
+ .property("pay_duration", codecForDuration)
+ .build("TalerMerchantApi.TemplateContractDetails");
+
+export const codecForWalletTemplateDetails =
+ (): Codec<TalerMerchantApi.WalletTemplateDetails> =>
+ buildCodecForObject<TalerMerchantApi.WalletTemplateDetails>()
+ .property("template_contract", codecForTemplateContractDetails())
+ .build("TalerMerchantApi.WalletTemplateDetails");
+
+
+export const codecForWebhookSummaryResponse =
+ (): Codec<TalerMerchantApi.WebhookSummaryResponse> =>
+ buildCodecForObject<TalerMerchantApi.WebhookSummaryResponse>()
+ .property("webhooks", codecForList(codecForWebhookEntry()))
+ .build("TalerMerchantApi.WebhookSummaryResponse");
+
+export const codecForWebhookEntry =
+ (): Codec<TalerMerchantApi.WebhookEntry> =>
+ buildCodecForObject<TalerMerchantApi.WebhookEntry>()
+ .property("webhook_id", codecForString())
+ .property("event_type", codecForString())
+ .build("TalerMerchantApi.WebhookEntry");
+
+export const codecForWebhookDetails =
+ (): Codec<TalerMerchantApi.WebhookDetails> =>
+ buildCodecForObject<TalerMerchantApi.WebhookDetails>()
+ .property("event_type", codecForString())
+ .property("url", codecForString())
+ .property("http_method", codecForString())
+ .property("header_template", codecOptional(codecForString()))
+ .property("body_template", codecOptional(codecForString()))
+ .build("TalerMerchantApi.WebhookDetails");
+
+export const codecForTokenFamilyKind =
+ (): Codec<TalerMerchantApi.TokenFamilyKind> =>
+ codecForEither(
+ codecForConstString("discount"),
+ codecForConstString("subscription"),
+ ) as any //FIXME: create a codecForEnum
+ ;
+export const codecForTokenFamilyDetails =
+ (): Codec<TalerMerchantApi.TokenFamilyDetails> =>
+ buildCodecForObject<TalerMerchantApi.TokenFamilyDetails>()
+ .property("slug", codecForString())
+ .property("name", codecForString())
+ .property("description", codecForString())
+ .property("description_i18n", (codecForInternationalizedString()))
+ .property("valid_after", (codecForTimestamp))
+ .property("valid_before", (codecForTimestamp))
+ .property("duration", (codecForDuration))
+ .property("kind", codecForTokenFamilyKind())
+ .property("issued", (codecForNumber()))
+ .property("redeemed", (codecForNumber()))
+ .build("TalerMerchantApi.TokenFamilyDetails");
+
+export const codecForTokenFamiliesList =
+ (): Codec<TalerMerchantApi.TokenFamiliesList> =>
+ buildCodecForObject<TalerMerchantApi.TokenFamiliesList>()
+ .property("token_families", codecForList(codecForTokenFamilySummary()))
+ .build("TalerMerchantApi.TokenFamiliesList");
+
+export const codecForTokenFamilySummary =
+ (): Codec<TalerMerchantApi.TokenFamilySummary> =>
+ buildCodecForObject<TalerMerchantApi.TokenFamilySummary>()
+ .property("slug", codecForString())
+ .property("name", codecForString())
+ .property("valid_after", codecForTimestamp)
+ .property("valid_before", codecForTimestamp)
+ .property("kind", codecForTokenFamilyKind())
+ .build("TalerMerchantApi.TokenFamilySummary");
+
+
+export const codecForInstancesResponse =
+ (): Codec<TalerMerchantApi.InstancesResponse> =>
+ buildCodecForObject<TalerMerchantApi.InstancesResponse>()
+ .property("instances", codecForList(codecForInstance()))
+ .build("TalerMerchantApi.InstancesResponse");
+
+export const codecForInstance =
+ (): Codec<TalerMerchantApi.Instance> =>
+ buildCodecForObject<TalerMerchantApi.Instance>()
+ .property("name", codecForString())
+ .property("user_type", codecForString())
+ .property("website", codecOptional(codecForString()))
+ .property("logo", codecOptional(codecForString()))
+ .property("id", codecForString())
+ .property("merchant_pub", codecForString())
+ .property("payment_targets", codecForList(codecForString()))
+ .property("deleted", codecForBoolean())
+ .build("TalerMerchantApi.Instance");
+
export const codecForExchangeConfig =
(): Codec<TalerExchangeApi.ExchangeVersionResponse> =>
buildCodecForObject<TalerExchangeApi.ExchangeVersionResponse>()
@@ -891,7 +1060,7 @@ export const codecForRegisterAccountResponse =
export const codecForBankAccountCreateWithdrawalResponse =
(): Codec<TalerCorebankApi.BankAccountCreateWithdrawalResponse> =>
buildCodecForObject<TalerCorebankApi.BankAccountCreateWithdrawalResponse>()
- .property("taler_withdraw_uri", codecForTalerActionString())
+ .property("taler_withdraw_uri", codecForTalerUriString())
.property("withdrawal_id", codecForString())
.build("TalerCorebankApi.BankAccountCreateWithdrawalResponse");
@@ -1810,7 +1979,7 @@ export namespace TalerCorebankApi {
withdrawal_id: string;
// URI that can be passed to the wallet to initiate the withdrawal.
- taler_withdraw_uri: TalerActionString;
+ taler_withdraw_uri: TalerUriString;
}
export interface WithdrawalPublicInfo {
// Current status of the operation
@@ -2989,9 +3158,10 @@ export namespace TalerMerchantApi {
// execution time. Default is -20.
limit?: number;
// Starting transfer_serial_id for an iteration.
- offset?: number;
+ offset?: string;
// Filter transfers by verification status.
verified?: boolean;
+ order?: "asc" | "dec";
}
export interface ListOrdersRequestParams {
// If set to yes, only return paid orders, if no only
@@ -3007,19 +3177,17 @@ export namespace TalerMerchantApi {
// use “all”) to see all orders regardless of wire transfer
// status.
wired?: boolean;
- // takes value of the form N (-N), so that at most N values
- // strictly older (younger) than start and date_s are returned.
- // Defaults to -20 to return the last 20 entries (before start
- // and/or date_s).
- delta?: number;
+ // At most return the given number of results. Negative
+ // for descending by row ID, positive for ascending by
+ // row ID. Default is 20. Since protocol v12.
+ limit?: number;
// Non-negative date in seconds after the UNIX Epoc, see delta
// for its interpretation. If not specified, we default to the
// oldest or most recent entry, depending on delta.
date?: AbsoluteTime;
- // Row number threshold, see delta for its interpretation.
- // Defaults to INT64_MAX, namely the biggest row id possible in
- // the database.
- start?: number;
+ // Starting product_serial_id for an iteration.
+ // Since protocol v12.
+ offset?: string;
// Timeout in milliseconds to wait for additional orders if the
// answer would otherwise be negative (long polling). Only useful
// if delta is positive. Note that the merchant MAY still return
@@ -3029,6 +3197,8 @@ export namespace TalerMerchantApi {
sessionId?: string;
// Since protocol v6. Filters by fulfillment URL.
fulfillmentUrl?: string;
+
+ order?: "asc" | "dec";
}
export interface PayRequest {
@@ -3417,12 +3587,12 @@ export namespace TalerMerchantApi {
default_pay_delay: RelativeTime;
}
- interface InstancesResponse {
+ export interface InstancesResponse {
// List of instances that are present in the backend (see Instance).
instances: Instance[];
}
- interface Instance {
+ export interface Instance {
// Merchant name corresponding to this instance.
name: string;
@@ -4046,7 +4216,7 @@ export namespace TalerMerchantApi {
// Human-readable refund justification.
reason: string;
}
- interface MerchantRefundResponse {
+ export interface MerchantRefundResponse {
// URL (handled by the backend) that the wallet should access to
// trigger refund processing.
// taler://refund/...
@@ -4071,11 +4241,11 @@ export namespace TalerMerchantApi {
exchange_url: string;
}
- interface TransferList {
+ export interface TransferList {
// List of all the transfers that fit the filter that we know.
transfers: TransferDetails[];
}
- interface TransferDetails {
+ export interface TransferDetails {
// How much was wired to the merchant (minus fees).
credit_amount: AmountString;
@@ -4318,11 +4488,11 @@ export namespace TalerMerchantApi {
otp_ctr?: Integer;
}
- interface OtpDeviceSummaryResponse {
+ export interface OtpDeviceSummaryResponse {
// Array of devices that are present in our backend.
otp_devices: OtpDeviceEntry[];
}
- interface OtpDeviceEntry {
+ export interface OtpDeviceEntry {
// Device identifier.
otp_device_id: string;
@@ -4330,7 +4500,7 @@ export namespace TalerMerchantApi {
device_description: string;
}
- interface OtpDeviceDetails {
+ export interface OtpDeviceDetails {
// Human-readable description for the device.
device_description: string;
@@ -4392,7 +4562,7 @@ export namespace TalerMerchantApi {
// Additional information in a separate template.
template_contract: TemplateContractDetails;
}
- interface TemplateContractDetails {
+ export interface TemplateContractDetails {
// Human-readable summary for the template.
summary?: string;
@@ -4426,19 +4596,27 @@ export namespace TalerMerchantApi {
template_contract: TemplateContractDetails;
}
- interface TemplateSummaryResponse {
+ export interface TemplateSummaryResponse {
// List of templates that are present in our backend.
templates_list: TemplateEntry[];
}
- interface TemplateEntry {
+ export interface TemplateEntry {
// Template identifier, as found in the template.
template_id: string;
// Human-readable description for the template.
template_description: string;
}
- interface TemplateDetails {
+
+ export interface WalletTemplateDetails {
+
+ // Hard-coded information about the contrac terms
+ // for this template.
+ template_contract: TemplateContractDetails;
+ }
+
+ export interface TemplateDetails {
// Human-readable description for the template.
template_description: string;
@@ -4494,12 +4672,12 @@ export namespace TalerMerchantApi {
body_template?: string;
}
- interface WebhookSummaryResponse {
+ export interface WebhookSummaryResponse {
// Return webhooks that are present in our backend.
webhooks: WebhookEntry[];
}
- interface WebhookEntry {
+ export interface WebhookEntry {
// Webhook identifier, as found in the webhook.
webhook_id: string;
@@ -4507,7 +4685,7 @@ export namespace TalerMerchantApi {
event_type: string;
}
- interface WebhookDetails {
+ export interface WebhookDetails {
// The event of the webhook: why the webhook is used.
event_type: string;
@@ -4552,7 +4730,7 @@ export namespace TalerMerchantApi {
kind: TokenFamilyKind;
}
- enum TokenFamilyKind {
+ export enum TokenFamilyKind {
Discount = "discount",
Subscription = "subscription",
}
@@ -4577,12 +4755,12 @@ export namespace TalerMerchantApi {
duration: RelativeTime;
}
- interface TokenFamiliesList {
+ export interface TokenFamiliesList {
// All configured token families of this instance.
token_families: TokenFamilySummary[];
}
- interface TokenFamilySummary {
+ export interface TokenFamilySummary {
// Identifier for the token family consisting of unreserved characters
// according to RFC 3986.
slug: string;
@@ -4600,7 +4778,7 @@ export namespace TalerMerchantApi {
kind: TokenFamilyKind;
}
- interface TokenFamilyDetails {
+ export interface TokenFamilyDetails {
// Identifier for the token family consisting of unreserved characters
// according to RFC 3986.
slug: string;
diff --git a/packages/taler-util/src/taler-types.ts b/packages/taler-util/src/taler-types.ts
index 7a386b108..bad9186dc 100644
--- a/packages/taler-util/src/taler-types.ts
+++ b/packages/taler-util/src/taler-types.ts
@@ -617,26 +617,6 @@ export interface MerchantAbortPayRefundDetails {
exchange_http_status: number;
}
-/**
- * Response for a refund pickup or a /pay in abort mode.
- */
-export interface MerchantRefundResponse {
- /**
- * Public key of the merchant
- */
- merchant_pub: string;
-
- /**
- * Contract terms hash of the contract that
- * is being refunded.
- */
- h_contract_terms: string;
-
- /**
- * The signed refund permissions, to be sent to the exchange.
- */
- refunds: MerchantAbortPayRefundDetails[];
-}
/**
* Planchet detail sent to the merchant.
@@ -1471,14 +1451,6 @@ export const codecForMerchantRefundPermission =
.property("exchange_pub", codecOptional(codecForString()))
.build("MerchantRefundPermission");
-export const codecForMerchantRefundResponse =
- (): Codec<MerchantRefundResponse> =>
- buildCodecForObject<MerchantRefundResponse>()
- .property("merchant_pub", codecForString())
- .property("h_contract_terms", codecForString())
- .property("refunds", codecForList(codecForMerchantRefundPermission()))
- .build("MerchantRefundResponse");
-
export const codecForBlindSigWrapperV2 = (): Codec<MerchantBlindSigWrapperV2> =>
buildCodecForObject<MerchantBlindSigWrapperV2>()
.property("blind_sig", codecForBlindedDenominationSignature())
diff --git a/packages/taler-util/src/taleruri.ts b/packages/taler-util/src/taleruri.ts
index 4a8647d21..97b82c061 100644
--- a/packages/taler-util/src/taleruri.ts
+++ b/packages/taler-util/src/taleruri.ts
@@ -43,11 +43,11 @@ export type TalerUri =
| WithdrawExchangeUri;
declare const __action_str: unique symbol;
-export type TalerActionString = string & { [__action_str]: true };
+export type TalerUriString = string & { [__action_str]: true };
-export function codecForTalerActionString(): Codec<TalerActionString> {
+export function codecForTalerUriString(): Codec<TalerUriString> {
return {
- decode(x: any, c?: Context): TalerActionString {
+ decode(x: any, c?: Context): TalerUriString {
if (typeof x !== "string") {
throw new DecodingError(
`expected string at ${renderContext(c)} but got ${typeof x}`,
@@ -55,10 +55,10 @@ export function codecForTalerActionString(): Codec<TalerActionString> {
}
if (parseTalerUri(x) === undefined) {
throw new DecodingError(
- `invalid taler action at ${renderContext(c)} but got "${x}"`,
+ `invalid taler URI at ${renderContext(c)} but got "${x}"`,
);
}
- return x as TalerActionString;
+ return x as TalerUriString;
},
};
}