From 8977f94b5f91aeaadce562bfdc2d102443184a3f Mon Sep 17 00:00:00 2001 From: SAUL Date: Wed, 23 Oct 2024 14:51:41 +0400 Subject: [PATCH] Load passwords by User#Id --- .../models/criteria/PasswordSearchCriteria.kt | 9 ++++++ src/main/kotlin/di/AppModule.kt | 2 +- .../repository/password/PasswordRepository.kt | 4 +-- .../password/impl/PasswordRepositoryImpl.kt | 32 ++++++++++++------- .../kotlin/viewmodel/SecVaultScreenModel.kt | 6 +++- 5 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 src/main/kotlin/core/models/criteria/PasswordSearchCriteria.kt diff --git a/src/main/kotlin/core/models/criteria/PasswordSearchCriteria.kt b/src/main/kotlin/core/models/criteria/PasswordSearchCriteria.kt new file mode 100644 index 0000000..bb02af1 --- /dev/null +++ b/src/main/kotlin/core/models/criteria/PasswordSearchCriteria.kt @@ -0,0 +1,9 @@ +package core.models.criteria + +import core.models.PasswordSort +import java.util.* + +data class PasswordSearchCriteria( + val userId: UUID?, + val sort: PasswordSort +) diff --git a/src/main/kotlin/di/AppModule.kt b/src/main/kotlin/di/AppModule.kt index 91049e1..850260b 100644 --- a/src/main/kotlin/di/AppModule.kt +++ b/src/main/kotlin/di/AppModule.kt @@ -65,7 +65,7 @@ val viewModelModule = module { factory { ForgotPasswordScreenModel(get()) } - factory { SecVaultScreenModel(get()) } + factory { SecVaultScreenModel(get(), get()) } factory { PasswordMgntScreenModel(get(), get()) } diff --git a/src/main/kotlin/repository/password/PasswordRepository.kt b/src/main/kotlin/repository/password/PasswordRepository.kt index 57373e6..141df2b 100644 --- a/src/main/kotlin/repository/password/PasswordRepository.kt +++ b/src/main/kotlin/repository/password/PasswordRepository.kt @@ -1,13 +1,13 @@ package repository.password -import core.models.PasswordSort import core.models.Result +import core.models.criteria.PasswordSearchCriteria import core.models.dto.PasswordDto import repository.password.projection.PasswordSummary interface PasswordRepository { - suspend fun findSummaries(sort: PasswordSort): Result> + suspend fun findSummaries(searchCriteria: PasswordSearchCriteria): Result> suspend fun save(password: PasswordDto): Result diff --git a/src/main/kotlin/repository/password/impl/PasswordRepositoryImpl.kt b/src/main/kotlin/repository/password/impl/PasswordRepositoryImpl.kt index 7602f09..65f24e1 100644 --- a/src/main/kotlin/repository/password/impl/PasswordRepositoryImpl.kt +++ b/src/main/kotlin/repository/password/impl/PasswordRepositoryImpl.kt @@ -2,11 +2,13 @@ package repository.password.impl import core.models.PasswordSort import core.models.Result +import core.models.criteria.PasswordSearchCriteria import core.models.dto.PasswordDto import kotlinx.coroutines.delay import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.Expression import org.jetbrains.exposed.sql.SortOrder +import org.jetbrains.exposed.sql.andWhere import org.jetbrains.exposed.sql.transactions.transaction import org.slf4j.Logger import repository.common.errors.DatabaseError @@ -20,11 +22,12 @@ class PasswordRepositoryImpl( private val logger: Logger ) : PasswordRepository { - override suspend fun findSummaries(sort: PasswordSort): Result> { + override suspend fun findSummaries(searchCriteria: PasswordSearchCriteria): Result> { delay(550) return try { return transaction(db) { - PasswordsTable.select( + + val query = PasswordsTable.select( listOf( PasswordsTable.id, PasswordsTable.name, @@ -32,16 +35,21 @@ class PasswordRepositoryImpl( PasswordsTable.email, PasswordsTable.favorite ) - ).orderBy(toSort(sort), toOrder(sort)) - .map { - PasswordSummary( - id = it[PasswordsTable.id].value, - name = it[PasswordsTable.name], - username = it[PasswordsTable.username], - email = it[PasswordsTable.email], - favorite = it[PasswordsTable.favorite] - ) - } + ) + + searchCriteria.userId?.let { + query.andWhere { PasswordsTable.user eq it } + } + + query.orderBy(toSort(searchCriteria.sort), toOrder(searchCriteria.sort)).map { + PasswordSummary( + id = it[PasswordsTable.id].value, + name = it[PasswordsTable.name], + username = it[PasswordsTable.username], + email = it[PasswordsTable.email], + favorite = it[PasswordsTable.favorite] + ) + } }.let { Result.Success(it) } } catch (e: Exception) { logger.error(e.message, e) diff --git a/src/main/kotlin/viewmodel/SecVaultScreenModel.kt b/src/main/kotlin/viewmodel/SecVaultScreenModel.kt index 7749c13..8e8d202 100644 --- a/src/main/kotlin/viewmodel/SecVaultScreenModel.kt +++ b/src/main/kotlin/viewmodel/SecVaultScreenModel.kt @@ -2,10 +2,12 @@ package viewmodel import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.screenModelScope +import core.AppState import core.models.DefaultMenuItem import core.models.PasswordSort import core.models.Result import core.models.UiState +import core.models.criteria.PasswordSearchCriteria import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow @@ -18,6 +20,7 @@ import repository.password.projection.PasswordSummary class SecVaultScreenModel( private val passwordRepository: PasswordRepository, + private val appState: AppState, private val dispatcher: CoroutineDispatcher = Dispatchers.IO ) : ScreenModel { @@ -72,7 +75,8 @@ class SecVaultScreenModel( } private suspend fun loadPasswords(sort: PasswordSort) { - _passwordItems.value = when (val passwords = passwordRepository.findSummaries(sort)) { + val criteria = PasswordSearchCriteria(appState.getAuthenticatedUser?.id?.value, sort) + _passwordItems.value = when (val passwords = passwordRepository.findSummaries(criteria)) { is Result.Success -> { _secVaultState.value = UiState.Success("Successfully loaded passwords") passwords.data