taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit e7beff1a329b8976c1c38b93054e1336d4e624fd
parent 76763e47a084e43101635a8b3cca53cf2523fcdb
Author: Iván Ávalos <avalos@disroot.org>
Date:   Wed, 11 Dec 2024 14:30:51 +0100

wallet-core: add getDepositWireTypes request

Diffstat:
Mpackages/taler-util/src/types-taler-wallet.ts | 23+++++++++++++++++++++++
Mpackages/taler-wallet-core/src/wallet-api-types.ts | 12++++++++++++
Mpackages/taler-wallet-core/src/wallet.ts | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 103 insertions(+), 0 deletions(-)

diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts @@ -3564,6 +3564,29 @@ export const codecForHintNetworkAvailabilityRequest = .property("isNetworkAvailable", codecForBoolean()) .build("HintNetworkAvailabilityRequest"); +export interface GetDepositWireTypesRequest { + currency?: string; + /** + * Optional scope info to further restrict the result. + * Currency must match the currency field. + */ + scopeInfo?: ScopeInfo; +} + +export const codecForGetDepositWireTypesRequest = + (): Codec<GetDepositWireTypesRequest> => + buildCodecForObject<GetDepositWireTypesRequest>() + .property("currency", codecOptional(codecForString())) + .property("scopeInfo", codecOptional(codecForScopeInfo())) + .build("GetDepositWireTypesRequest"); + +export interface GetDepositWireTypesResponse { + /** + * Details for each wire type. + */ + wireTypeDetails: WireTypeDetails[]; +} + export interface GetDepositWireTypesForCurrencyRequest { currency: string; /** diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts @@ -83,6 +83,8 @@ import { GetCurrencySpecificationResponse, GetDepositWireTypesForCurrencyRequest, GetDepositWireTypesForCurrencyResponse, + GetDepositWireTypesRequest, + GetDepositWireTypesResponse, GetExchangeEntryByUrlRequest, GetExchangeEntryByUrlResponse, GetExchangeResourcesRequest, @@ -278,6 +280,7 @@ export enum WalletApiOperation { Shutdown = "shutdown", HintNetworkAvailability = "hintNetworkAvailability", CanonicalizeBaseUrl = "canonicalizeBaseUrl", + GetDepositWireTypes = "getDepositWireTypes", GetDepositWireTypesForCurrency = "getDepositWireTypesForCurrency", GetQrCodesForPayto = "getQrCodesForPayto", GetBankingChoicesForPayto = "getBankingChoicesForPayto", @@ -762,9 +765,17 @@ export type GetExchangeTosOp = { response: GetExchangeTosResult; }; +export type GetDepositWireTypesOp = { + op: WalletApiOperation.GetDepositWireTypes; + request: GetDepositWireTypesRequest; + response: GetDepositWireTypesResponse; +}; + /** * Get wire types that can be used for a deposit operation * with the provided currency. + * + * @deprecated Use getDepositWireTypes instead */ export type GetDepositWireTypesForCurrencyOp = { op: WalletApiOperation.GetDepositWireTypesForCurrency; @@ -1440,6 +1451,7 @@ export type WalletOperations = { [WalletApiOperation.TestingGetReserveHistory]: TestingGetReserveHistoryOp; [WalletApiOperation.TestingResetAllRetries]: TestingResetAllRetriesOp; [WalletApiOperation.HintNetworkAvailability]: HintNetworkAvailabilityOp; + [WalletApiOperation.GetDepositWireTypes]: GetDepositWireTypesOp; [WalletApiOperation.GetDepositWireTypesForCurrency]: GetDepositWireTypesForCurrencyOp; [WalletApiOperation.GetQrCodesForPayto]: GetQrCodesForPaytoOp; [WalletApiOperation.GetBankingChoicesForPayto]: GetBankingChoicesForPaytoOp; diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts @@ -72,6 +72,8 @@ import { GetCurrencySpecificationResponse, GetDepositWireTypesForCurrencyRequest, GetDepositWireTypesForCurrencyResponse, + GetDepositWireTypesRequest, + GetDepositWireTypesResponse, GetExchangeTosRequest, GetExchangeTosResult, GetQrCodesForPaytoRequest, @@ -163,6 +165,7 @@ import { codecForGetContractTermsDetails, codecForGetCurrencyInfoRequest, codecForGetDepositWireTypesForCurrencyRequest, + codecForGetDepositWireTypesRequest, codecForGetExchangeEntryByUrlRequest, codecForGetExchangeResourcesRequest, codecForGetExchangeTosRequest, @@ -1259,6 +1262,67 @@ async function handleHintNetworkAvailability( return {}; } +async function handleGetDepositWireTypes( + wex: WalletExecutionContext, + req: GetDepositWireTypesRequest, +): Promise<GetDepositWireTypesResponse> { + const wtSet: Set<string> = new Set(); + const wireTypeDetails: WireTypeDetails[] = []; + const talerBankHostnames: string[] = []; + await wex.db.runReadOnlyTx( + { storeNames: ["exchanges", "exchangeDetails"] }, + async (tx) => { + const exchanges = await tx.exchanges.getAll(); + for (const exchange of exchanges) { + const det = await getExchangeWireDetailsInTx(tx, exchange.baseUrl); + if (!det) { + continue; + } + if (req.currency !== undefined + && det.currency !== req.currency) { + continue; + } + for (const acc of det.wireInfo.accounts) { + let usable = true; + for (const dr of acc.debit_restrictions) { + if (dr.type === "deny") { + usable = false; + break; + } + } + if (!usable) { + continue; + } + const parsedPayto = parsePaytoUri(acc.payto_uri); + if (!parsedPayto) { + continue; + } + if ( + parsedPayto.isKnown && + parsedPayto.targetType === "x-taler-bank" + ) { + if (!talerBankHostnames.includes(parsedPayto.host)) { + talerBankHostnames.push(parsedPayto.host); + } + } + if (!wtSet.has(parsedPayto.targetType)) { + wtSet.add(parsedPayto.targetType); + wireTypeDetails.push({ + paymentTargetType: parsedPayto.targetType, + // Will possibly extended later by other exchanges + // with the same wire type. + talerBankHostnames, + }); + } + } + } + }, + ); + return { + wireTypeDetails, + }; +} + async function handleGetDepositWireTypesForCurrency( wex: WalletExecutionContext, req: GetDepositWireTypesForCurrencyRequest, @@ -2026,6 +2090,10 @@ const handlers: { [T in WalletApiOperation]: HandlerWithValidator<T> } = { return dbDump; }, }, + [WalletApiOperation.GetDepositWireTypes]: { + codec: codecForGetDepositWireTypesRequest(), + handler: handleGetDepositWireTypes, + }, [WalletApiOperation.GetDepositWireTypesForCurrency]: { codec: codecForGetDepositWireTypesForCurrencyRequest(), handler: handleGetDepositWireTypesForCurrency,