diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/NetworkViewModel.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/NetworkViewModel.kt index 433d5687..7d3bbe35 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/NetworkViewModel.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/list/NetworkViewModel.kt @@ -6,16 +6,16 @@ import io.github.openflocon.domain.common.DispatcherProvider import io.github.openflocon.domain.device.usecase.ObserveCurrentDeviceIdAndPackageNameUseCase import io.github.openflocon.domain.feedback.FeedbackDisplayer import io.github.openflocon.domain.network.models.BadQualityConfigDomainModel -import io.github.openflocon.domain.network.models.FloconNetworkCallDomainModel import io.github.openflocon.domain.network.models.MockNetworkDomainModel import io.github.openflocon.domain.network.models.NetworkTextFilterColumns import io.github.openflocon.domain.network.usecase.DecodeJwtTokenUseCase import io.github.openflocon.domain.network.usecase.ExportNetworkCallsToCsvUseCase import io.github.openflocon.domain.network.usecase.GenerateCurlCommandUseCase -import io.github.openflocon.domain.network.usecase.ObserveHttpRequestsByIdUseCase -import io.github.openflocon.domain.network.usecase.ObserveHttpRequestsUseCase -import io.github.openflocon.domain.network.usecase.RemoveHttpRequestUseCase +import io.github.openflocon.domain.network.usecase.ObserveNetworkRequestsByIdUseCase +import io.github.openflocon.domain.network.usecase.ObserveNetworkRequestsUseCase +import io.github.openflocon.domain.network.usecase.RemoveNetworkRequestUseCase import io.github.openflocon.domain.network.usecase.RemoveHttpRequestsBeforeUseCase +import io.github.openflocon.domain.network.usecase.RemoveOldSessionsNetworkRequestUseCase import io.github.openflocon.domain.network.usecase.ResetCurrentDeviceHttpRequestsUseCase import io.github.openflocon.domain.network.usecase.badquality.ObserveAllNetworkBadQualitiesUseCase import io.github.openflocon.domain.network.usecase.mocks.ObserveNetworkMocksUseCase @@ -50,12 +50,12 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class NetworkViewModel( - observeHttpRequestsUseCase: ObserveHttpRequestsUseCase, - private val observeHttpRequestsByIdUseCase: ObserveHttpRequestsByIdUseCase, + observeNetworkRequestsUseCase: ObserveNetworkRequestsUseCase, + private val observeNetworkRequestsByIdUseCase: ObserveNetworkRequestsByIdUseCase, private val generateCurlCommandUseCase: GenerateCurlCommandUseCase, private val resetCurrentDeviceHttpRequestsUseCase: ResetCurrentDeviceHttpRequestsUseCase, private val removeHttpRequestsBeforeUseCase: RemoveHttpRequestsBeforeUseCase, - private val removeHttpRequestUseCase: RemoveHttpRequestUseCase, + private val removeNetworkRequestUseCase: RemoveNetworkRequestUseCase, private val mocksUseCase: ObserveNetworkMocksUseCase, private val badNetworkUseCase: ObserveAllNetworkBadQualitiesUseCase, private val dispatcherProvider: DispatcherProvider, @@ -65,6 +65,7 @@ class NetworkViewModel( private val observeCurrentDeviceIdAndPackageNameUseCase: ObserveCurrentDeviceIdAndPackageNameUseCase, private val exportNetworkCallsToCsv: ExportNetworkCallsToCsvUseCase, private val decodeJwtTokenUseCase: DecodeJwtTokenUseCase, + private val removeOldSessionsNetworkRequestUseCase: RemoveOldSessionsNetworkRequestUseCase, ) : ViewModel(headerDelegate) { private val contentState = MutableStateFlow( @@ -94,7 +95,7 @@ class NetworkViewModel( if (id == null) { flowOf(null) } else { - observeHttpRequestsByIdUseCase(id) + observeNetworkRequestsByIdUseCase(id) .distinctUntilChanged() .map { it?.let { toDetailUi(it) } } } @@ -103,7 +104,7 @@ class NetworkViewModel( .stateIn(viewModelScope, started = SharingStarted.WhileSubscribed(5_000), null) private val items = combine( - observeHttpRequestsUseCase(), + observeNetworkRequestsUseCase(), observeCurrentDeviceIdAndPackageNameUseCase(), ) { list, deviceIdAndPackageName -> list.map { networkCall -> @@ -219,7 +220,9 @@ class NetworkViewModel( } private fun onClearSession() { - + viewModelScope.launch(dispatcherProvider.viewModel) { + removeOldSessionsNetworkRequestUseCase() + } } private fun onAutoScroll() { @@ -319,7 +322,7 @@ class NetworkViewModel( private fun onCopyCUrl(action: NetworkAction.CopyCUrl) { viewModelScope.launch(dispatcherProvider.viewModel) { - val domainModel = observeHttpRequestsByIdUseCase(action.item.uuid).firstOrNull() + val domainModel = observeNetworkRequestsByIdUseCase(action.item.uuid).firstOrNull() ?: return@launch val curl = generateCurlCommandUseCase(domainModel) copyToClipboard(curl) @@ -328,7 +331,7 @@ class NetworkViewModel( private fun onCopyUrl(action: NetworkAction.CopyUrl) { viewModelScope.launch(dispatcherProvider.viewModel) { - val domainModel = observeHttpRequestsByIdUseCase(action.item.uuid).firstOrNull() + val domainModel = observeNetworkRequestsByIdUseCase(action.item.uuid).firstOrNull() ?: return@launch copyToClipboard(domainModel.request.url) } @@ -336,7 +339,7 @@ class NetworkViewModel( private fun onRemove(action: NetworkAction.Remove) { viewModelScope.launch(dispatcherProvider.viewModel) { - removeHttpRequestUseCase(requestId = action.item.uuid) + removeNetworkRequestUseCase(requestId = action.item.uuid) } } diff --git a/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/network/datasource/NetworkLocalDataSource.kt b/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/network/datasource/NetworkLocalDataSource.kt index 88d66d28..18c2cb8d 100644 --- a/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/network/datasource/NetworkLocalDataSource.kt +++ b/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/network/datasource/NetworkLocalDataSource.kt @@ -36,6 +36,8 @@ interface NetworkLocalDataSource { suspend fun deleteRequestsBefore(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, callId: String) + suspend fun deleteRequestOnDifferentSession(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel) + suspend fun clear() } diff --git a/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/network/repository/NetworkRepositoryImpl.kt b/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/network/repository/NetworkRepositoryImpl.kt index ad4cfe49..e10b044c 100644 --- a/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/network/repository/NetworkRepositoryImpl.kt +++ b/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/network/repository/NetworkRepositoryImpl.kt @@ -359,4 +359,12 @@ class NetworkRepositoryImpl( } } + override suspend fun deleteOldRequests(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel) { + withContext(dispatcherProvider.data) { + networkLocalDataSource.deleteRequestOnDifferentSession( + deviceIdAndPackageName = deviceIdAndPackageName, + ) + } + } + } diff --git a/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/network/dao/FloconNetworkDao.kt b/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/network/dao/FloconNetworkDao.kt index 0f21a249..4a12b9a5 100644 --- a/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/network/dao/FloconNetworkDao.kt +++ b/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/network/dao/FloconNetworkDao.kt @@ -96,6 +96,20 @@ interface FloconNetworkDao { callId: String, ) + @Query( + """ + DELETE FROM FloconNetworkCallEntity + WHERE deviceId = :deviceId + AND packageName = :packageName + AND appInstance != :appInstance + """, + ) + suspend fun deleteRequestOnDifferentSession( + deviceId: String, + packageName: String, + appInstance: Long, + ) + @Query( """ DELETE FROM FloconNetworkCallEntity diff --git a/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/network/datasource/NetworkLocalDataSourceRoom.kt b/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/network/datasource/NetworkLocalDataSourceRoom.kt index 6d2121b4..004cb22f 100644 --- a/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/network/datasource/NetworkLocalDataSourceRoom.kt +++ b/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/network/datasource/NetworkLocalDataSourceRoom.kt @@ -90,6 +90,16 @@ class NetworkLocalDataSourceRoom( ) } + override suspend fun deleteRequestOnDifferentSession( + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, + ) { + floconNetworkDao.deleteRequestOnDifferentSession( + deviceId = deviceIdAndPackageName.deviceId, + packageName = deviceIdAndPackageName.packageName, + appInstance = deviceIdAndPackageName.appInstance + ) + } + override suspend fun deleteRequestsBefore( deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, callId: String diff --git a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/DI.kt b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/DI.kt index 3ba8884b..30bc7cf5 100644 --- a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/DI.kt +++ b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/DI.kt @@ -4,11 +4,12 @@ import io.github.openflocon.domain.network.usecase.DecodeJwtTokenUseCase import io.github.openflocon.domain.network.usecase.ExportNetworkCallsToCsvUseCase import io.github.openflocon.domain.network.usecase.GenerateCurlCommandUseCase import io.github.openflocon.domain.network.usecase.GetNetworkFilterUseCase -import io.github.openflocon.domain.network.usecase.ObserveHttpRequestsByIdUseCase -import io.github.openflocon.domain.network.usecase.ObserveHttpRequestsUseCase +import io.github.openflocon.domain.network.usecase.ObserveNetworkRequestsByIdUseCase +import io.github.openflocon.domain.network.usecase.ObserveNetworkRequestsUseCase import io.github.openflocon.domain.network.usecase.ObserveNetworkFilterUseCase -import io.github.openflocon.domain.network.usecase.RemoveHttpRequestUseCase +import io.github.openflocon.domain.network.usecase.RemoveNetworkRequestUseCase import io.github.openflocon.domain.network.usecase.RemoveHttpRequestsBeforeUseCase +import io.github.openflocon.domain.network.usecase.RemoveOldSessionsNetworkRequestUseCase import io.github.openflocon.domain.network.usecase.ResetCurrentDeviceHttpRequestsUseCase import io.github.openflocon.domain.network.usecase.UpdateNetworkFilterUseCase import io.github.openflocon.domain.network.usecase.badquality.DeleteBadQualityUseCase @@ -28,14 +29,15 @@ import org.koin.core.module.dsl.factoryOf import org.koin.dsl.module internal val networkModule = module { - factoryOf(::ObserveHttpRequestsUseCase) - factoryOf(::ObserveHttpRequestsByIdUseCase) + factoryOf(::ObserveNetworkRequestsUseCase) + factoryOf(::ObserveNetworkRequestsByIdUseCase) factoryOf(::GenerateCurlCommandUseCase) factoryOf(::ResetCurrentDeviceHttpRequestsUseCase) factoryOf(::RemoveHttpRequestsBeforeUseCase) - factoryOf(::RemoveHttpRequestUseCase) + factoryOf(::RemoveNetworkRequestUseCase) factoryOf(::ExportNetworkCallsToCsvUseCase) factoryOf(::DecodeJwtTokenUseCase) + factoryOf(::RemoveOldSessionsNetworkRequestUseCase) // filters factoryOf(::GetNetworkFilterUseCase) factoryOf(::ObserveNetworkFilterUseCase) diff --git a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/repository/NetworkRepository.kt b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/repository/NetworkRepository.kt index c3453b19..c61e276a 100644 --- a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/repository/NetworkRepository.kt +++ b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/repository/NetworkRepository.kt @@ -32,4 +32,8 @@ interface NetworkRepository { deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, ids: List ) : List + + suspend fun deleteOldRequests( + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ) } diff --git a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveHttpRequestsByIdUseCase.kt b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveNetworkRequestsByIdUseCase.kt similarity index 90% rename from FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveHttpRequestsByIdUseCase.kt rename to FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveNetworkRequestsByIdUseCase.kt index 79dbae8f..831afd31 100644 --- a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveHttpRequestsByIdUseCase.kt +++ b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveNetworkRequestsByIdUseCase.kt @@ -1,7 +1,6 @@ package io.github.openflocon.domain.network.usecase import io.github.openflocon.domain.device.usecase.ObserveCurrentDeviceIdAndPackageNameUseCase -import io.github.openflocon.domain.device.usecase.ObserveCurrentDeviceIdUseCase import io.github.openflocon.domain.network.models.FloconNetworkCallDomainModel import io.github.openflocon.domain.network.repository.NetworkRepository import kotlinx.coroutines.flow.Flow @@ -9,7 +8,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf -class ObserveHttpRequestsByIdUseCase( +class ObserveNetworkRequestsByIdUseCase( private val networkRepository: NetworkRepository, private val observeCurrentDeviceIdAndPackageNameUseCase: ObserveCurrentDeviceIdAndPackageNameUseCase, ) { diff --git a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveHttpRequestsUseCase.kt b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveNetworkRequestsUseCase.kt similarity index 96% rename from FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveHttpRequestsUseCase.kt rename to FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveNetworkRequestsUseCase.kt index 974a41df..91b117b6 100644 --- a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveHttpRequestsUseCase.kt +++ b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/ObserveNetworkRequestsUseCase.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf -class ObserveHttpRequestsUseCase( +class ObserveNetworkRequestsUseCase( private val networkRepository: NetworkRepository, private val observeCurrentDeviceIdAndPackageNameUseCase: ObserveCurrentDeviceIdAndPackageNameUseCase, ) { diff --git a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/RemoveHttpRequestUseCase.kt b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/RemoveNetworkRequestUseCase.kt similarity index 94% rename from FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/RemoveHttpRequestUseCase.kt rename to FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/RemoveNetworkRequestUseCase.kt index e935586e..71708f89 100644 --- a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/RemoveHttpRequestUseCase.kt +++ b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/RemoveNetworkRequestUseCase.kt @@ -3,7 +3,7 @@ package io.github.openflocon.domain.network.usecase import io.github.openflocon.domain.device.usecase.GetCurrentDeviceIdAndPackageNameUseCase import io.github.openflocon.domain.network.repository.NetworkRepository -class RemoveHttpRequestUseCase( +class RemoveNetworkRequestUseCase( private val networkRepository: NetworkRepository, private val getCurrentDeviceIdAndPackageNameUseCase: GetCurrentDeviceIdAndPackageNameUseCase, ) { diff --git a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/RemoveOldSessionsNetworkRequestUseCase.kt b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/RemoveOldSessionsNetworkRequestUseCase.kt new file mode 100644 index 00000000..810561d3 --- /dev/null +++ b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/RemoveOldSessionsNetworkRequestUseCase.kt @@ -0,0 +1,15 @@ +package io.github.openflocon.domain.network.usecase + +import io.github.openflocon.domain.device.usecase.GetCurrentDeviceIdAndPackageNameUseCase +import io.github.openflocon.domain.network.repository.NetworkRepository + +class RemoveOldSessionsNetworkRequestUseCase( + private val networkRepository: NetworkRepository, + private val getCurrentDeviceIdAndPackageNameUseCase: GetCurrentDeviceIdAndPackageNameUseCase, +) { + suspend operator fun invoke() { + getCurrentDeviceIdAndPackageNameUseCase()?.let { deviceIdAndPackageName -> + networkRepository.deleteOldRequests(deviceIdAndPackageName = deviceIdAndPackageName) + } + } +} diff --git a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/mocks/GenerateNetworkMockFromNetworkCallUseCase.kt b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/mocks/GenerateNetworkMockFromNetworkCallUseCase.kt index 4e222ef3..1fade5b5 100644 --- a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/mocks/GenerateNetworkMockFromNetworkCallUseCase.kt +++ b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/network/usecase/mocks/GenerateNetworkMockFromNetworkCallUseCase.kt @@ -4,21 +4,21 @@ import io.github.openflocon.domain.device.usecase.GetCurrentDeviceIdAndPackageNa import io.github.openflocon.domain.network.models.FloconNetworkCallDomainModel import io.github.openflocon.domain.network.models.MockNetworkDomainModel import io.github.openflocon.domain.network.models.httpCode -import io.github.openflocon.domain.network.usecase.ObserveHttpRequestsByIdUseCase +import io.github.openflocon.domain.network.usecase.ObserveNetworkRequestsByIdUseCase import kotlinx.coroutines.flow.firstOrNull import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid class GenerateNetworkMockFromNetworkCallUseCase( private val getCurrentDeviceIdAndPackageNameUseCase: GetCurrentDeviceIdAndPackageNameUseCase, - private val observeHttpRequestsByIdUseCase: ObserveHttpRequestsByIdUseCase, + private val observeNetworkRequestsByIdUseCase: ObserveNetworkRequestsByIdUseCase, ) { @OptIn(ExperimentalUuidApi::class) suspend operator fun invoke( requestId: String, ): MockNetworkDomainModel? { return getCurrentDeviceIdAndPackageNameUseCase()?.let { deviceIdAndPackageName -> - observeHttpRequestsByIdUseCase(requestId = requestId).firstOrNull() + observeNetworkRequestsByIdUseCase(requestId = requestId).firstOrNull() }?.let { request -> MockNetworkDomainModel( id = Uuid.random().toString(), // generate