Files
2026-04-28 01:24:04 +09:30

226 lines
7.3 KiB
Kotlin

import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.gradle.jvm.toolchain.JavaLanguageVersion
import java.sql.DriverManager
// Version strings for libraries
val postgresqlVersion: String = "42.7.10"
val flywayVersion: String = "12.4.0"
val jooqVersion: String = "3.21.0"
val logbackVersion: String = "1.5.0"
val springSecurityVersion: String = "6.3.1"
val springdocOpenApiVersion: String = "2.5.0"
val jacksonVersion: String = "2.18.0"
val commonsLang3Version: String = "3.14.0"
val guavaVersion: String = "33.1.0-jre"
val lombokVersion: String = "1.18.30"
val junitVersion: String = "5.10.2"
val mockitoVersion: String = "5.11.0"
val testcontainersVersion: String = "1.20.0"
val h2Version: String = "2.3.232"
val restAssuredVersion: String = "5.4.0"
buildscript {
dependencies {
classpath("org.postgresql:postgresql:42.7.10")
classpath("org.flywaydb:flyway-database-postgresql:12.4.0")
}
}
plugins {
id("org.springframework.boot") version "4.0.+"
id("io.spring.dependency-management") version "1.1.6"
id("org.openapi.generator") version "7.6.0"
id("nu.studer.jooq") version "9.0"
id("org.flywaydb.flyway") version "12.4.0"
id("application")
id("java")
}
group = "net.moustos"
version = "0.1.0"
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-validation")
developmentOnly("org.springframework.boot:spring-boot-devtools")
implementation("org.postgresql:postgresql:$postgresqlVersion")
implementation("org.flywaydb:flyway-core:$flywayVersion")
implementation("org.flywaydb:flyway-database-postgresql:$flywayVersion")
implementation("org.jooq:jooq:$jooqVersion")
implementation("org.jooq:jooq-meta:$jooqVersion")
implementation("org.jooq:jooq-codegen:$jooqVersion")
jooqGenerator("org.postgresql:postgresql:$postgresqlVersion")
jooqGenerator("org.jooq:jooq:$jooqVersion")
jooqGenerator("org.jooq:jooq-meta:$jooqVersion")
jooqGenerator("org.jooq:jooq-codegen:$jooqVersion")
implementation("com.auth0:java-jwt:4.4.0")
implementation("org.springframework.security:spring-security-crypto:$springSecurityVersion")
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:$springdocOpenApiVersion")
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion")
implementation("ch.qos.logback:logback-core:$logbackVersion")
implementation("ch.qos.logback:logback-classic:$logbackVersion")
implementation("net.logstash.logback:logstash-logback-encoder:8.0")
compileOnly("org.projectlombok:lombok:$lombokVersion")
annotationProcessor("org.projectlombok:lombok:$lombokVersion")
implementation("org.apache.commons:commons-lang3:$commonsLang3Version")
implementation("com.google.guava:guava:$guavaVersion")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.security:spring-security-test")
testImplementation("org.testcontainers:testcontainers:$testcontainersVersion")
testImplementation("org.testcontainers:junit-jupiter:$testcontainersVersion")
testImplementation("org.testcontainers:postgresql:$testcontainersVersion")
testImplementation("com.h2database:h2:$h2Version")
testImplementation("org.junit.jupiter:junit-jupiter:$junitVersion")
testImplementation("org.mockito:mockito-core:$mockitoVersion")
testImplementation("org.mockito:mockito-junit-jupiter:$mockitoVersion")
testImplementation("io.rest-assured:rest-assured:$restAssuredVersion")
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(21))
}
}
application {
mainClass.set("net.moustos.mtgsearch.MtgSearchApplication")
}
springBoot {
buildInfo()
}
openApiGenerate {
generatorName.set("spring")
inputSpec.set("$projectDir/openapi/api.yaml")
outputDir.set("$projectDir/build/generated")
apiPackage.set("net.moustos.mtgsearch.api")
modelPackage.set("net.moustos.mtgsearch.model.api")
globalProperties.set(mapOf(
"apis" to "true",
"models" to "true"
))
configOptions.set(mapOf(
"delegatePattern" to "true",
"title" to "MTG Search API",
"interfaceOnly" to "false",
"skipDefaultInterface" to "false",
"useSpringBoot3" to "true",
"useJakartaEe" to "true"
))
}
flyway {
url = project.property("db.url") as String
user = project.property("db.user") as String
password = project.property("db.password") as String
}
jooq {
version.set("$jooqVersion")
configurations {
create("main") {
jooqConfiguration.apply {
jdbc.apply {
driver = "org.postgresql.Driver"
url = project.property("db.url") as String
user = project.property("db.user") as String
password = project.property("db.password") as String
}
generator.apply {
name = "org.jooq.codegen.JavaGenerator"
database.apply {
name = "org.jooq.meta.postgres.PostgresDatabase"
inputSchema = "public"
}
target.apply {
packageName = "net.moustos.mtgsearch.jooq.generated"
directory = "$projectDir/build/generated/jooq"
}
}
}
}
}
}
fun isPostgresAvailable(): Boolean {
val dbUrl = project.property("db.url") as String
val dbUser = project.property("db.user") as String
logger.lifecycle("Checking PostgreSQL availability at $dbUrl with user $dbUser")
return try {
// Load the PostgreSQL driver
Class.forName("org.postgresql.Driver")
DriverManager.setLoginTimeout(10)
DriverManager.getConnection(dbUrl, dbUser, project.property("db.password") as String).use { connection ->
logger.lifecycle("Successfully connected to PostgreSQL database.")
true
}
} catch (ex: Exception) {
logger.error("Failed to connect to PostgreSQL at $dbUrl with user $dbUser: ${ex.message}")
logger.error("Exception details: ", ex)
false
}
}
tasks.named("generateJooq") {
dependsOn("flywayMigrate")
onlyIf {
isPostgresAvailable()
}
doFirst {
logger.lifecycle("Starting jOOQ code generation...")
}
doLast {
logger.lifecycle("Finished jOOQ task.")
}
}
tasks.named("flywayMigrate") {
onlyIf {
isPostgresAvailable()
}
}
tasks.named("compileJava") {
dependsOn("openApiGenerate")
}
sourceSets["main"].java {
srcDir("$buildDir/generated/src/main/java")
srcDir("$buildDir/generated/jooq")
}
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
options.compilerArgs.add("-parameters")
}
tasks.withType<Test> {
useJUnitPlatform()
testLogging {
events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL
showStandardStreams = false
}
}
tasks.named("build") {
dependsOn("openApiGenerate")
}