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