Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
[*.{kt,kts}]
ij_kotlin_allow_trailing_comma = false
ij_kotlin_allow_trailing_comma_on_call_site = false
ktlint_code_style = intellij_idea
ktlint_standard_no-unused-imports = enabled
26 changes: 15 additions & 11 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
id("io.spring.dependency-management") version "1.1.4"
id("org.jmailen.kotlinter") version "4.1.0"
id("io.spring.dependency-management") version "1.1.7"
id("org.jmailen.kotlinter") version "5.5.0"
id("maven-publish")
id("java-library")
kotlin("jvm") version "1.9.21"
kotlin("plugin.spring") version "1.9.21"
kotlin("jvm") version "2.4.0"
kotlin("plugin.spring") version "2.4.0"
id("net.thebugmc.gradle.sonatype-central-portal-publisher") version "1.2.4"
}

group = "com.valensas"
java.sourceCompatibility = JavaVersion.VERSION_17
java.sourceCompatibility = JavaVersion.VERSION_21

repositories {
mavenCentral()
Expand All @@ -23,23 +24,26 @@ dependencies {
compileOnly("org.springframework.boot:spring-boot-starter-webflux")
implementation("org.springframework.data:spring-data-commons")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("com.valensas:exception:2.4.2")
implementation("com.valensas:exception:2.5.0")
compileOnly("io.micrometer:micrometer-core")
api("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.7.3")
api("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.11.0")
testImplementation("org.springframework.boot:spring-boot-starter-webflux")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "17"
compilerOptions {
freeCompilerArgs.addAll("-Xjsr305=strict")
jvmTarget = JvmTarget.JVM_21
}
}

extra["kotlin.version"] = "2.4.0"

dependencyManagement {
imports {
mavenBom("org.springframework.boot:spring-boot-dependencies:3.2.0")
mavenBom("org.springframework.boot:spring-boot-dependencies:3.5.15")
}
}

Expand Down
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
2 changes: 1 addition & 1 deletion gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 10 additions & 10 deletions gradlew.bat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,17 @@ class ClientIpExtractorConfig(
serverWebExchange: ServerWebExchange,
webFilterChain: WebFilterChain
): Mono<Void> {
if (serverWebExchange.request.path.toString().startsWith(managementBasePath)) return webFilterChain.filter(serverWebExchange)
if (serverWebExchange.request.path
.toString()
.startsWith(managementBasePath)
) {
return webFilterChain.filter(serverWebExchange)
}

val clientIp = serverWebExchange.request.headers.getFirst("x-client-ip")
if (clientIp == null) logger.trace("Failed to fetch client ip from header x-client-ip")
return webFilterChain.filter(serverWebExchange)
return webFilterChain
.filter(serverWebExchange)
.contextWrite { context: Context ->
clientIp?.let { context.put("ClientIp", clientIp) } ?: context
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,13 @@ class JacksonConfiguration {
fun jackson2ObjectMapperBuilder(
@Value("\${valensas.server.bigdecimal.scale:8}")
scale: Int
): Jackson2ObjectMapperBuilder =
Jackson2ObjectMapperBuilder()
.deserializerByType(BigDecimal::class.java, BigDecimalMoneyDeserializer(scale))
.serializerByType(Instant::class.java, InstantSerializer())
.createXmlMapper(false)
.featuresToDisable(
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,
SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS
)
.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES)
): Jackson2ObjectMapperBuilder = Jackson2ObjectMapperBuilder()
.deserializerByType(BigDecimal::class.java, BigDecimalMoneyDeserializer(scale))
.serializerByType(Instant::class.java, InstantSerializer())
.createXmlMapper(false)
.featuresToDisable(
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,
SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS
).featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES)
}
17 changes: 11 additions & 6 deletions src/main/kotlin/com/valensas/util/exception/Exceptions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,22 @@ package com.valensas.util.exception

import com.valensas.exception.BadRequest

class InvalidPageSize(max: Int) : BadRequest(
class InvalidPageSize(
max: Int
) : BadRequest(
"Page size must be between 0 and $max",
"INVALID_PAGE_SIZE"
)

class InvalidPageNumber : BadRequest(
"Page number must not be less than zero",
"INVALID_PAGE_NUMBER"
)
class InvalidPageNumber :
BadRequest(
"Page number must not be less than zero",
"INVALID_PAGE_NUMBER"
)

class InvalidSortDirection(direction: String) : BadRequest(
class InvalidSortDirection(
direction: String
) : BadRequest(
"Invalid value:$direction, has to be either 'desc' or 'asc' (case insensitive)",
"INVALID_SORT_DIRECTION"
)
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ suspend fun <T> Collection<T>.parallelForEach(mapper: suspend (T) -> Unit) {

suspend fun <T, U> Collection<T>.parallelMap(mapper: suspend (T) -> U): List<U> {
if (this.isEmpty()) return emptyList()
return Flux.fromIterable(this).flatMap { mono { mapper(it) } }.collectList().awaitSingle()
return Flux
.fromIterable(this)
.flatMap { mono { mapper(it) } }
.collectList()
.awaitSingle()
}

suspend fun <T> Flux<T>.parallelForEach(function: suspend (T) -> Unit) {
Expand Down
14 changes: 7 additions & 7 deletions src/main/kotlin/com/valensas/util/pagination/Pageable.kt
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ fun Pageable.toJavaPageable(): PageRequest {
}

private fun parseParameterIntoSort(sort: String?): Sort {
return sort?.replace(" ", "")
return sort
?.replace(" ", "")
?.split(";")
?.mapNotNull { part ->
val element = part.split(",")
Expand All @@ -58,13 +59,12 @@ private fun parseParameterIntoSort(sort: String?): Sort {
} else {
if (direction != null) Sort.Order(direction, property) else Sort.Order.by(property)
}
}
?.takeIf { it.isNotEmpty() }
}?.takeIf { it.isNotEmpty() }
?.let { Sort.by(it) }
?: Sort.unsorted()
}

fun UriBuilder.pageable(pageable: Pageable) =
this.queryParam("page", pageable.page)
.queryParam("sort", pageable.sort)
.queryParam("size", pageable.size)
fun UriBuilder.pageable(pageable: Pageable) = this
.queryParam("page", pageable.page)
.queryParam("sort", pageable.sort)
.queryParam("size", pageable.size)
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,5 @@ class BigDecimalMoneyDeserializer(
override fun deserialize(
jp: JsonParser,
ctx: DeserializationContext
): BigDecimal {
return BigDecimal(jp.valueAsString).setScale(scale, RoundingMode.HALF_UP)
}
): BigDecimal = BigDecimal(jp.valueAsString).setScale(scale, RoundingMode.HALF_UP)
}
Loading