taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

commit 21adf705e8df03274d12cd4193b3248f977ac08b
parent 92ddaa6513d882dbdb68bf09a084d3db710a2752
Author: Marc Stibane <marc@taler.net>
Date:   Fri,  4 Oct 2024 16:59:44 +0200

GetTransactionsV2

Diffstat:
MTalerWallet1/Model/Model+Transactions.swift | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 61 insertions(+), 16 deletions(-)

diff --git a/TalerWallet1/Model/Model+Transactions.swift b/TalerWallet1/Model/Model+Transactions.swift @@ -20,19 +20,10 @@ extension WalletModel { } } } - // MARK: - - -enum TransactionStateFilter: String, Codable { - case done - case final // done, aborted, expired, ... - case nonfinal // pending, dialog, suspended, aborting -} - /// A request to get the transactions in the wallet's history. fileprivate struct GetTransactions: WalletBackendFormattedRequest { func operation() -> String { "getTransactions" } -// func operation() -> String { "testingGetSampleTransactions" } func args() -> Args { Args(scopeInfo: scopeInfo, currency: currency, search: search, sort: sort, filterByState: filterByState, includeRefreshes: includeRefreshes) } var scopeInfo: ScopeInfo? @@ -54,6 +45,43 @@ fileprivate struct GetTransactions: WalletBackendFormattedRequest { var transactions: [Transaction] } } +enum TransactionStateFilter: String, Codable { + case done + case final // done, aborted, expired, ... + case nonfinal // pending, dialog, suspended, aborting +} +struct TransactionOffset: Codable { + var txID: String + var txTime: Timestamp +} +/// A request to get the transactions in the wallet's history. +fileprivate struct GetTransactionsV2: WalletBackendFormattedRequest { + func operation() -> String { "getTransactionsV2" } + func args() -> Args { Args(scopeInfo: scopeInfo, + filterByState: filterByState, + includeRefreshes: includeRefreshes, + limit: -limit, // descending + offsetTransactionId: offset?.txID, + offsetTimestamp: offset?.txTime) } + + var scopeInfo: ScopeInfo? + var filterByState: TransactionStateFilter? + var limit: Int + var offset: TransactionOffset? + var includeRefreshes: Bool? + struct Args: Encodable { + var scopeInfo: ScopeInfo? + var filterByState: TransactionStateFilter? + var includeRefreshes: Bool? + var limit: Int + var offsetTransactionId: String? + var offsetTimestamp: Timestamp? + } + + struct Response: Decodable { // list of transactions + var transactions: [Transaction] + } +} /// A request to abort a wallet transaction by ID. struct AbortTransaction: WalletBackendFormattedRequest { struct Response: Decodable {} // no result - getting no error back means success @@ -112,24 +140,41 @@ struct ResumeTransaction: WalletBackendFormattedRequest { // MARK: - extension WalletModel { /// ask wallet-core for its list of transactions filtered by searchString - func transactionsT(_ stack: CallStack, scopeInfo: ScopeInfo, searchString: String? = nil, + func transactionsT(_ stack: CallStack, scopeInfo: ScopeInfo, // searchString: String? = nil, <= never worked anyway sort: String = "descending", filterByState: TransactionStateFilter? = nil, includeRefreshes: Bool = false, viewHandles: Bool = false) - async throws -> [Transaction] { - let request = GetTransactions(scopeInfo: scopeInfo, currency: scopeInfo.currency, search: searchString, + async throws -> [Transaction] { + let request = GetTransactions(scopeInfo: scopeInfo, currency: scopeInfo.currency, // search: searchString, <= never worked sort: sort, filterByState: filterByState, includeRefreshes: includeRefreshes) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response.transactions } /// fetch transactions from Wallet-Core. No networking involved - @MainActor func transactionsMA(_ stack: CallStack, scopeInfo: ScopeInfo, searchString: String? = nil, + @MainActor func transactionsM(_ stack: CallStack, scopeInfo: ScopeInfo, // searchString: String? = nil, sort: String = "descending", filterByState: TransactionStateFilter? = nil, viewHandles: Bool = false) - async throws -> [Transaction] { // M for MainActor - return try await transactionsT(stack.push(), scopeInfo: scopeInfo, searchString: searchString, + async throws -> [Transaction] { // M for MainActor + return try await transactionsT(stack.push(), scopeInfo: scopeInfo, // searchString: searchString, sort: sort, filterByState: filterByState, viewHandles: viewHandles) } - + /// ask wallet-core for its list of transactions filtered by searchString + func transactionsT2(_ stack: CallStack, + scopeInfo: ScopeInfo, + filterByState: TransactionStateFilter, + limit: Int = 1_000_000, + offset: TransactionOffset? = nil, + includeRefreshes: Bool = false, + viewHandles: Bool = false) + async throws -> [Transaction] { + let request = GetTransactionsV2(scopeInfo: scopeInfo, + filterByState: filterByState, + limit: limit, + offset: offset, + includeRefreshes: includeRefreshes) + let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) + return response.transactions + } + // MARK: - /// abort the specified transaction from Wallet-Core. No networking involved func abortTransaction(transactionId: String, viewHandles: Bool = false) async throws { let request = AbortTransaction(transactionId: transactionId)