diff --git a/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/config/ApiJacksonConfig.kt b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/config/ApiJacksonConfig.kt new file mode 100644 index 000000000..6221b77f3 --- /dev/null +++ b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/config/ApiJacksonConfig.kt @@ -0,0 +1,38 @@ +package co.nilin.opex.api.ports.opex.config + +import co.nilin.opex.api.ports.opex.util.DateToEpochSerializer +import co.nilin.opex.api.ports.opex.util.LocalDateTimeToEpochSerializer +import co.nilin.opex.api.ports.opex.util.LocalDateToEpochSerializer +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.json.JsonMapper +import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import com.fasterxml.jackson.module.kotlin.KotlinModule +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Primary +import java.time.LocalDate +import java.time.LocalDateTime +import java.util.* + +@Configuration +class ApiJacksonConfig { + + @Bean + @Primary + fun apiObjectMapper(): ObjectMapper { + + val module = SimpleModule().apply { + addSerializer(LocalDateTime::class.java, LocalDateTimeToEpochSerializer()) + addSerializer(LocalDate::class.java, LocalDateToEpochSerializer()) + addSerializer(Date::class.java, DateToEpochSerializer()) + + } + + return JsonMapper.builder() + .addModule(JavaTimeModule()) + .addModule(KotlinModule.Builder().build()) + .addModule(module) + .build() + } +} \ No newline at end of file diff --git a/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/util/DateToEpochSerializer.kt b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/util/DateToEpochSerializer.kt new file mode 100644 index 000000000..e68240bdb --- /dev/null +++ b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/util/DateToEpochSerializer.kt @@ -0,0 +1,22 @@ +package co.nilin.opex.api.ports.opex.util + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.JsonSerializer +import com.fasterxml.jackson.databind.SerializerProvider +import java.util.* + +class DateToEpochSerializer : + JsonSerializer() { + + override fun serialize( + value: Date?, + gen: JsonGenerator, + serializers: SerializerProvider + ) { + if (value == null) { + gen.writeNull() + return + } + gen.writeNumber(value.time) + } +} \ No newline at end of file diff --git a/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/util/LocalDateTimeToEpochSerializer.kt b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/util/LocalDateTimeToEpochSerializer.kt new file mode 100644 index 000000000..6820338f8 --- /dev/null +++ b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/util/LocalDateTimeToEpochSerializer.kt @@ -0,0 +1,24 @@ +package co.nilin.opex.api.ports.opex.util + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.JsonSerializer +import com.fasterxml.jackson.databind.SerializerProvider +import java.time.LocalDateTime +import java.time.ZoneOffset + +class LocalDateTimeToEpochSerializer : + JsonSerializer() { + + override fun serialize( + value: LocalDateTime, + gen: JsonGenerator, + serializers: SerializerProvider + ) { + val epochMillis = value + .atOffset(ZoneOffset.UTC) + .toInstant() + .toEpochMilli() + + gen.writeNumber(epochMillis) + } +} diff --git a/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/util/LocalDateToEpochSerializer.kt b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/util/LocalDateToEpochSerializer.kt new file mode 100644 index 000000000..f912065ad --- /dev/null +++ b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/util/LocalDateToEpochSerializer.kt @@ -0,0 +1,27 @@ +package co.nilin.opex.api.ports.opex.util + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.JsonSerializer +import com.fasterxml.jackson.databind.SerializerProvider +import java.time.LocalDate +import java.time.ZoneOffset + +class LocalDateToEpochSerializer : JsonSerializer() { + override fun serialize( + value: LocalDate?, + gen: JsonGenerator, + serializers: SerializerProvider + ) { + if (value == null) { + gen.writeNull() + return + } + + val epochMillis = value + .atStartOfDay(ZoneOffset.UTC) + .toInstant() + .toEpochMilli() + + gen.writeNumber(epochMillis) + } +} \ No newline at end of file