From 64dafa8789b070ad98405b397fd88326c4e11771 Mon Sep 17 00:00:00 2001 From: Florent CHAMPIGNY Date: Thu, 7 Aug 2025 16:37:37 +0200 Subject: [PATCH] refact: [NETWORK] lite models (#71) * Revert "Fix an issue with the release yml (#58)" This reverts commit 1707aebf0fe4d54c823960355c00affddff0f6fc. * refact: [NETWORK] lite models --------- Co-authored-by: Florent Champigny --- .../network/data/NetworkRepositoryImpl.kt | 4 +- .../datasource/local/FloconHttpRequestDao.kt | 12 +++++ .../local/NetworkLocalDataSource.kt | 2 +- .../local/NetworkLocalDataSourceRoom.kt | 22 ++++++--- .../data/datasource/local/mapper/Mapper.kt | 41 +++++++++++++++++ .../model/FloconHttpRequestEntityLite.kt | 46 +++++++++++++++++++ .../domain/ObserveHttpRequestsUseCase.kt | 5 +- .../domain/repository/NetworkRepository.kt | 3 +- .../features/network/ui/NetworkViewModel.kt | 2 +- 9 files changed, 124 insertions(+), 13 deletions(-) create mode 100644 FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/model/FloconHttpRequestEntityLite.kt diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/NetworkRepositoryImpl.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/NetworkRepositoryImpl.kt index 67bcbb1f..00738292 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/NetworkRepositoryImpl.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/NetworkRepositoryImpl.kt @@ -32,8 +32,8 @@ class NetworkRepositoryImpl( override val pluginName = listOf(Protocol.FromDevice.Network.Plugin) - override fun observeRequests(deviceId: String) = networkLocalDataSource - .observeRequests(deviceId = deviceId) + override fun observeRequests(deviceId: String, lite: Boolean) = networkLocalDataSource + .observeRequests(deviceId = deviceId, lite = lite) .flowOn(dispatcherProvider.data) override fun observeRequest( diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/FloconHttpRequestDao.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/FloconHttpRequestDao.kt index c92ec318..6a3a5aac 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/FloconHttpRequestDao.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/FloconHttpRequestDao.kt @@ -6,6 +6,7 @@ import androidx.room.OnConflictStrategy import androidx.room.Query import io.github.openflocon.flocondesktop.DeviceId import io.github.openflocon.flocondesktop.features.network.data.datasource.local.model.FloconHttpRequestEntity +import io.github.openflocon.flocondesktop.features.network.data.datasource.local.model.FloconHttpRequestEntityLite import kotlinx.coroutines.flow.Flow @Dao @@ -20,6 +21,17 @@ interface FloconHttpRequestDao { ) fun observeRequests(deviceId: String): Flow> + @Query( + """ + SELECT * + FROM FloconHttpRequestEntity + WHERE deviceId = :deviceId + ORDER BY startTime ASC + """, + ) + fun observeRequestsLite(deviceId: String): Flow> + + @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun upsertRequest(request: FloconHttpRequestEntity) diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/NetworkLocalDataSource.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/NetworkLocalDataSource.kt index bbb65521..1d54ffb3 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/NetworkLocalDataSource.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/NetworkLocalDataSource.kt @@ -5,7 +5,7 @@ import io.github.openflocon.flocondesktop.features.network.domain.model.FloconHt import kotlinx.coroutines.flow.Flow interface NetworkLocalDataSource { - fun observeRequests(deviceId: DeviceId): Flow> + fun observeRequests(deviceId: DeviceId, lite: Boolean): Flow> fun observeRequest( deviceId: DeviceId, diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/NetworkLocalDataSourceRoom.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/NetworkLocalDataSourceRoom.kt index 6f50782f..14238b4f 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/NetworkLocalDataSourceRoom.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/NetworkLocalDataSourceRoom.kt @@ -22,7 +22,8 @@ class NetworkLocalDataSourceRoom( init { if (Fakes.Enabled) { applicationScope.launch(dispatcherProvider.data) { - val fakeRequests = FloconHttpRequestGenerator.generateDynamicFakeFloconHttpRequests(count = 10) + val fakeRequests = + FloconHttpRequestGenerator.generateDynamicFakeFloconHttpRequests(count = 10) fakeRequests.forEach { domainModel -> floconHttpRequestDao.upsertRequest(domainModel.toEntity(Fakes.FakeDeviceId)) } @@ -30,11 +31,20 @@ class NetworkLocalDataSourceRoom( } } - override fun observeRequests(deviceId: DeviceId): Flow> = floconHttpRequestDao - .observeRequests(deviceId) - .map { entities -> - entities.mapNotNull { it.toDomainModel() } - }.flowOn(dispatcherProvider.data) + override fun observeRequests( + deviceId: DeviceId, + lite: Boolean + ): Flow> = floconHttpRequestDao + .let { + if (lite) + it.observeRequestsLite(deviceId).map { entities -> + entities.mapNotNull { it.toDomainModel() } + } + else it.observeRequests(deviceId).map { entities -> + entities.mapNotNull { it.toDomainModel() } + } + } + .flowOn(dispatcherProvider.data) override suspend fun save( deviceId: DeviceId, diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/mapper/Mapper.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/mapper/Mapper.kt index 64e46141..91d224b8 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/mapper/Mapper.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/mapper/Mapper.kt @@ -1,6 +1,7 @@ package io.github.openflocon.flocondesktop.features.network.data.datasource.local.mapper import io.github.openflocon.flocondesktop.features.network.data.datasource.local.model.FloconHttpRequestEntity +import io.github.openflocon.flocondesktop.features.network.data.datasource.local.model.FloconHttpRequestEntityLite import io.github.openflocon.flocondesktop.features.network.data.datasource.local.model.FloconHttpRequestInfosEntity import io.github.openflocon.flocondesktop.features.network.domain.model.FloconHttpRequestDomainModel @@ -89,3 +90,43 @@ fun FloconHttpRequestEntity.toDomainModel(): FloconHttpRequestDomainModel? { }, ) } + + +fun FloconHttpRequestEntityLite.toDomainModel(): FloconHttpRequestDomainModel? { + return FloconHttpRequestDomainModel( + uuid = this.uuid, + url = this.url, + durationMs = this.durationMs, + request = FloconHttpRequestDomainModel.Request( + method = this.method, + startTime = this.startTime, + headers = emptyMap(), // removed for lite + body = null, // removed for lite + byteSize = 0L, // removed for lite + ), + response = FloconHttpRequestDomainModel.Response( + contentType = null, // removed for lite + body = null, // removed for lite + headers = emptyMap(), // removed for lite + byteSize = 0L, // removed for lite + ), + type = when { + this.graphql != null -> FloconHttpRequestDomainModel.Type.GraphQl( + query = this.graphql.query, + operationType = this.graphql.operationType, + isSuccess = this.graphql.isSuccess, + httpCode = this.graphql.responseHttpCode, + ) + + this.http != null -> FloconHttpRequestDomainModel.Type.Http( + httpCode = this.http.responseHttpCode, + ) + + this.grpc != null -> FloconHttpRequestDomainModel.Type.Grpc( + responseStatus = this.grpc.responseStatus, + ) + + else -> return null + }, + ) +} diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/model/FloconHttpRequestEntityLite.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/model/FloconHttpRequestEntityLite.kt new file mode 100644 index 00000000..8216c2eb --- /dev/null +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/data/datasource/local/model/FloconHttpRequestEntityLite.kt @@ -0,0 +1,46 @@ +package io.github.openflocon.flocondesktop.features.network.data.datasource.local.model + +import androidx.room.Embedded +import androidx.room.Entity +import androidx.room.PrimaryKey + +data class FloconHttpRequestEntityLite( + val uuid: String, + val deviceId: String, // To associate with a device + // if it's a graphql method, this item is not null + @Embedded(prefix = "graphql_") + val graphql: GraphQlEmbedded?, + + @Embedded(prefix = "http_") + val http: HttpEmbedded?, + + @Embedded(prefix = "grpc_") + val grpc: GrpcEmbedded?, + + val url: String, + val method: String, + val startTime: Long, + val durationMs: Double, + // removed val requestHeaders: Map, + // removed val requestBody: String?, + // removed val requestByteSize: Long, + // removed val responseContentType: String?, + // removed val responseBody: String?, + // removed val responseHeaders: Map, + // removed val responseByteSize: Long, +) { + data class GraphQlEmbedded( + val query: String, + val operationType: String, + val isSuccess: Boolean, + val responseHttpCode: Int, + ) + + data class HttpEmbedded( + val responseHttpCode: Int, + ) + + data class GrpcEmbedded( + val responseStatus: String, + ) +} diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/domain/ObserveHttpRequestsUseCase.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/domain/ObserveHttpRequestsUseCase.kt index b1431982..52a9d228 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/domain/ObserveHttpRequestsUseCase.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/domain/ObserveHttpRequestsUseCase.kt @@ -12,12 +12,13 @@ class ObserveHttpRequestsUseCase( private val networkRepository: NetworkRepository, private val observeCurrentDeviceIdUseCase: ObserveCurrentDeviceIdUseCase, ) { - operator fun invoke(): Flow> = observeCurrentDeviceIdUseCase() + // lite : exclude headers, sizes, body + operator fun invoke(lite: Boolean): Flow> = observeCurrentDeviceIdUseCase() .flatMapLatest { deviceId -> if (deviceId == null) { flowOf(emptyList()) } else { - networkRepository.observeRequests(deviceId) + networkRepository.observeRequests(deviceId = deviceId, lite = lite) } }.distinctUntilChanged() } diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/domain/repository/NetworkRepository.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/domain/repository/NetworkRepository.kt index c51013e4..c0c988fa 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/domain/repository/NetworkRepository.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/domain/repository/NetworkRepository.kt @@ -5,7 +5,8 @@ import io.github.openflocon.flocondesktop.features.network.domain.model.FloconHt import kotlinx.coroutines.flow.Flow interface NetworkRepository { - fun observeRequests(deviceId: String): Flow> + // lite : exclude headers, sizes, body + fun observeRequests(deviceId: String, lite: Boolean): Flow> fun observeRequest( deviceId: String, diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/ui/NetworkViewModel.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/ui/NetworkViewModel.kt index 1b9092c2..b83d8c29 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/ui/NetworkViewModel.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/network/ui/NetworkViewModel.kt @@ -63,7 +63,7 @@ class NetworkViewModel( .stateIn(viewModelScope, started = SharingStarted.WhileSubscribed(5_000), null) private val filteredItems = combine( - observeHttpRequestsUseCase().map { list -> + observeHttpRequestsUseCase(lite = true).map { list -> list.map { Pair( it,