From 62d5a5ef7b1ff9f9c63d9a4eba21620aa8a2fad9 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 20 Mar 2024 00:19:29 -0300 Subject: wip, MerchantRefundResponse is deprecated --- packages/taler-util/src/http-client/merchant.ts | 359 ++++++++++++++++++++++-- packages/taler-util/src/http-client/types.ts | 248 +++++++++++++--- packages/taler-util/src/taler-types.ts | 28 -- packages/taler-util/src/taleruri.ts | 10 +- 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 => buildCodecForObject() .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 => + buildCodecForObject() + .property("taler_refund_uri", codecForTalerUriString()) + .property("h_contract", codecForString()) + .build("TalerMerchantApi.MerchantRefundResponse"); + +export const codecForTansferList = + (): Codec => + buildCodecForObject() + .property("transfers", codecForList(codecForTransferDetails())) + .build("TalerMerchantApi.TransferList"); + +export const codecForTransferDetails = + (): Codec => + buildCodecForObject() + .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 => + buildCodecForObject() + .property("otp_devices", codecForList(codecForOtpDeviceEntry())) + .build("TalerMerchantApi.OtpDeviceSummaryResponse"); + +export const codecForOtpDeviceEntry = + (): Codec => + buildCodecForObject() + .property("otp_device_id", codecForString()) + .property("device_description", codecForString()) + .build("TalerMerchantApi.OtpDeviceEntry"); + +export const codecForOtpDeviceDetails = + (): Codec => + buildCodecForObject() + .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 => + buildCodecForObject() + .property("templates_list", codecForList(codecForTemplateEntry())) + .build("TalerMerchantApi.TemplateSummaryResponse"); + +export const codecForTemplateEntry = + (): Codec => + buildCodecForObject() + .property("template_id", codecForString()) + .property("template_description", codecForString()) + .build("TalerMerchantApi.TemplateEntry"); + +export const codecForTemplateDetails = + (): Codec => + buildCodecForObject() + .property("template_description", codecForString()) + .property("otp_id", codecOptional(codecForString())) + .property("template_contract", codecForTemplateContractDetails()) + .build("TalerMerchantApi.TemplateDetails"); + +export const codecForTemplateContractDetails = + (): Codec => + buildCodecForObject() + .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 => + buildCodecForObject() + .property("template_contract", codecForTemplateContractDetails()) + .build("TalerMerchantApi.WalletTemplateDetails"); + + +export const codecForWebhookSummaryResponse = + (): Codec => + buildCodecForObject() + .property("webhooks", codecForList(codecForWebhookEntry())) + .build("TalerMerchantApi.WebhookSummaryResponse"); + +export const codecForWebhookEntry = + (): Codec => + buildCodecForObject() + .property("webhook_id", codecForString()) + .property("event_type", codecForString()) + .build("TalerMerchantApi.WebhookEntry"); + +export const codecForWebhookDetails = + (): Codec => + buildCodecForObject() + .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 => + codecForEither( + codecForConstString("discount"), + codecForConstString("subscription"), + ) as any //FIXME: create a codecForEnum + ; +export const codecForTokenFamilyDetails = + (): Codec => + buildCodecForObject() + .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 => + buildCodecForObject() + .property("token_families", codecForList(codecForTokenFamilySummary())) + .build("TalerMerchantApi.TokenFamiliesList"); + +export const codecForTokenFamilySummary = + (): Codec => + buildCodecForObject() + .property("slug", codecForString()) + .property("name", codecForString()) + .property("valid_after", codecForTimestamp) + .property("valid_before", codecForTimestamp) + .property("kind", codecForTokenFamilyKind()) + .build("TalerMerchantApi.TokenFamilySummary"); + + +export const codecForInstancesResponse = + (): Codec => + buildCodecForObject() + .property("instances", codecForList(codecForInstance())) + .build("TalerMerchantApi.InstancesResponse"); + +export const codecForInstance = + (): Codec => + buildCodecForObject() + .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 => buildCodecForObject() @@ -891,7 +1060,7 @@ export const codecForRegisterAccountResponse = export const codecForBankAccountCreateWithdrawalResponse = (): Codec => buildCodecForObject() - .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 => - buildCodecForObject() - .property("merchant_pub", codecForString()) - .property("h_contract_terms", codecForString()) - .property("refunds", codecForList(codecForMerchantRefundPermission())) - .build("MerchantRefundResponse"); - export const codecForBlindSigWrapperV2 = (): Codec => buildCodecForObject() .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 { +export function codecForTalerUriString(): Codec { 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 { } 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; }, }; } -- cgit v1.2.3