2022-10-19 13:52:54 -07:00
|
|
|
package cash.z.ecc.android.sdk.internal.db.derived
|
|
|
|
|
2023-05-05 14:46:07 -07:00
|
|
|
import cash.z.ecc.android.sdk.internal.model.DbTransactionOverview
|
2022-10-19 13:52:54 -07:00
|
|
|
import cash.z.ecc.android.sdk.internal.model.EncodedTransaction
|
|
|
|
import cash.z.ecc.android.sdk.internal.repository.DerivedDataRepository
|
|
|
|
import cash.z.ecc.android.sdk.model.BlockHeight
|
2023-08-07 12:17:28 -07:00
|
|
|
import cash.z.ecc.android.sdk.model.FirstClassByteArray
|
2022-10-31 12:27:34 -07:00
|
|
|
import cash.z.ecc.android.sdk.model.TransactionRecipient
|
2022-10-19 13:52:54 -07:00
|
|
|
import kotlinx.coroutines.flow.Flow
|
|
|
|
import kotlinx.coroutines.flow.MutableStateFlow
|
|
|
|
import kotlinx.coroutines.flow.map
|
|
|
|
import kotlinx.coroutines.flow.toList
|
|
|
|
import java.util.UUID
|
|
|
|
|
|
|
|
@Suppress("TooManyFunctions")
|
|
|
|
internal class DbDerivedDataRepository(
|
|
|
|
private val derivedDataDb: DerivedDataDb
|
|
|
|
) : DerivedDataRepository {
|
|
|
|
private val invalidatingFlow = MutableStateFlow(UUID.randomUUID())
|
|
|
|
|
2023-05-19 06:34:05 -07:00
|
|
|
override suspend fun firstUnenhancedHeight(): BlockHeight? {
|
|
|
|
return derivedDataDb.allTransactionView.firstUnenhancedHeight()
|
|
|
|
}
|
|
|
|
|
2023-08-07 12:17:28 -07:00
|
|
|
override suspend fun findEncodedTransactionByTxId(txId: FirstClassByteArray): EncodedTransaction? {
|
|
|
|
return derivedDataDb.transactionTable.findEncodedTransactionByTxId(txId)
|
2022-10-19 13:52:54 -07:00
|
|
|
}
|
|
|
|
|
2023-05-05 14:46:07 -07:00
|
|
|
override suspend fun findNewTransactions(blockHeightRange: ClosedRange<BlockHeight>): List<DbTransactionOverview> =
|
2022-10-19 13:52:54 -07:00
|
|
|
derivedDataDb.allTransactionView.getTransactionRange(blockHeightRange).toList()
|
|
|
|
|
|
|
|
override suspend fun getOldestTransaction() = derivedDataDb.allTransactionView.getOldestTransaction()
|
|
|
|
|
2024-01-04 12:21:32 -08:00
|
|
|
override suspend fun findMinedHeight(rawTransactionId: ByteArray) =
|
|
|
|
derivedDataDb.transactionTable
|
|
|
|
.findMinedHeight(rawTransactionId)
|
2022-10-19 13:52:54 -07:00
|
|
|
|
2024-01-04 12:21:32 -08:00
|
|
|
override suspend fun findMatchingTransactionId(rawTransactionId: ByteArray) =
|
|
|
|
derivedDataDb.transactionTable
|
|
|
|
.findDatabaseId(rawTransactionId)
|
2022-10-19 13:52:54 -07:00
|
|
|
|
|
|
|
override suspend fun getTransactionCount() = derivedDataDb.transactionTable.count()
|
|
|
|
|
|
|
|
override fun invalidate() {
|
|
|
|
invalidatingFlow.value = UUID.randomUUID()
|
|
|
|
}
|
|
|
|
|
2024-01-04 12:21:32 -08:00
|
|
|
override suspend fun getAccountCount() =
|
|
|
|
derivedDataDb.accountTable.count()
|
|
|
|
// toInt() should be safe because we expect very few accounts
|
|
|
|
.toInt()
|
2022-10-19 13:52:54 -07:00
|
|
|
|
2023-05-05 14:46:07 -07:00
|
|
|
override val allTransactions: Flow<List<DbTransactionOverview>>
|
2022-10-19 13:52:54 -07:00
|
|
|
get() = invalidatingFlow.map { derivedDataDb.allTransactionView.getAllTransactions().toList() }
|
|
|
|
|
2024-04-14 12:28:07 -07:00
|
|
|
override fun getOutputProperties(transactionId: FirstClassByteArray) =
|
|
|
|
derivedDataDb.txOutputsView
|
|
|
|
.getOutputProperties(transactionId)
|
2023-05-02 13:32:09 -07:00
|
|
|
|
2023-09-19 07:21:05 -07:00
|
|
|
override fun getRecipients(transactionId: FirstClassByteArray): Flow<TransactionRecipient> {
|
2023-05-02 13:32:09 -07:00
|
|
|
return derivedDataDb.txOutputsView.getRecipients(transactionId)
|
2022-10-31 12:27:34 -07:00
|
|
|
}
|
2022-10-24 06:09:29 -07:00
|
|
|
|
2022-10-19 13:52:54 -07:00
|
|
|
override suspend fun close() {
|
|
|
|
derivedDataDb.close()
|
|
|
|
}
|
|
|
|
}
|