diff options
Diffstat (limited to 'packages')
-rw-r--r-- | packages/taler-util/src/wallet-types.ts | 18 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/wallet-api-types.ts | 13 | ||||
-rw-r--r-- | packages/taler-wallet-core/src/wallet.ts | 34 |
3 files changed, 64 insertions, 1 deletions
diff --git a/packages/taler-util/src/wallet-types.ts b/packages/taler-util/src/wallet-types.ts index 8e436bc75..2a5fa0bf8 100644 --- a/packages/taler-util/src/wallet-types.ts +++ b/packages/taler-util/src/wallet-types.ts @@ -1305,7 +1305,9 @@ export interface ShortExchangeListItem { exchangeBaseUrl: string; } -// FIXME: This should probably include some error status. +/** + * Info about an exchange entry in the wallet. + */ export interface ExchangeListItem { exchangeBaseUrl: string; currency: string | undefined; @@ -1624,6 +1626,20 @@ export const codecForIntegrationTestV2Args = (): Codec<IntegrationTestV2Args> => .property("corebankApiBaseUrl", codecForString()) .build("IntegrationTestV2Args"); +export interface GetExchangeEntryByUrlRequest { + exchangeBaseUrl: string; +} + +export const codecForGetExchangeEntryByUrlRequest = + (): Codec<GetExchangeEntryByUrlRequest> => + buildCodecForObject<GetExchangeEntryByUrlRequest>() + .property("exchangeBaseUrl", codecForString()) + .build("GetExchangeEntryByUrlRequest"); + +export interface GetExchangeEntryByUrlResponse { + exchangeEntry: ExchangeListItem; +} + export interface AddExchangeRequest { exchangeBaseUrl: string; masterPub?: string; 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", @@ -634,6 +637,15 @@ export type GetExchangeDetailedInfoOp = { }; /** + * 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. */ export type ListCurrenciesOp = { @@ -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<Op extends WalletApiOperation>( 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); |