1
0

refactor: leverage mappie

Signed-off-by: Alan Brault <alan.brault@visus.io>
This commit is contained in:
2026-03-02 07:45:48 -05:00
parent 767f0f9f0f
commit b316d0fbb4
6 changed files with 37 additions and 28 deletions

View File

@@ -4,6 +4,7 @@ plugins {
id("org.springframework.boot") version "4.1.0-M2" id("org.springframework.boot") version "4.1.0-M2"
id("io.spring.dependency-management") version "1.1.7" id("io.spring.dependency-management") version "1.1.7"
id("org.jlleitschuh.gradle.ktlint") version "12.1.0" id("org.jlleitschuh.gradle.ktlint") version "12.1.0"
id("tech.mappie.plugin") version "2.2.21-2.1.1"
} }
group = "io.visus.demos" group = "io.visus.demos"
@@ -43,6 +44,7 @@ dependencies {
implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-webmvc") implementation("org.springframework.boot:spring-boot-starter-webmvc")
implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("tech.mappie:mappie-api:2.2.21-2.1.1")
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4") implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4")
testImplementation("org.springframework.boot:spring-boot-starter-mongodb-test") testImplementation("org.springframework.boot:spring-boot-starter-mongodb-test")
testImplementation("org.springframework.boot:spring-boot-starter-restclient-test") testImplementation("org.springframework.boot:spring-boot-starter-restclient-test")

View File

@@ -1,7 +1,6 @@
package io.visus.demos.kotlinapi.api.dto package io.visus.demos.kotlinapi.api.dto
import io.swagger.v3.oas.annotations.media.Schema import io.swagger.v3.oas.annotations.media.Schema
import io.visus.demos.kotlinapi.domain.model.ComponentHealth
@Schema(description = "Health status of an individual component") @Schema(description = "Health status of an individual component")
data class ComponentHealthDto( data class ComponentHealthDto(
@@ -9,12 +8,4 @@ data class ComponentHealthDto(
val status: String, val status: String,
@Schema(description = "Optional message with additional details", example = "MongoDB connection is active") @Schema(description = "Optional message with additional details", example = "MongoDB connection is active")
val message: String? = null, val message: String? = null,
) {
companion object {
fun from(componentHealth: ComponentHealth): ComponentHealthDto =
ComponentHealthDto(
status = componentHealth.status.name,
message = componentHealth.message,
) )
}
}

View File

@@ -1,8 +1,6 @@
package io.visus.demos.kotlinapi.api.dto package io.visus.demos.kotlinapi.api.dto
import io.swagger.v3.oas.annotations.media.Schema import io.swagger.v3.oas.annotations.media.Schema
import io.visus.demos.kotlinapi.domain.model.ComponentHealth
import io.visus.demos.kotlinapi.domain.model.HealthStatus
@Schema(description = "Health check response") @Schema(description = "Health check response")
data class HealthResponse( data class HealthResponse(
@@ -12,18 +10,4 @@ data class HealthResponse(
val timestamp: String, val timestamp: String,
@Schema(description = "Status of individual components") @Schema(description = "Status of individual components")
val components: Map<String, ComponentHealthDto>? = null, val components: Map<String, ComponentHealthDto>? = null,
) {
companion object {
fun from(healthStatus: HealthStatus): HealthResponse =
HealthResponse(
status = healthStatus.status.name,
timestamp = healthStatus.timestamp.toString(),
components =
if (healthStatus.components.isNotEmpty()) {
healthStatus.components.mapValues { ComponentHealthDto.from(it.value) }
} else {
null
},
) )
}
}

View File

@@ -0,0 +1,14 @@
package io.visus.demos.kotlinapi.api.mappers
import io.visus.demos.kotlinapi.api.dto.ComponentHealthDto
import io.visus.demos.kotlinapi.domain.model.ComponentHealth
import tech.mappie.api.ObjectMappie
object ComponentHealthDtoMapper : ObjectMappie<ComponentHealth, ComponentHealthDto>() {
override fun map(from: ComponentHealth): ComponentHealthDto {
return ComponentHealthDto(
status = from.status.name,
message = from.message,
)
}
}

View File

@@ -0,0 +1,17 @@
package io.visus.demos.kotlinapi.api.mappers
import io.visus.demos.kotlinapi.api.dto.HealthResponse
import io.visus.demos.kotlinapi.domain.model.HealthStatus
import tech.mappie.api.ObjectMappie
object HealthResponseMapper : ObjectMappie<HealthStatus, HealthResponse>() {
override fun map(from: HealthStatus): HealthResponse {
return HealthResponse(
status = from.status.name,
timestamp = from.timestamp.toString(),
components = from.components.mapValues { (_, componentHealth) ->
ComponentHealthDtoMapper.map(componentHealth)
}
)
}
}

View File

@@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema
import io.swagger.v3.oas.annotations.responses.ApiResponse import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.tags.Tag import io.swagger.v3.oas.annotations.tags.Tag
import io.visus.demos.kotlinapi.api.dto.HealthResponse import io.visus.demos.kotlinapi.api.dto.HealthResponse
import io.visus.demos.kotlinapi.api.mappers.HealthResponseMapper
import io.visus.demos.kotlinapi.domain.model.HealthStatus import io.visus.demos.kotlinapi.domain.model.HealthStatus
import io.visus.demos.kotlinapi.domain.model.Status import io.visus.demos.kotlinapi.domain.model.Status
import io.visus.demos.kotlinapi.domain.service.HealthService import io.visus.demos.kotlinapi.domain.service.HealthService
@@ -50,7 +51,7 @@ class HealthController(
fun health(): ResponseEntity<HealthResponse> { fun health(): ResponseEntity<HealthResponse> {
val componentHealths = healthCheckServices.map { it.check() } val componentHealths = healthCheckServices.map { it.check() }
val healthStatus = HealthStatus.fromComponents(componentHealths) val healthStatus = HealthStatus.fromComponents(componentHealths)
val response = HealthResponse.from(healthStatus) val response = HealthResponseMapper.map(healthStatus)
val httpStatus = val httpStatus =
when (healthStatus.status) { when (healthStatus.status) {