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
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)
}
......
......@@ -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) {
......
......@@ -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;
......
......@@ -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)
}
......@@ -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> {
......
......@@ -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)
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment