aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2023-02-11 14:24:29 +0100
committerFlorian Dold <florian@dold.me>2023-02-11 14:24:29 +0100
commit04ab9f37801f6a42b85581cc79667239d3fc79e5 (patch)
tree7f5841f5a872a6374251137b75a17d00a258740e /packages/taler-wallet-core
parenta9073a67971e56dc58e8633d10c5e0c7c3920c8a (diff)
downloadwallet-core-04ab9f37801f6a42b85581cc79667239d3fc79e5.tar.xz
wallet-core,harness: implement pay templating
Diffstat (limited to 'packages/taler-wallet-core')
-rw-r--r--packages/taler-wallet-core/src/wallet-api-types.ts14
-rw-r--r--packages/taler-wallet-core/src/wallet.ts56
2 files changed, 61 insertions, 9 deletions
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<Op extends WalletApiOperation>(
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<Op extends WalletApiOperation>(
case WalletApiOperation.GetVersion: {
return getVersion(ws);
}
+ //default:
+ // assertUnreachable(operation);
}
throw TalerError.fromDetail(
TalerErrorCode.WALLET_CORE_API_OPERATION_UNKNOWN,