From 04ab9f37801f6a42b85581cc79667239d3fc79e5 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Sat, 11 Feb 2023 14:24:29 +0100 Subject: wallet-core,harness: implement pay templating --- packages/taler-wallet-core/src/wallet-api-types.ts | 14 +++++- packages/taler-wallet-core/src/wallet.ts | 56 ++++++++++++++++++---- 2 files changed, 61 insertions(+), 9 deletions(-) (limited to 'packages/taler-wallet-core') diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts index 61d1417f9..da57253a0 100644 --- a/packages/taler-wallet-core/src/wallet-api-types.ts +++ b/packages/taler-wallet-core/src/wallet-api-types.ts @@ -78,6 +78,7 @@ import { PrepareDepositResponse, PreparePayRequest, PreparePayResult, + PreparePayTemplateRequest, PreparePeerPullPaymentRequest, PreparePeerPullPaymentResponse, PreparePeerPushPaymentRequest, @@ -126,6 +127,7 @@ export enum WalletApiOperation { WithdrawTestkudos = "withdrawTestkudos", WithdrawTestBalance = "withdrawTestBalance", PreparePayForUri = "preparePayForUri", + PreparePayForTemplate = "preparePayForTemplate", GetContractTermsDetails = "getContractTermsDetails", RunIntegrationTest = "runIntegrationTest", TestCrypto = "testCrypto", @@ -313,7 +315,7 @@ export type AcceptManualWithdrawalOp = { // group: Merchant Payments /** - * Prepare to make a payment + * Prepare to make a payment based on a taler://pay/ URI. */ export type PreparePayForUriOp = { op: WalletApiOperation.PreparePayForUri; @@ -321,6 +323,15 @@ export type PreparePayForUriOp = { response: PreparePayResult; }; +/** + * Prepare to make a payment based on a taler://pay-template/ URI. + */ +export type PreparePayForTemplateOp = { + op: WalletApiOperation.PreparePayForTemplate; + request: PreparePayTemplateRequest; + response: PreparePayResult; +}; + export type GetContractTermsDetailsOp = { op: WalletApiOperation.GetContractTermsDetails; request: GetContractTermsDetailsRequest; @@ -835,6 +846,7 @@ export type WalletOperations = { [WalletApiOperation.GetVersion]: GetVersionOp; [WalletApiOperation.WithdrawFakebank]: WithdrawFakebankOp; [WalletApiOperation.PreparePayForUri]: PreparePayForUriOp; + [WalletApiOperation.PreparePayForTemplate]: PreparePayForTemplateOp; [WalletApiOperation.GetContractTermsDetails]: GetContractTermsDetailsOp; [WalletApiOperation.WithdrawTestkudos]: WithdrawTestkudosOp; [WalletApiOperation.ConfirmPay]: ConfirmPayOp; diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts index f1ed592bd..57ae85c1c 100644 --- a/packages/taler-wallet-core/src/wallet.ts +++ b/packages/taler-wallet-core/src/wallet.ts @@ -56,8 +56,10 @@ import { codecForInitiatePeerPushPaymentRequest, codecForIntegrationTestArgs, codecForListKnownBankAccounts, + codecForMerchantPostOrderResponse, codecForPrepareDepositRequest, codecForPreparePayRequest, + codecForPreparePayTemplateRequest, codecForPreparePeerPullPaymentRequest, codecForPreparePeerPushPaymentRequest, codecForPrepareRefundRequest, @@ -77,6 +79,7 @@ import { CoinDumpJson, CoinRefreshRequest, CoinStatus, + constructPayUri, CoreApiResponse, DenominationInfo, DenomOperationMap, @@ -88,7 +91,6 @@ import { ExchangesListResponse, ExchangeTosStatusDetails, FeeDescription, - GetBalanceDetailRequest, GetExchangeTosResult, InitResponse, j2s, @@ -96,7 +98,9 @@ import { KnownBankAccountsInfo, Logger, ManualWithdrawalDetails, + MerchantUsingTemplateDetails, NotificationType, + parsePayTemplateUri, parsePaytoUri, RefreshReason, TalerErrorCode, @@ -156,11 +160,7 @@ import { runBackupCycle, } from "./operations/backup/index.js"; import { setWalletDeviceId } from "./operations/backup/state.js"; -import { - getBalanceDetail, - getBalances, - getMerchantPaymentBalanceDetails, -} from "./operations/balance.js"; +import { getBalanceDetail, getBalances } from "./operations/balance.js"; import { getExchangeTosStatus, makeExchangeListItem, @@ -186,7 +186,6 @@ import { } from "./operations/exchanges.js"; import { getMerchantInfo } from "./operations/merchants.js"; import { - abortPay as abortPay, applyRefund, applyRefundFromPurchaseId, confirmPay, @@ -1171,11 +1170,50 @@ async function dispatchRequestInternal( await runPending(ws, true); return {}; } - // FIXME: Deprecate one of the aliases! case WalletApiOperation.PreparePayForUri: { const req = codecForPreparePayRequest().decode(payload); return await preparePayForUri(ws, req.talerPayUri); } + case WalletApiOperation.PreparePayForTemplate: { + const req = codecForPreparePayTemplateRequest().decode(payload); + const url = parsePayTemplateUri(req.talerPayTemplateUri); + const templateDetails: MerchantUsingTemplateDetails = {}; + if (!url) { + throw Error("invalid taler-template URI"); + } + if ( + url.templateParams.amount && + typeof url.templateParams.amount === "string" + ) { + templateDetails.amount = + req.templateParams.amount ?? url.templateParams.amount; + } + if ( + url.templateParams.summary && + typeof url.templateParams.summary === "string" + ) { + templateDetails.summary = + req.templateParams.summary ?? url.templateParams.summary; + } + const reqUrl = new URL( + `templates/${url.templateId}`, + url.merchantBaseUrl, + ); + const httpReq = await ws.http.postJson(reqUrl.href, templateDetails); + const resp = await readSuccessResponseJsonOrThrow( + httpReq, + codecForMerchantPostOrderResponse(), + ); + + const payUri = constructPayUri( + url.merchantBaseUrl, + resp.order_id, + "", + resp.token, + ); + + return await preparePayForUri(ws, payUri); + } case WalletApiOperation.ConfirmPay: { const req = codecForConfirmPayRequest().decode(payload); return await confirmPay(ws, req.proposalId, req.sessionId); @@ -1434,6 +1472,8 @@ async function dispatchRequestInternal( case WalletApiOperation.GetVersion: { return getVersion(ws); } + //default: + // assertUnreachable(operation); } throw TalerError.fromDetail( TalerErrorCode.WALLET_CORE_API_OPERATION_UNKNOWN, -- cgit v1.2.3