From dc016078a976e24886173dd81a028b8b3d89a1e2 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 6 Dec 2023 18:39:41 +0100 Subject: wallet-core: implement getExchangeEntryByUrl --- packages/taler-wallet-core/src/wallet-api-types.ts | 13 +++++++++ packages/taler-wallet-core/src/wallet.ts | 34 ++++++++++++++++++++++ 2 files changed, 47 insertions(+) (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 375bc3eac..f1a4d5acf 100644 --- a/packages/taler-wallet-core/src/wallet-api-types.ts +++ b/packages/taler-wallet-core/src/wallet-api-types.ts @@ -64,6 +64,8 @@ import { GetContractTermsDetailsRequest, GetCurrencySpecificationRequest, GetCurrencySpecificationResponse, + GetExchangeEntryByUrlRequest, + GetExchangeEntryByUrlResponse, GetExchangeTosRequest, GetExchangeTosResult, GetPlanForOperationRequest, @@ -152,6 +154,7 @@ export enum WalletApiOperation { GetTransactionById = "getTransactionById", TestingGetSampleTransactions = "testingGetSampleTransactions", ListExchanges = "listExchanges", + GetExchangeEntryByUrl = "getExchangeEntryByUrl", ListKnownBankAccounts = "listKnownBankAccounts", AddKnownBankAccounts = "addKnownBankAccounts", ForgetKnownBankAccounts = "forgetKnownBankAccounts", @@ -633,6 +636,15 @@ export type GetExchangeDetailedInfoOp = { response: ExchangeDetailedResponse; }; +/** + * Get the current terms of a service of an exchange. + */ +export type GetExchangeEntryByUrlOp = { + op: WalletApiOperation.GetExchangeEntryByUrl; + request: GetExchangeEntryByUrlRequest; + response: GetExchangeEntryByUrlResponse; +}; + /** * List currencies known to the wallet. */ @@ -1127,6 +1139,7 @@ export type WalletOperations = { [WalletApiOperation.SetExchangeTosAccepted]: SetExchangeTosAcceptedOp; [WalletApiOperation.GetExchangeTos]: GetExchangeTosOp; [WalletApiOperation.GetExchangeDetailedInfo]: GetExchangeDetailedInfoOp; + [WalletApiOperation.GetExchangeEntryByUrl]: GetExchangeEntryByUrlOp; [WalletApiOperation.PrepareDeposit]: PrepareDepositOp; [WalletApiOperation.GenerateDepositGroupTxId]: GenerateDepositGroupTxIdOp; [WalletApiOperation.CreateDepositGroup]: CreateDepositGroupOp; diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts index bccdf721f..e5e179937 100644 --- a/packages/taler-wallet-core/src/wallet.ts +++ b/packages/taler-wallet-core/src/wallet.ts @@ -42,6 +42,7 @@ import { ExchangesShortListResponse, FeeDescription, GetCurrencySpecificationResponse, + GetExchangeEntryByUrlResponse, GetExchangeTosResult, InitResponse, KnownBankAccounts, @@ -89,6 +90,7 @@ import { codecForGetBalanceDetailRequest, codecForGetContractTermsDetails, codecForGetCurrencyInfoRequest, + codecForGetExchangeEntryByUrlRequest, codecForGetExchangeTosRequest, codecForGetWithdrawalDetailsForAmountRequest, codecForGetWithdrawalDetailsForUri, @@ -1148,6 +1150,38 @@ async function dispatchRequestInternal( case WalletApiOperation.ListExchanges: { return await getExchanges(ws); } + case WalletApiOperation.GetExchangeEntryByUrl: { + const req = codecForGetExchangeEntryByUrlRequest().decode(payload); + const exchangeEntry = await ws.db + .mktx((x) => [ + x.exchanges, + x.exchangeDetails, + x.denominations, + x.operationRetries, + ]) + .runReadOnly(async (tx) => { + const exchangeRec = await tx.exchanges.get(req.exchangeBaseUrl); + if (!exchangeRec) { + throw Error("exchange not found"); + } + const exchangeDetails = await getExchangeDetails( + tx, + exchangeRec.baseUrl, + ); + const opRetryRecord = await tx.operationRetries.get( + TaskIdentifiers.forExchangeUpdate(exchangeRec), + ); + return makeExchangeListItem( + exchangeRec, + exchangeDetails, + opRetryRecord?.lastError, + ); + }); + const result: GetExchangeEntryByUrlResponse = { + exchangeEntry, + }; + return result; + } case WalletApiOperation.ListExchangesForScopedCurrency: { const req = codecForListExchangesForScopedCurrencyRequest().decode(payload); -- cgit v1.2.3