diff options
author | Florian Dold <florian@dold.me> | 2024-05-16 13:19:17 +0200 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2024-05-16 13:19:23 +0200 |
commit | f0decd3521440d6119ad9333949ce67653d8b2c2 (patch) | |
tree | 7e14203552b811448136802fb00eeccadc04071e /packages/taler-wallet-core | |
parent | 98c188c1b14f73a6b81f41a0cacd6195bb53208e (diff) | |
download | wallet-core-f0decd3521440d6119ad9333949ce67653d8b2c2.tar.xz |
wallet-core: query templates, refactor API declarations
Diffstat (limited to 'packages/taler-wallet-core')
-rw-r--r-- | packages/taler-wallet-core/src/pay-merchant.ts | 55 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/wallet-api-types.ts | 10 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/wallet.ts | 6 |
3 files changed, 64 insertions, 7 deletions
diff --git a/packages/taler-wallet-core/src/pay-merchant.ts b/packages/taler-wallet-core/src/pay-merchant.ts index 4a2ef009a..f08db3a6a 100644 --- a/packages/taler-wallet-core/src/pay-merchant.ts +++ b/packages/taler-wallet-core/src/pay-merchant.ts @@ -34,13 +34,15 @@ import { assertUnreachable, AsyncFlag, checkDbInvariant, + CheckPayTemplateRequest, codecForAbortResponse, codecForMerchantContractTerms, codecForMerchantOrderStatusPaid, codecForMerchantPayResponse, - codecForMerchantPostOrderResponse, + codecForPostOrderResponse, codecForProposal, codecForWalletRefundResponse, + codecForWalletTemplateDetails, CoinDepositPermission, CoinRefreshRequest, ConfirmPayResult, @@ -76,6 +78,7 @@ import { TalerError, TalerErrorCode, TalerErrorDetail, + TalerMerchantApi, TalerPreciseTimestamp, TalerProtocolViolationError, TalerUriAction, @@ -1578,18 +1581,56 @@ async function internalWaitProposalDownloaded( } } +async function downloadTemplate( + wex: WalletExecutionContext, + merchantBaseUrl: string, + templateId: string, +): Promise<TalerMerchantApi.WalletTemplateDetails> { + const reqUrl = new URL(`templates/${templateId}`, merchantBaseUrl); + const httpReq = await wex.http.fetch(reqUrl.href, { + method: "GET", + cancellationToken: wex.cancellationToken, + }); + const resp = await readSuccessResponseJsonOrThrow( + httpReq, + codecForWalletTemplateDetails(), + ); + return resp; +} + +export async function checkPayForTemplate( + wex: WalletExecutionContext, + req: CheckPayTemplateRequest, +): Promise<TalerMerchantApi.WalletTemplateDetails> { + const parsedUri = parsePayTemplateUri(req.talerPayTemplateUri); + if (!parsedUri) { + throw Error("invalid taler-template URI"); + } + return await downloadTemplate( + wex, + parsedUri.merchantBaseUrl, + parsedUri.templateId, + ); +} + export async function preparePayForTemplate( wex: WalletExecutionContext, req: PreparePayTemplateRequest, ): Promise<PreparePayResult> { const parsedUri = parsePayTemplateUri(req.talerPayTemplateUri); - const templateDetails: MerchantUsingTemplateDetails = {}; if (!parsedUri) { throw Error("invalid taler-template URI"); } logger.trace(`parsed URI: ${j2s(parsedUri)}`); + const templateDetails: MerchantUsingTemplateDetails = {}; + + const templateInfo = await downloadTemplate( + wex, + parsedUri.merchantBaseUrl, + parsedUri.templateId, + ); - const amountFromUri = parsedUri.templateParams.amount; + const amountFromUri = templateInfo.editable_defaults?.amount; if (amountFromUri != null) { const templateParamsAmount = req.templateParams?.amount; if (templateParamsAmount != null) { @@ -1605,11 +1646,11 @@ export async function preparePayForTemplate( } } if ( - parsedUri.templateParams.summary !== undefined && - typeof parsedUri.templateParams.summary === "string" + templateInfo.editable_defaults?.summary !== undefined && + typeof templateInfo.editable_defaults?.summary === "string" ) { templateDetails.summary = - req.templateParams?.summary ?? parsedUri.templateParams.summary; + req.templateParams?.summary ?? templateInfo.editable_defaults?.summary; } const reqUrl = new URL( `templates/${parsedUri.templateId}`, @@ -1621,7 +1662,7 @@ export async function preparePayForTemplate( }); const resp = await readSuccessResponseJsonOrThrow( httpReq, - codecForMerchantPostOrderResponse(), + codecForPostOrderResponse(), ); const payUri = stringifyPayUri({ diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts index 6fe2422bc..2a1b7d170 100644 --- a/packages/taler-wallet-core/src/wallet-api-types.ts +++ b/packages/taler-wallet-core/src/wallet-api-types.ts @@ -40,6 +40,7 @@ import { BalancesResponse, CanonicalizeBaseUrlRequest, CanonicalizeBaseUrlResponse, + CheckPayTemplateRequest, CheckPeerPullCreditRequest, CheckPeerPullCreditResponse, CheckPeerPushDebitRequest, @@ -121,6 +122,7 @@ import { StartRefundQueryForUriResponse, StartRefundQueryRequest, StoredBackupList, + TalerMerchantApi, TestPayArgs, TestPayResult, TestingGetDenomStatsRequest, @@ -165,6 +167,7 @@ export enum WalletApiOperation { WithdrawTestBalance = "withdrawTestBalance", PreparePayForUri = "preparePayForUri", SharePayment = "sharePayment", + CheckPayForTemplate = "checkPayForTemplate", PreparePayForTemplate = "preparePayForTemplate", GetContractTermsDetails = "getContractTermsDetails", RunIntegrationTest = "runIntegrationTest", @@ -547,6 +550,12 @@ export type SharePaymentOp = { response: SharePaymentResult; }; +export type CheckPayForTemplateOp = { + op: WalletApiOperation.CheckPayForTemplate; + request: CheckPayTemplateRequest; + response: TalerMerchantApi.WalletTemplateDetails; +}; + /** * Prepare to make a payment based on a taler://pay-template/ URI. */ @@ -1237,6 +1246,7 @@ export type WalletOperations = { [WalletApiOperation.GetVersion]: GetVersionOp; [WalletApiOperation.PreparePayForUri]: PreparePayForUriOp; [WalletApiOperation.SharePayment]: SharePaymentOp; + [WalletApiOperation.CheckPayForTemplate]: CheckPayForTemplateOp; [WalletApiOperation.PreparePayForTemplate]: PreparePayForTemplateOp; [WalletApiOperation.GetContractTermsDetails]: GetContractTermsDetailsOp; [WalletApiOperation.WithdrawTestkudos]: WithdrawTestkudosOp; diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts index 9262904b5..336817be9 100644 --- a/packages/taler-wallet-core/src/wallet.ts +++ b/packages/taler-wallet-core/src/wallet.ts @@ -84,6 +84,7 @@ import { codecForAny, codecForApplyDevExperiment, codecForCanonicalizeBaseUrlRequest, + codecForCheckPayTemplateRequest, codecForCheckPeerPullPaymentRequest, codecForCheckPeerPushDebitRequest, codecForConfirmPayRequest, @@ -229,6 +230,7 @@ import { observeTalerCrypto, } from "./observable-wrappers.js"; import { + checkPayForTemplate, confirmPay, getContractTermsDetails, preparePayForTemplate, @@ -1052,6 +1054,10 @@ async function dispatchRequestInternal( const req = codecForPrepareWithdrawExchangeRequest().decode(payload); return handlePrepareWithdrawExchange(wex, req); } + case WalletApiOperation.CheckPayForTemplate: { + const req = codecForCheckPayTemplateRequest().decode(payload); + return await checkPayForTemplate(wex, req); + } case WalletApiOperation.PreparePayForUri: { const req = codecForPreparePayRequest().decode(payload); return await preparePayForUri(wex, req.talerPayUri); |