Implemented persisting AppSettings
This commit is contained in:
parent
09a1a41c20
commit
debae8b7ca
|
@ -8,9 +8,15 @@ import net.codinux.banking.dataaccess.entities.BankAccountEntity
|
||||||
import net.codinux.banking.dataaccess.entities.HoldingEntity
|
import net.codinux.banking.dataaccess.entities.HoldingEntity
|
||||||
import net.codinux.banking.dataaccess.entities.BankAccessEntity
|
import net.codinux.banking.dataaccess.entities.BankAccessEntity
|
||||||
import net.codinux.banking.ui.model.AccountTransactionViewModel
|
import net.codinux.banking.ui.model.AccountTransactionViewModel
|
||||||
|
import net.codinux.banking.ui.model.settings.AppSettings
|
||||||
|
|
||||||
interface BankingRepository {
|
interface BankingRepository {
|
||||||
|
|
||||||
|
fun getAppSettings(): AppSettings?
|
||||||
|
|
||||||
|
suspend fun saveAppSettings(settings: AppSettings)
|
||||||
|
|
||||||
|
|
||||||
fun getAllBanks(): List<BankAccessEntity>
|
fun getAllBanks(): List<BankAccessEntity>
|
||||||
|
|
||||||
suspend fun persistBank(bank: BankAccess): BankAccessEntity
|
suspend fun persistBank(bank: BankAccess): BankAccessEntity
|
||||||
|
|
|
@ -8,10 +8,12 @@ import net.codinux.banking.dataaccess.entities.BankAccountEntity
|
||||||
import net.codinux.banking.dataaccess.entities.HoldingEntity
|
import net.codinux.banking.dataaccess.entities.HoldingEntity
|
||||||
import net.codinux.banking.dataaccess.entities.BankAccessEntity
|
import net.codinux.banking.dataaccess.entities.BankAccessEntity
|
||||||
import net.codinux.banking.ui.model.AccountTransactionViewModel
|
import net.codinux.banking.ui.model.AccountTransactionViewModel
|
||||||
|
import net.codinux.banking.ui.model.settings.AppSettings
|
||||||
|
|
||||||
class InMemoryBankingRepository(
|
class InMemoryBankingRepository(
|
||||||
banks: Collection<BankAccess> = emptyList(),
|
banks: Collection<BankAccess> = emptyList(),
|
||||||
transactions: Collection<AccountTransaction> = emptyList()
|
transactions: Collection<AccountTransaction> = emptyList(),
|
||||||
|
private var appSettings: AppSettings = AppSettings()
|
||||||
) : BankingRepository {
|
) : BankingRepository {
|
||||||
|
|
||||||
private var nextId = 0L // TODO: make thread-safe
|
private var nextId = 0L // TODO: make thread-safe
|
||||||
|
@ -21,6 +23,13 @@ class InMemoryBankingRepository(
|
||||||
private val transactions = transactions.map { map(it) }.toMutableList()
|
private val transactions = transactions.map { map(it) }.toMutableList()
|
||||||
|
|
||||||
|
|
||||||
|
override fun getAppSettings(): AppSettings? = appSettings
|
||||||
|
|
||||||
|
override suspend fun saveAppSettings(settings: AppSettings) {
|
||||||
|
this.appSettings = settings
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun getAllBanks(): List<BankAccessEntity> = banks.toList()
|
override fun getAllBanks(): List<BankAccessEntity> = banks.toList()
|
||||||
|
|
||||||
override suspend fun persistBank(bank: BankAccess): BankAccessEntity {
|
override suspend fun persistBank(bank: BankAccess): BankAccessEntity {
|
||||||
|
|
|
@ -8,6 +8,8 @@ import net.codinux.banking.client.model.securitiesaccount.Holding
|
||||||
import net.codinux.banking.client.model.tan.*
|
import net.codinux.banking.client.model.tan.*
|
||||||
import net.codinux.banking.dataaccess.entities.*
|
import net.codinux.banking.dataaccess.entities.*
|
||||||
import net.codinux.banking.ui.model.AccountTransactionViewModel
|
import net.codinux.banking.ui.model.AccountTransactionViewModel
|
||||||
|
import net.codinux.banking.ui.model.settings.AppAuthenticationMethod
|
||||||
|
import net.codinux.banking.ui.model.settings.AppSettings
|
||||||
import net.codinux.log.logger
|
import net.codinux.log.logger
|
||||||
import kotlin.enums.EnumEntries
|
import kotlin.enums.EnumEntries
|
||||||
import kotlin.js.JsName
|
import kotlin.js.JsName
|
||||||
|
@ -19,6 +21,8 @@ open class SqliteBankingRepository(
|
||||||
|
|
||||||
private val database = BankmeisterDb(sqlDriver)
|
private val database = BankmeisterDb(sqlDriver)
|
||||||
|
|
||||||
|
private val settingsQueries = database.settingsQueries
|
||||||
|
|
||||||
private val bankQueries = database.bankQueries
|
private val bankQueries = database.bankQueries
|
||||||
|
|
||||||
private val accountTransactionQueries = database.accountTransactionQueries
|
private val accountTransactionQueries = database.accountTransactionQueries
|
||||||
|
@ -26,6 +30,16 @@ open class SqliteBankingRepository(
|
||||||
private val log by logger()
|
private val log by logger()
|
||||||
|
|
||||||
|
|
||||||
|
override fun getAppSettings(): AppSettings? =
|
||||||
|
settingsQueries.getAppSettings { _, authenticationMethod, hashedPassword, updateAccountsOnAppStart, updateAccountsIfNoUpdatedForHours ->
|
||||||
|
AppSettings(mapToEnum(authenticationMethod, AppAuthenticationMethod.entries), hashedPassword, updateAccountsOnAppStart, mapToInt(updateAccountsIfNoUpdatedForHours))
|
||||||
|
}.executeAsOneOrNull()
|
||||||
|
|
||||||
|
override suspend fun saveAppSettings(settings: AppSettings) {
|
||||||
|
settingsQueries.upsertAppSettings(mapEnum(settings.authenticationMethod), settings.hashedPassword, settings.updateAccountsOnAppStart, mapInt(settings.updateAccountsIfNoUpdatedForHours))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun getAllBanks(): List<BankAccessEntity> {
|
override fun getAllBanks(): List<BankAccessEntity> {
|
||||||
val bankAccounts = getAllBankAccounts().groupBy { it.bankId }
|
val bankAccounts = getAllBankAccounts().groupBy { it.bankId }
|
||||||
val tanMethods = getAllTanMethods().groupBy { it.bankId }.mapValues { it.value.toMutableList() }
|
val tanMethods = getAllTanMethods().groupBy { it.bankId }.mapValues { it.value.toMutableList() }
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
package net.codinux.banking.ui.model.settings
|
||||||
|
|
||||||
|
enum class AppAuthenticationMethod {
|
||||||
|
None,
|
||||||
|
Password,
|
||||||
|
Biometric
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package net.codinux.banking.ui.model.settings
|
||||||
|
|
||||||
|
class AppSettings(
|
||||||
|
var authenticationMethod: AppAuthenticationMethod = AppAuthenticationMethod.None,
|
||||||
|
var hashedPassword: String? = null,
|
||||||
|
|
||||||
|
var updateAccountsOnAppStart: Boolean = false,
|
||||||
|
var updateAccountsIfNoUpdatedForHours: Int = 6
|
||||||
|
) {
|
||||||
|
override fun toString() = "$authenticationMethod"
|
||||||
|
}
|
|
@ -22,6 +22,7 @@ import net.codinux.banking.ui.model.BankInfo
|
||||||
import net.codinux.banking.ui.model.error.*
|
import net.codinux.banking.ui.model.error.*
|
||||||
import net.codinux.banking.ui.model.events.AccountTransactionsRetrievedEvent
|
import net.codinux.banking.ui.model.events.AccountTransactionsRetrievedEvent
|
||||||
import net.codinux.banking.ui.model.events.TransferredMoneyEvent
|
import net.codinux.banking.ui.model.events.TransferredMoneyEvent
|
||||||
|
import net.codinux.banking.ui.model.settings.AppSettings
|
||||||
import net.codinux.banking.ui.state.UiState
|
import net.codinux.banking.ui.state.UiState
|
||||||
import net.codinux.csv.reader.CsvReader
|
import net.codinux.csv.reader.CsvReader
|
||||||
import net.codinux.log.logger
|
import net.codinux.log.logger
|
||||||
|
@ -45,6 +46,14 @@ class BankingService(
|
||||||
|
|
||||||
suspend fun init() {
|
suspend fun init() {
|
||||||
try {
|
try {
|
||||||
|
var appSettings = getAppSettings()
|
||||||
|
if (appSettings == null) {
|
||||||
|
appSettings = AppSettings()
|
||||||
|
saveAppSettings(appSettings)
|
||||||
|
}
|
||||||
|
uiState.appSettings.value = appSettings
|
||||||
|
|
||||||
|
|
||||||
uiState.banks.value = getAllBanks()
|
uiState.banks.value = getAllBanks()
|
||||||
|
|
||||||
uiState.transactions.value = getAllAccountTransactionsAsViewModel()
|
uiState.transactions.value = getAllAccountTransactionsAsViewModel()
|
||||||
|
@ -55,6 +64,11 @@ class BankingService(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun getAppSettings() = bankingRepository.getAppSettings()
|
||||||
|
|
||||||
|
suspend fun saveAppSettings(settings: AppSettings) = bankingRepository.saveAppSettings(settings)
|
||||||
|
|
||||||
|
|
||||||
fun getAllBanks() = bankingRepository.getAllBanks()
|
fun getAllBanks() = bankingRepository.getAllBanks()
|
||||||
|
|
||||||
fun getAllAccountTransactions() = bankingRepository.getAllAccountTransactions()
|
fun getAllAccountTransactions() = bankingRepository.getAllAccountTransactions()
|
||||||
|
|
|
@ -15,9 +15,13 @@ import net.codinux.banking.ui.model.error.BankingClientError
|
||||||
import net.codinux.banking.ui.model.error.ErroneousAction
|
import net.codinux.banking.ui.model.error.ErroneousAction
|
||||||
import net.codinux.banking.ui.model.events.AccountTransactionsRetrievedEvent
|
import net.codinux.banking.ui.model.events.AccountTransactionsRetrievedEvent
|
||||||
import net.codinux.banking.ui.model.events.TransferredMoneyEvent
|
import net.codinux.banking.ui.model.events.TransferredMoneyEvent
|
||||||
|
import net.codinux.banking.ui.model.settings.AppSettings
|
||||||
|
|
||||||
class UiState : ViewModel() {
|
class UiState : ViewModel() {
|
||||||
|
|
||||||
|
val appSettings = MutableStateFlow(AppSettings())
|
||||||
|
|
||||||
|
|
||||||
val banks = MutableStateFlow<List<BankAccessEntity>>(emptyList())
|
val banks = MutableStateFlow<List<BankAccessEntity>>(emptyList())
|
||||||
|
|
||||||
val transactions = MutableStateFlow<List<AccountTransactionViewModel>>(emptyList())
|
val transactions = MutableStateFlow<List<AccountTransactionViewModel>>(emptyList())
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
import kotlin.Boolean;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS AppSettings (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
|
||||||
|
authenticationMethod TEXT NOT NULL,
|
||||||
|
hashedPassword TEXT,
|
||||||
|
|
||||||
|
updateAccountsOnAppStart INTEGER AS Boolean NOT NULL,
|
||||||
|
updateAccountsIfNoUpdatedForHours INTEGER NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
getAppSettings:
|
||||||
|
SELECT * FROM AppSettings WHERE id = 1;
|
||||||
|
|
||||||
|
upsertAppSettings:
|
||||||
|
INSERT OR REPLACE INTO AppSettings(id, authenticationMethod, hashedPassword, updateAccountsOnAppStart, updateAccountsIfNoUpdatedForHours)
|
||||||
|
VALUES (1, ?, ?, ?, ?);
|
Loading…
Reference in New Issue