Skip to content
Snippets Groups Projects
Verified Commit 2452070b authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

fix: transactions not working

parent 86f97677
No related branches found
No related tags found
No related merge requests found
...@@ -31,7 +31,6 @@ import de.chaosdorf.meteroid.model.PinnedUserRepository ...@@ -31,7 +31,6 @@ import de.chaosdorf.meteroid.model.PinnedUserRepository
import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.model.ServerId
import de.chaosdorf.meteroid.model.ServerRepository import de.chaosdorf.meteroid.model.ServerRepository
import de.chaosdorf.meteroid.model.UserRepository import de.chaosdorf.meteroid.model.UserRepository
import kotlinx.coroutines.flow.combine
import javax.inject.Inject import javax.inject.Inject
class AccountProvider @Inject constructor( class AccountProvider @Inject constructor(
...@@ -39,12 +38,12 @@ class AccountProvider @Inject constructor( ...@@ -39,12 +38,12 @@ class AccountProvider @Inject constructor(
private val userRepository: UserRepository, private val userRepository: UserRepository,
private val pinnedUserRepository: PinnedUserRepository, private val pinnedUserRepository: PinnedUserRepository,
) { ) {
fun accountFlow(serverId: ServerId, userId: UserId) = combine( suspend fun account(serverId: ServerId, userId: UserId): AccountInfo? {
serverRepository.getFlow(serverId), val server = serverRepository.get(serverId)
userRepository.getFlow(serverId, userId), val user = userRepository.get(serverId, userId)
pinnedUserRepository.isPinnedFlow(serverId, userId) val pinned = pinnedUserRepository.isPinned(serverId, userId)
) { server, user, pinned ->
if (server == null || user == null) null return if (server == null || user == null) null
else AccountInfo(server, user, pinned) else AccountInfo(server, user, pinned)
} }
... ...
......
...@@ -79,6 +79,10 @@ class SyncManager @Inject constructor( ...@@ -79,6 +79,10 @@ class SyncManager @Inject constructor(
suspend fun purchase(account: AccountInfo, drink: Drink) { suspend fun purchase(account: AccountInfo, drink: Drink) {
val api = factory.newInstance(account.server.url) val api = factory.newInstance(account.server.url)
try { 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) api.purchase(account.user.userId, drink.drinkId)
sync(account.server, account.user, incremental = true) sync(account.server, account.user, incremental = true)
} catch (e: Exception) { } catch (e: Exception) {
... ...
......
...@@ -31,7 +31,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel ...@@ -31,7 +31,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel
import de.chaosdorf.mete.model.UserId import de.chaosdorf.mete.model.UserId
import de.chaosdorf.meteroid.model.Drink import de.chaosdorf.meteroid.model.Drink
import de.chaosdorf.meteroid.model.DrinkRepository import de.chaosdorf.meteroid.model.DrinkRepository
import de.chaosdorf.meteroid.model.Server
import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.model.ServerId
import de.chaosdorf.meteroid.sync.AccountProvider import de.chaosdorf.meteroid.sync.AccountProvider
import de.chaosdorf.meteroid.sync.SyncManager import de.chaosdorf.meteroid.sync.SyncManager
...@@ -46,16 +45,13 @@ import javax.inject.Inject ...@@ -46,16 +45,13 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class DrinkListViewModel @Inject constructor( class DrinkListViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle, private val savedStateHandle: SavedStateHandle,
accountProvider: AccountProvider, private val accountProvider: AccountProvider,
private val syncManager: SyncManager, private val syncManager: SyncManager,
drinkRepository: DrinkRepository, drinkRepository: DrinkRepository,
) : ViewModel() { ) : ViewModel() {
private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val serverId = ServerId(checkNotNull(savedStateHandle["server"]))
private val userId = UserId(checkNotNull(savedStateHandle["user"])) private val userId = UserId(checkNotNull(savedStateHandle["user"]))
val account = accountProvider.accountFlow(serverId, userId)
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val filters: StateFlow<Set<Filter>> = val filters: StateFlow<Set<Filter>> =
savedStateHandle.getStateFlow("filters", setOf(Filter.Active)) savedStateHandle.getStateFlow("filters", setOf(Filter.Active))
...@@ -76,8 +72,8 @@ class DrinkListViewModel @Inject constructor( ...@@ -76,8 +72,8 @@ class DrinkListViewModel @Inject constructor(
} }
fun purchase(item: Drink, onBack: () -> Unit) { fun purchase(item: Drink, onBack: () -> Unit) {
account.value?.let { account ->
viewModelScope.launch { viewModelScope.launch {
accountProvider.account(serverId, userId)?.let { account ->
syncManager.purchase(account, item) syncManager.purchase(account, item)
if (!account.pinned) { if (!account.pinned) {
onBack() onBack()
...@@ -87,17 +83,13 @@ class DrinkListViewModel @Inject constructor( ...@@ -87,17 +83,13 @@ class DrinkListViewModel @Inject constructor(
} }
fun sync() { fun sync() {
account.value?.let { account ->
viewModelScope.launch { viewModelScope.launch {
accountProvider.account(serverId, userId)?.let { account ->
syncManager.sync(account.server, account.user, incremental = true) 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 { enum class Filter {
CaffeineFree, CaffeineFree,
Active; Active;
... ...
......
...@@ -31,12 +31,9 @@ import androidx.lifecycle.viewModelScope ...@@ -31,12 +31,9 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import de.chaosdorf.mete.model.UserId import de.chaosdorf.mete.model.UserId
import de.chaosdorf.meteroid.R import de.chaosdorf.meteroid.R
import de.chaosdorf.meteroid.model.Server
import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.model.ServerId
import de.chaosdorf.meteroid.sync.AccountProvider import de.chaosdorf.meteroid.sync.AccountProvider
import de.chaosdorf.meteroid.sync.SyncManager import de.chaosdorf.meteroid.sync.SyncManager
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.math.BigDecimal import java.math.BigDecimal
import javax.inject.Inject import javax.inject.Inject
...@@ -60,14 +57,11 @@ class MoneyListViewModel @Inject constructor( ...@@ -60,14 +57,11 @@ class MoneyListViewModel @Inject constructor(
private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val serverId = ServerId(checkNotNull(savedStateHandle["server"]))
private val userId = UserId(checkNotNull(savedStateHandle["user"])) private val userId = UserId(checkNotNull(savedStateHandle["user"]))
val account = accountProvider.accountFlow(serverId, userId)
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val money: List<MonetaryAmount> = MonetaryAmount.entries val money: List<MonetaryAmount> = MonetaryAmount.entries
fun deposit(item: MonetaryAmount, onBack: () -> Unit) { 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) syncManager.deposit(account, item.amount)
if (!account.pinned) { if (!account.pinned) {
onBack() onBack()
...@@ -75,14 +69,4 @@ class MoneyListViewModel @Inject constructor( ...@@ -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)
} }
...@@ -30,7 +30,6 @@ import androidx.lifecycle.viewModelScope ...@@ -30,7 +30,6 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import de.chaosdorf.mete.model.UserId import de.chaosdorf.mete.model.UserId
import de.chaosdorf.meteroid.model.DrinkRepository import de.chaosdorf.meteroid.model.DrinkRepository
import de.chaosdorf.meteroid.model.Server
import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.model.ServerId
import de.chaosdorf.meteroid.model.TransactionRepository import de.chaosdorf.meteroid.model.TransactionRepository
import de.chaosdorf.meteroid.sync.AccountProvider import de.chaosdorf.meteroid.sync.AccountProvider
...@@ -48,7 +47,7 @@ import kotlin.time.Duration.Companion.minutes ...@@ -48,7 +47,7 @@ import kotlin.time.Duration.Companion.minutes
@HiltViewModel @HiltViewModel
class TransactionViewModel @Inject constructor( class TransactionViewModel @Inject constructor(
savedStateHandle: SavedStateHandle, savedStateHandle: SavedStateHandle,
accountProvider: AccountProvider, private val accountProvider: AccountProvider,
private val syncManager: SyncManager, private val syncManager: SyncManager,
repository: TransactionRepository, repository: TransactionRepository,
drinkRepository: DrinkRepository drinkRepository: DrinkRepository
...@@ -56,9 +55,6 @@ class TransactionViewModel @Inject constructor( ...@@ -56,9 +55,6 @@ class TransactionViewModel @Inject constructor(
private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val serverId = ServerId(checkNotNull(savedStateHandle["server"]))
private val userId = UserId(checkNotNull(savedStateHandle["user"])) private val userId = UserId(checkNotNull(savedStateHandle["user"]))
val account = accountProvider.accountFlow(serverId, userId)
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val transactions: StateFlow<List<TransactionInfo>> = combine( val transactions: StateFlow<List<TransactionInfo>> = combine(
repository.getAllFlow(serverId, userId), drinkRepository.getAllFlow(serverId) repository.getAllFlow(serverId, userId), drinkRepository.getAllFlow(serverId)
) { transactions, drinks -> ) { transactions, drinks ->
...@@ -73,15 +69,12 @@ class TransactionViewModel @Inject constructor( ...@@ -73,15 +69,12 @@ class TransactionViewModel @Inject constructor(
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList()) }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
fun sync() { fun sync() {
account.value?.let { (server, user) ->
viewModelScope.launch { viewModelScope.launch {
syncManager.sync(server, user, incremental = true) 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> { fun List<TransactionInfo>.mergeAdjecentDeposits(): List<TransactionInfo> {
... ...
......
...@@ -32,12 +32,9 @@ import de.chaosdorf.mete.model.DrinkId ...@@ -32,12 +32,9 @@ import de.chaosdorf.mete.model.DrinkId
import de.chaosdorf.mete.model.UserId import de.chaosdorf.mete.model.UserId
import de.chaosdorf.meteroid.model.Drink import de.chaosdorf.meteroid.model.Drink
import de.chaosdorf.meteroid.model.DrinkRepository import de.chaosdorf.meteroid.model.DrinkRepository
import de.chaosdorf.meteroid.model.Server
import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.model.ServerId
import de.chaosdorf.meteroid.model.Transaction import de.chaosdorf.meteroid.model.Transaction
import de.chaosdorf.meteroid.model.TransactionRepository 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.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
...@@ -53,17 +50,12 @@ import javax.inject.Inject ...@@ -53,17 +50,12 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class WrappedViewModel @Inject constructor( class WrappedViewModel @Inject constructor(
savedStateHandle: SavedStateHandle, savedStateHandle: SavedStateHandle,
accountProvider: AccountProvider,
private val syncManager: SyncManager,
repository: TransactionRepository, repository: TransactionRepository,
drinkRepository: DrinkRepository, drinkRepository: DrinkRepository,
) : ViewModel() { ) : ViewModel() {
private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val serverId = ServerId(checkNotNull(savedStateHandle["server"]))
private val userId = UserId(checkNotNull(savedStateHandle["user"])) 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> { private fun List<Transaction>.filterAudits(year: Int): List<Transaction> {
val yearBegin = LocalDateTime(year, Month.JANUARY, 1, 0, 0, 0) val yearBegin = LocalDateTime(year, Month.JANUARY, 1, 0, 0, 0)
.toInstant(TimeZone.UTC) .toInstant(TimeZone.UTC)
...@@ -88,8 +80,4 @@ class WrappedViewModel @Inject constructor( ...@@ -88,8 +80,4 @@ class WrappedViewModel @Inject constructor(
val content = transactions.filterAudits(now.year) val content = transactions.filterAudits(now.year)
factories.mapNotNull { it.create(content, drinkMap) } factories.mapNotNull { it.create(content, drinkMap) }
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList()) }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
suspend fun checkOffline(server: Server?): Boolean =
if (server == null) true
else syncManager.checkOffline(server)
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment