refact: [NETWORK] format on data part to be able to filter and search… (#288)

Co-authored-by: Florent Champigny <florent@bere.al>
This commit is contained in:
Florent CHAMPIGNY 2025-10-02 14:32:56 +02:00 committed by GitHub
parent 8c6ce2e244
commit 08e58f60f4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 4420 additions and 67 deletions

View file

@ -57,6 +57,16 @@ fun toDomain(
val requestSize = decoded.requestSize ?: 0L
val startTime = decoded.startTime!!
val specificInfos = when {
graphQl != null -> FloconNetworkCallDomainModel.Request.SpecificInfos.GraphQl(
query = graphQl.request.requestBody.query,
operationType = graphQl.request.operationType,
)
decoded.floconNetworkType == "grpc" -> FloconNetworkCallDomainModel.Request.SpecificInfos.Grpc
else -> FloconNetworkCallDomainModel.Request.SpecificInfos.Http
}
val request = FloconNetworkCallDomainModel.Request(
url = decoded.url!!,
startTime = startTime,
@ -67,15 +77,20 @@ fun toDomain(
byteSize = requestSize,
byteSizeFormatted = ByteFormatter.formatBytes(requestSize),
isMocked = decoded.isMocked ?: false,
specificInfos = when {
graphQl != null -> FloconNetworkCallDomainModel.Request.SpecificInfos.GraphQl(
query = graphQl.request.requestBody.query,
operationType = graphQl.request.operationType,
)
decoded.floconNetworkType == "grpc" -> FloconNetworkCallDomainModel.Request.SpecificInfos.Grpc
else -> FloconNetworkCallDomainModel.Request.SpecificInfos.Http
},
specificInfos = specificInfos,
domainFormatted = extractDomain(
requestUrl = decoded.url,
specificInfos = specificInfos,
),
methodFormatted = extractMethod(
requestMethod = decoded.method,
specificInfos = specificInfos,
),
queryFormatted = extractQueryFormatted(
requestUrl = decoded.url,
requestMethod = decoded.method,
specificInfos = specificInfos,
),
)
FloconNetworkCallDomainModel(

View file

@ -0,0 +1,42 @@
package com.flocon.data.remote.network.mapper
import io.github.openflocon.domain.network.models.FloconNetworkCallDomainModel
import io.ktor.http.Url
internal fun extractDomain(
requestUrl: String,
specificInfos: FloconNetworkCallDomainModel.Request.SpecificInfos,
): String = when (specificInfos) {
is FloconNetworkCallDomainModel.Request.SpecificInfos.GraphQl -> extractDomainAndPath(requestUrl)
is FloconNetworkCallDomainModel.Request.SpecificInfos.Http -> extractDomain(requestUrl)
is FloconNetworkCallDomainModel.Request.SpecificInfos.Grpc -> requestUrl
}
private fun extractDomain(url: String): String {
// Parse the URL into a Url object
val parsedUrl = Url(url)
// Use host for the domain
val domainAndPath = parsedUrl.host
// The code below could also work, but host is more precise for the domain
// return parsedUrl.hostWithPort + parsedUrl.fullPath
return domainAndPath.removePrefix("www.")
}
private fun extractDomainAndPath(url: String): String {
// Parse the URL into a Url object
val parsedUrl = Url(url)
// Use host for the domain and encodedPathAndQuery for the path
val domainAndPath = parsedUrl.host + parsedUrl.encodedPathAndQuery
// The code below could also work, but host is more precise for the domain
// return parsedUrl.hostWithPort + parsedUrl.fullPath
return domainAndPath.removePrefix("www.")
}
internal fun extractPath(url: String): String {
val parsedUrl = Url(url)
return parsedUrl.encodedPathAndQuery
}

View file

@ -0,0 +1,14 @@
package com.flocon.data.remote.network.mapper
import io.github.openflocon.domain.network.models.FloconNetworkCallDomainModel
internal fun extractMethod(
requestMethod: String,
specificInfos: FloconNetworkCallDomainModel.Request.SpecificInfos,
): String = when (specificInfos) {
is FloconNetworkCallDomainModel.Request.SpecificInfos.GraphQl -> specificInfos.operationType.lowercase()
is FloconNetworkCallDomainModel.Request.SpecificInfos.Http -> toHttpMethodUi(requestMethod)
is FloconNetworkCallDomainModel.Request.SpecificInfos.Grpc -> "grpc"
}
private fun toHttpMethodUi(httpMethod: String) = httpMethod.lowercase()

View file

@ -0,0 +1,13 @@
package com.flocon.data.remote.network.mapper
import io.github.openflocon.domain.network.models.FloconNetworkCallDomainModel
internal fun extractQueryFormatted(
requestUrl: String,
requestMethod: String,
specificInfos: FloconNetworkCallDomainModel.Request.SpecificInfos,
): String = when (val s = specificInfos) {
is FloconNetworkCallDomainModel.Request.SpecificInfos.GraphQl -> s.query
is FloconNetworkCallDomainModel.Request.SpecificInfos.Http -> extractPath(requestUrl)
is FloconNetworkCallDomainModel.Request.SpecificInfos.Grpc -> requestMethod
}

View file

@ -0,0 +1,25 @@
package com.flocon.data.remote.network.mapper
import io.github.openflocon.domain.network.models.FloconNetworkCallDomainModel
// be sure this keep aligned with the ui mapper
internal fun failureStatus() = "Exception"
internal fun extractStatus(specificInfos: FloconNetworkCallDomainModel.Response.Success.SpecificInfos): String =
when (val s = specificInfos) {
is FloconNetworkCallDomainModel.Response.Success.SpecificInfos.GraphQl -> toGraphQlNetworkStatus(isSuccess = s.isSuccess)
is FloconNetworkCallDomainModel.Response.Success.SpecificInfos.Http -> toNetworkStatus(s.httpCode)
is FloconNetworkCallDomainModel.Response.Success.SpecificInfos.Grpc -> toGrpcNetworkStatus(specificInfos)
}
private fun toNetworkStatus(code: Int): String = code.toString()
private fun toGraphQlNetworkStatus(isSuccess: Boolean): String =
if (isSuccess) "Success" else "Error"
private fun toGrpcNetworkStatus(
specificInfos: FloconNetworkCallDomainModel.Response.Success.SpecificInfos.Grpc
): String {
return specificInfos.grpcStatus
}

View file

@ -1,5 +1,7 @@
package com.flocon.data.remote.network.models
import com.flocon.data.remote.network.mapper.failureStatus
import com.flocon.data.remote.network.mapper.extractStatus
import io.github.openflocon.domain.common.ByteFormatter
import io.github.openflocon.domain.common.time.formatDuration
import io.github.openflocon.domain.network.models.FloconNetworkCallDomainModel
@ -59,27 +61,32 @@ internal fun FloconNetworkResponseDataModel.toDomain(): FloconNetworkResponseOnl
durationMs = durationMs,
issue = responseError,
durationFormatted = durationFormatted,
statusFormatted = failureStatus(),
)
} else {
val responseSize = responseSize ?: 0L
val specificInfos = when (floconNetworkType) {
"grpc" -> FloconNetworkCallDomainModel.Response.Success.SpecificInfos.Grpc(
grpcStatus = responseGrpcStatus!!,
)
// otherwise tread like http
else -> FloconNetworkCallDomainModel.Response.Success.SpecificInfos.Http(
httpCode = responseHttpCode!!,
)
}
FloconNetworkCallDomainModel.Response.Success(
durationMs = durationMs,
contentType = responseContentType,
body = responseBody,
headers = responseHeaders.orEmpty(),
byteSize = responseSize,
specificInfos = when (floconNetworkType) {
"grpc" -> FloconNetworkCallDomainModel.Response.Success.SpecificInfos.Grpc(
grpcStatus = responseGrpcStatus!!,
)
// otherwise tread like http
else -> FloconNetworkCallDomainModel.Response.Success.SpecificInfos.Http(
httpCode = responseHttpCode!!,
)
},
specificInfos = specificInfos,
isImage = isImage,
durationFormatted = durationFormatted,
byteSizeFormatted = ByteFormatter.formatBytes(responseSize)
byteSizeFormatted = ByteFormatter.formatBytes(responseSize),
statusFormatted = extractStatus(specificInfos)
)
}
FloconNetworkResponseOnlyDomainModel(