From 2452070b010ba75318383860cce839c025026b72 Mon Sep 17 00:00:00 2001 From: Janne Mareike Koschinski <janne@kuschku.de> Date: Fri, 1 Dec 2023 00:58:57 +0100 Subject: [PATCH] fix: transactions not working --- .../meteroid/sync/AccountProvider.kt | 13 ++++++------ .../de/chaosdorf/meteroid/sync/SyncManager.kt | 4 ++++ .../meteroid/ui/drinks/DrinkListViewModel.kt | 18 +++++------------ .../meteroid/ui/money/MoneyListViewModel.kt | 20 ++----------------- .../ui/transactions/PurchaseViewModel.kt | 15 ++++---------- .../meteroid/ui/wrapped/WrappedViewModel.kt | 12 ----------- 6 files changed, 21 insertions(+), 61 deletions(-) diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt index c445d74..000fe2d 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt @@ -31,7 +31,6 @@ import de.chaosdorf.meteroid.model.PinnedUserRepository import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.model.ServerRepository import de.chaosdorf.meteroid.model.UserRepository -import kotlinx.coroutines.flow.combine import javax.inject.Inject class AccountProvider @Inject constructor( @@ -39,12 +38,12 @@ class AccountProvider @Inject constructor( private val userRepository: UserRepository, private val pinnedUserRepository: PinnedUserRepository, ) { - fun accountFlow(serverId: ServerId, userId: UserId) = combine( - serverRepository.getFlow(serverId), - userRepository.getFlow(serverId, userId), - pinnedUserRepository.isPinnedFlow(serverId, userId) - ) { server, user, pinned -> - if (server == null || user == null) null + suspend fun account(serverId: ServerId, userId: UserId): AccountInfo? { + val server = serverRepository.get(serverId) + val user = userRepository.get(serverId, userId) + val pinned = pinnedUserRepository.isPinned(serverId, userId) + + return if (server == null || user == null) null else AccountInfo(server, user, pinned) } diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt index 1a3cbf3..6f8563e 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt @@ -79,6 +79,10 @@ class SyncManager @Inject constructor( suspend fun purchase(account: AccountInfo, drink: Drink) { val api = factory.newInstance(account.server.url) try { + Log.i( + "SyncManager", + "Syncing purchase of ${drink.drinkId}/${drink.drinkId} for ${account.user.name}/${account.user.userId}" + ) api.purchase(account.user.userId, drink.drinkId) sync(account.server, account.user, incremental = true) } catch (e: Exception) { diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt index 470a91e..59f2d53 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt @@ -31,7 +31,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel import de.chaosdorf.mete.model.UserId import de.chaosdorf.meteroid.model.Drink import de.chaosdorf.meteroid.model.DrinkRepository -import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.sync.AccountProvider import de.chaosdorf.meteroid.sync.SyncManager @@ -46,16 +45,13 @@ import javax.inject.Inject @HiltViewModel class DrinkListViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, - accountProvider: AccountProvider, + private val accountProvider: AccountProvider, private val syncManager: SyncManager, drinkRepository: DrinkRepository, ) : ViewModel() { private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val userId = UserId(checkNotNull(savedStateHandle["user"])) - val account = accountProvider.accountFlow(serverId, userId) - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) - val filters: StateFlow<Set<Filter>> = savedStateHandle.getStateFlow("filters", setOf(Filter.Active)) @@ -76,8 +72,8 @@ class DrinkListViewModel @Inject constructor( } fun purchase(item: Drink, onBack: () -> Unit) { - account.value?.let { account -> - viewModelScope.launch { + viewModelScope.launch { + accountProvider.account(serverId, userId)?.let { account -> syncManager.purchase(account, item) if (!account.pinned) { onBack() @@ -87,17 +83,13 @@ class DrinkListViewModel @Inject constructor( } fun sync() { - account.value?.let { account -> - viewModelScope.launch { + viewModelScope.launch { + accountProvider.account(serverId, userId)?.let { account -> syncManager.sync(account.server, account.user, incremental = true) } } } - suspend fun checkOffline(server: Server?): Boolean = - if (server == null) true - else syncManager.checkOffline(server) - enum class Filter { CaffeineFree, Active; diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt index cd405b2..105d5db 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt @@ -31,12 +31,9 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import de.chaosdorf.mete.model.UserId import de.chaosdorf.meteroid.R -import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.sync.AccountProvider import de.chaosdorf.meteroid.sync.SyncManager -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import java.math.BigDecimal import javax.inject.Inject @@ -60,14 +57,11 @@ class MoneyListViewModel @Inject constructor( private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val userId = UserId(checkNotNull(savedStateHandle["user"])) - val account = accountProvider.accountFlow(serverId, userId) - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) - val money: List<MonetaryAmount> = MonetaryAmount.entries fun deposit(item: MonetaryAmount, onBack: () -> Unit) { - account.value?.let { account -> - viewModelScope.launch { + viewModelScope.launch { + accountProvider.account(serverId, userId)?.let { account -> syncManager.deposit(account, item.amount) if (!account.pinned) { onBack() @@ -75,14 +69,4 @@ class MoneyListViewModel @Inject constructor( } } } - - fun togglePin() { - viewModelScope.launch { - accountProvider.togglePin(serverId, userId) - } - } - - suspend fun checkOffline(server: Server?): Boolean = - if (server == null) true - else syncManager.checkOffline(server) } diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt index d3efc78..4936086 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt @@ -30,7 +30,6 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import de.chaosdorf.mete.model.UserId import de.chaosdorf.meteroid.model.DrinkRepository -import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.model.TransactionRepository import de.chaosdorf.meteroid.sync.AccountProvider @@ -48,7 +47,7 @@ import kotlin.time.Duration.Companion.minutes @HiltViewModel class TransactionViewModel @Inject constructor( savedStateHandle: SavedStateHandle, - accountProvider: AccountProvider, + private val accountProvider: AccountProvider, private val syncManager: SyncManager, repository: TransactionRepository, drinkRepository: DrinkRepository @@ -56,9 +55,6 @@ class TransactionViewModel @Inject constructor( private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val userId = UserId(checkNotNull(savedStateHandle["user"])) - val account = accountProvider.accountFlow(serverId, userId) - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) - val transactions: StateFlow<List<TransactionInfo>> = combine( repository.getAllFlow(serverId, userId), drinkRepository.getAllFlow(serverId) ) { transactions, drinks -> @@ -73,15 +69,12 @@ class TransactionViewModel @Inject constructor( }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList()) fun sync() { - account.value?.let { (server, user) -> - viewModelScope.launch { - syncManager.sync(server, user, incremental = true) + viewModelScope.launch { + accountProvider.account(serverId, userId)?.let { account -> + syncManager.sync(account.server, account.user, incremental = true) } } } - - suspend fun checkOffline(server: Server?): Boolean = if (server == null) true - else syncManager.checkOffline(server) } fun List<TransactionInfo>.mergeAdjecentDeposits(): List<TransactionInfo> { diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt index 712b16c..a3fceec 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt @@ -32,12 +32,9 @@ import de.chaosdorf.mete.model.DrinkId import de.chaosdorf.mete.model.UserId import de.chaosdorf.meteroid.model.Drink import de.chaosdorf.meteroid.model.DrinkRepository -import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.model.Transaction import de.chaosdorf.meteroid.model.TransactionRepository -import de.chaosdorf.meteroid.sync.AccountProvider -import de.chaosdorf.meteroid.sync.SyncManager import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine @@ -53,17 +50,12 @@ import javax.inject.Inject @HiltViewModel class WrappedViewModel @Inject constructor( savedStateHandle: SavedStateHandle, - accountProvider: AccountProvider, - private val syncManager: SyncManager, repository: TransactionRepository, drinkRepository: DrinkRepository, ) : ViewModel() { private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val userId = UserId(checkNotNull(savedStateHandle["user"])) - val account = accountProvider.accountFlow(serverId, userId) - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) - private fun List<Transaction>.filterAudits(year: Int): List<Transaction> { val yearBegin = LocalDateTime(year, Month.JANUARY, 1, 0, 0, 0) .toInstant(TimeZone.UTC) @@ -88,8 +80,4 @@ class WrappedViewModel @Inject constructor( val content = transactions.filterAudits(now.year) factories.mapNotNull { it.create(content, drinkMap) } }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList()) - - suspend fun checkOffline(server: Server?): Boolean = - if (server == null) true - else syncManager.checkOffline(server) } -- GitLab