diff --git a/build.gradle.kts b/build.gradle.kts index a985cba8..21a04252 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,189 +1,37 @@ - -import java.time.Instant -import java.time.ZoneId -import java.time.format.DateTimeFormatter - plugins { - val ktVer = "2.1.10" - - java - kotlin("jvm") version ktVer - kotlin("plugin.spring") version ktVer - kotlin("plugin.jpa") version ktVer - kotlin("plugin.serialization") version ktVer - kotlin("plugin.allopen") version ktVer - kotlin("kapt") version ktVer - id("org.springframework.boot") version "3.2.3" + kotlin("jvm") version "2.1.10" apply false + kotlin("plugin.spring") version "2.1.10" apply false + kotlin("plugin.jpa") version "2.1.10" apply false + kotlin("plugin.serialization") version "2.1.10" apply false + kotlin("plugin.allopen") version "2.1.10" apply false + kotlin("kapt") version "2.1.10" apply false + id("org.springframework.boot") version "3.2.3" apply false + id("io.spring.dependency-management") version "1.1.4" apply false id("com.github.ben-manes.versions") version "0.51.0" - id("org.hibernate.orm") version "6.4.4.Final" - application } -apply(plugin = "io.spring.dependency-management") +allprojects { + group = "icu.samnyan.aqua" + version = "1.0.0" -repositories { - mavenLocal() - mavenCentral() -} - -dependencies { - // Spring boot - implementation("org.springframework.boot:spring-boot-starter-data-jpa") - implementation("org.springframework.boot:spring-boot-starter-security") - implementation("org.springframework.boot:spring-boot-starter-web") { - exclude(group = "org.springframework.boot", module = "spring-boot-starter-tomcat") - } - implementation("org.springframework.boot:spring-boot-starter-jetty") - implementation("io.netty:netty-all") - implementation("org.apache.commons:commons-lang3:3.14.0") - implementation("org.apache.httpcomponents.client5:httpclient5") - implementation("org.flywaydb:flyway-core:10.10.0") - implementation("org.flywaydb:flyway-mysql:10.10.0") - testImplementation("org.springframework.boot:spring-boot-starter-test") { - exclude(group = "org.junit.vintage", module = "junit-vintage-engine") - } - testImplementation("org.springframework.security:spring-security-test") - implementation("net.logstash.logback:logstash-logback-encoder:7.4") - - // Metrics - implementation("org.springframework.boot:spring-boot-starter-actuator") - implementation("io.micrometer:micrometer-registry-prometheus") - - // Database - runtimeOnly("org.mariadb.jdbc:mariadb-java-client:3.3.3") - runtimeOnly("org.xerial:sqlite-jdbc:3.45.2.0") - implementation("org.hibernate.orm:hibernate-core:6.4.4.Final") - implementation("org.hibernate.orm:hibernate-community-dialects:6.4.4.Final") - implementation("io.github.openfeign.querydsl:querydsl-jpa:6.10.1") - kapt("io.github.openfeign.querydsl:querydsl-apt:6.10.1:jpa") - - // JSR305 for nullable - implementation("com.google.code.findbugs:jsr305:3.0.2") - - // ============================= - // AquaNet Specific Dependencies - // ============================= - - // Network - implementation("io.ktor:ktor-client-core:3.0.3") - implementation("io.ktor:ktor-client-cio:3.0.3") - implementation("io.ktor:ktor-client-content-negotiation:3.0.3") - implementation("io.ktor:ktor-client-encoding:3.0.3") - implementation("io.ktor:ktor-serialization-kotlinx-json:3.0.3") - implementation("org.jetbrains.kotlin:kotlin-reflect") - - // Somehow these are needed for ktor even though they're not in the documentation - runtimeOnly("org.reactivestreams:reactive-streams:1.0.4") - runtimeOnly("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.8.0") - - // Email - implementation("org.simplejavamail:simple-java-mail:8.6.3") - implementation("org.simplejavamail:spring-module:8.6.3") - - // GeoIP - implementation("com.maxmind.geoip2:geoip2:4.2.0") - - // JWT Authentication - implementation("io.jsonwebtoken:jjwt-api:0.12.5") - runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.5") - runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.5") - - // Content validation - implementation("org.apache.tika:tika-core:2.9.1") - - // Import: DateTime Parsing - implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.0") - - // Serialization - implementation("com.fasterxml.jackson.module:jackson-module-kotlin") - - // Testing - testImplementation("io.kotest:kotest-runner-junit5-jvm:5.8.1") - testImplementation("io.kotest:kotest-assertions-core") -} - -group = "icu.samnya" -version = "1.0.0" -description = "AquaDX Arcade Server" -java.sourceCompatibility = JavaVersion.VERSION_21 - -kotlin { - jvmToolchain(21) -} - -springBoot { - mainClass.set("icu.samnyan.aqua.EntryKt") -} - -application { - mainClass = "icu.samnyan.aqua.EntryKt" -} - -hibernate { - enhancement { - enableLazyInitialization = true - enableAssociationManagement = false - enableExtendedEnhancement = false + repositories { + mavenLocal() + mavenCentral() } } -kapt { - includeCompileClasspath = false - keepJavacAnnotationProcessors = true -} +subprojects { + apply(plugin = "org.jetbrains.kotlin.jvm") -allOpen { - annotation("jakarta.persistence.Entity") - annotation("jakarta.persistence.MappedSuperclass") - annotation("jakarta.persistence.Embeddable") -} + // Use configure to access the extension safely in subprojects + configure { + jvmToolchain(21) + } -val buildTime: String by extra(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z").withZone(ZoneId.of("UTC")).format(Instant.now())) - -tasks.processResources { - filesMatching("**/application.properties") { - expand(project.properties) + tasks.withType { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21) + freeCompilerArgs.add("-Xjsr305=strict") + } } } - -tasks.test { - enabled = false - useJUnitPlatform() - jvmArgs("-Dkotest.assertions.collection.print.size=100") -} - -tasks.withType { - options.encoding = "UTF-8" -} - -tasks.withType { - options.encoding = "UTF-8" -} - -tasks.getByName("jar") { - enabled = false -} - -sourceSets { - main { - java.srcDir("${layout.buildDirectory.get()}/generated/source/kapt/main") - } -} - -val copyDependencies by tasks.registering(Copy::class) { - from(configurations.runtimeClasspath) - into("${layout.buildDirectory.get()}/libs/lib") -} - -val packageThin by tasks.registering(Jar::class) { - group = "build" - from(sourceSets.main.get().output) - manifest { - attributes( - "Main-Class" to "icu.samnyan.aqua.EntryKt", - "Class-Path" to configurations.runtimeClasspath.get().files.joinToString(" ") { "lib/${it.name}" } - ) - } - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - dependsOn(copyDependencies) -} diff --git a/comet/build.gradle.kts b/comet/build.gradle.kts new file mode 100644 index 00000000..7ab64514 --- /dev/null +++ b/comet/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + kotlin("jvm") + kotlin("plugin.serialization") + id("application") +} + +dependencies { + implementation(project(":shared")) + + // Network + implementation("io.ktor:ktor-client-core:3.0.3") + implementation("io.ktor:ktor-client-cio:3.0.3") + implementation("io.ktor:ktor-client-content-negotiation:3.0.3") + implementation("io.ktor:ktor-serialization-kotlinx-json:3.0.3") + + // Serialization + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.0") + + // Testing + testImplementation("io.kotest:kotest-runner-junit5-jvm:5.8.1") +} + +application { + mainClass = "icu.samnyan.aqua.comet.EntryKt" +} diff --git a/planet/application.properties b/planet/application.properties new file mode 100644 index 00000000..6122d6bf --- /dev/null +++ b/planet/application.properties @@ -0,0 +1,39 @@ +# This configuration file is for define default values +# User should use application.properties in the /config folder instead, not this +aimedb.server.enable=true +aimedb.server.address=0.0.0.0 +aimedb.server.port=22345 + +billing.server.enable=true +billing.server.port=8443 + +aquaviewer.server.enable=true + +server.port=80 + +build.version=${version} +build.timestamp=${ext.buildTime} + +spring.servlet.multipart.max-file-size=10MB +spring.servlet.multipart.max-request-size=20MB + +spring.flyway.clean-disabled=false +spring.flyway.baseline-on-migrate=true +spring.flyway.locations=classpath:db +spring.flyway.out-of-order=true +spring.flyway.validate-on-migrate=false +spring.jpa.hibernate.ddl-auto=none + +# Force color output even in non-tty mode +# Note: If your terminal doesn't support colors, uninstall your terminal and use one that does +# https://github.com/termstandard/colors#truecolor-support-in-output-devices +# If you want to read the logs using a script, read the json logs in `logs` folder instead. +spring.output.ansi.enabled=always + +# Metrics +management.server.port=8081 +management.endpoint.prometheus.enabled=true +management.endpoints.web.exposure.include=prometheus +management.metrics.distribution.percentiles.http.server.requests=0.5, 0.75, 0.9, 0.95, 0.99 +management.metrics.distribution.percentiles.tasks.scheduled.execution=0.5, 0.75, 0.9, 0.95, 0.99 +management.metrics.distribution.percentiles.spring.data.repository.invocations=0.5, 0.75, 0.9, 0.95, 0.99 diff --git a/planet/build.gradle.kts b/planet/build.gradle.kts new file mode 100644 index 00000000..c1746763 --- /dev/null +++ b/planet/build.gradle.kts @@ -0,0 +1,181 @@ +import java.time.ZonedDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +plugins { + val ktVer = "2.1.10" + + java + kotlin("jvm") version ktVer + kotlin("plugin.spring") version ktVer + kotlin("plugin.jpa") version ktVer + kotlin("plugin.serialization") version ktVer + kotlin("plugin.allopen") version ktVer + kotlin("kapt") version ktVer + id("org.springframework.boot") version "3.2.3" + id("io.spring.dependency-management") version "1.1.4" + id("com.github.ben-manes.versions") version "0.51.0" + id("org.hibernate.orm") version "6.4.4.Final" + application +} + +dependencies { + implementation(project(":shared")) + + // Spring boot + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.springframework.boot:spring-boot-starter-security") + implementation("org.springframework.boot:spring-boot-starter-web") { + exclude(group = "org.springframework.boot", module = "spring-boot-starter-tomcat") + } + implementation("org.springframework.boot:spring-boot-starter-jetty") + implementation("io.netty:netty-all") + implementation("org.apache.commons:commons-lang3:3.14.0") + implementation("org.apache.httpcomponents.client5:httpclient5") + implementation("org.flywaydb:flyway-core:10.10.0") + implementation("org.flywaydb:flyway-mysql:10.10.0") + testImplementation("org.springframework.boot:spring-boot-starter-test") { + exclude(group = "org.junit.vintage", module = "junit-vintage-engine") + } + testImplementation("org.springframework.security:spring-security-test") + implementation("net.logstash.logback:logstash-logback-encoder:7.4") + + // Metrics + implementation("org.springframework.boot:spring-boot-starter-actuator") + implementation("io.micrometer:micrometer-registry-prometheus") + + // Database + runtimeOnly("org.mariadb.jdbc:mariadb-java-client:3.3.3") + runtimeOnly("org.xerial:sqlite-jdbc:3.45.2.0") + implementation("org.hibernate.orm:hibernate-core:6.4.4.Final") + implementation("org.hibernate.orm:hibernate-community-dialects:6.4.4.Final") + implementation("io.github.openfeign.querydsl:querydsl-jpa:6.10.1") + kapt("io.github.openfeign.querydsl:querydsl-apt:6.10.1:jpa") + + // JSR305 for nullable + implementation("com.google.code.findbugs:jsr305:3.0.2") + + // Network + implementation("io.ktor:ktor-client-core:3.0.3") + implementation("io.ktor:ktor-client-cio:3.0.3") + implementation("io.ktor:ktor-client-content-negotiation:3.0.3") + implementation("io.ktor:ktor-client-encoding:3.0.3") + implementation("io.ktor:ktor-serialization-kotlinx-json:3.0.3") + implementation("org.jetbrains.kotlin:kotlin-reflect") + + runtimeOnly("org.reactivestreams:reactive-streams:1.0.4") + runtimeOnly("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.8.0") + + // Email + implementation("org.simplejavamail:simple-java-mail:8.6.3") + implementation("org.simplejavamail:spring-module:8.6.3") + + // GeoIP + implementation("com.maxmind.geoip2:geoip2:4.2.0") + + // JWT Authentication + implementation("io.jsonwebtoken:jjwt-api:0.12.5") + runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.5") + runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.5") + + // Content validation + implementation("org.apache.tika:tika-core:2.9.1") + + // Import: DateTime Parsing + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.0") + + // Serialization + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + + // Testing + testImplementation("io.kotest:kotest-runner-junit5-jvm:5.8.1") + testImplementation("io.kotest:kotest-assertions-core") +} + +group = "icu.samnyan.aqua" +version = "1.0.0" +description = "AquaDX Planet Server" +java.sourceCompatibility = JavaVersion.VERSION_21 + +kotlin { + jvmToolchain(21) +} + +springBoot { + mainClass.set("icu.samnyan.aqua.EntryKt") +} + +application { + mainClass = "icu.samnyan.aqua.EntryKt" +} + +hibernate { + enhancement { + enableLazyInitialization = true + enableAssociationManagement = false + enableExtendedEnhancement = false + } +} + +kapt { + includeCompileClasspath = false + keepJavacAnnotationProcessors = true +} + +allOpen { + annotation("jakarta.persistence.Entity") + annotation("jakarta.persistence.MappedSuperclass") + annotation("jakarta.persistence.Embeddable") +} + +tasks.processResources { + val buildTime = ZonedDateTime.now(ZoneId.of("UTC")) + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z")) + + inputs.property("buildTime", buildTime) + inputs.property("version", project.version) + filesMatching("**/application.properties") { + expand(mapOf("project" to project, "buildTime" to buildTime, "version" to project.version, "ext" to mapOf("buildTime" to buildTime))) + } +} + +tasks.test { + enabled = false + useJUnitPlatform() + jvmArgs("-Dkotest.assertions.collection.print.size=100") +} + +tasks.withType { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21) + freeCompilerArgs.add("-Xjsr305=strict") + } +} + +tasks.getByName("jar") { + enabled = false +} + +sourceSets { + main { + java.srcDir("${layout.buildDirectory.get()}/generated/source/kapt/main") + } +} + +val copyDependencies by tasks.registering(Copy::class) { + from(configurations.runtimeClasspath) + into("${layout.buildDirectory.get()}/libs/lib") +} + +val packageThin by tasks.registering(Jar::class) { + group = "build" + from(sourceSets.main.get().output) + manifest { + attributes( + "Main-Class" to "icu.samnyan.aqua.EntryKt", + "Class-Path" to configurations.runtimeClasspath.get().files.joinToString(" ") { "lib/${it.name}" } + ) + } + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + dependsOn(copyDependencies) +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 5b0f8437..06291d19 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,5 @@ -/* - * This file was generated by the Gradle 'init' task. - */ - rootProject.name = "AquaDX" + +include("planet") +include("comet") +include("shared") diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts new file mode 100644 index 00000000..97323024 --- /dev/null +++ b/shared/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + kotlin("jvm") + kotlin("plugin.jpa") + kotlin("plugin.serialization") +} + +dependencies { + api("jakarta.persistence:jakarta.persistence-api:3.1.0") + api("jakarta.servlet:jakarta.servlet-api:6.0.0") + api("com.fasterxml.jackson.core:jackson-annotations:2.17.0") + api("com.fasterxml.jackson.core:jackson-databind:2.17.0") +}