Skip to content

Commit e1cd282

Browse files
committed
feat: add GenerateExposedMigrationScript task and enhance cloud module support
- Introduced the `generateExposedMigrationScript` Gradle task for creating migration scripts with Exposed ORM. - Added `migrationMainClass` property to Surf extensions for script configuration. - Updated `SurfCloudModules` enum to include the `STANDALONE` module. - Bumped plugin version to 1.3.0.
1 parent d6fa0d0 commit e1cd282

File tree

6 files changed

+79
-2
lines changed

6 files changed

+79
-2
lines changed

surf-api-gradle-plugin/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ plugins {
2020
group = groupId
2121
version = buildString {
2222
append(mcVersion)
23-
append("-1.2.0")
23+
append("-1.3.0")
2424
if (snapshot) append("-SNAPSHOT")
2525
}
2626

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package dev.slne.surf.surfapi.gradle
22

3-
enum class SurfCloudModules(val module: String) {
3+
internal enum class SurfCloudModules(val module: String) {
44
COMMON("surf-cloud-api-common"),
55
CLIENT_COMMON("surf-cloud-api-client-common"),
66
CLIENT_PAPER("surf-cloud-api-client-paper"),
77
CLIENT_VELOCITY("surf-cloud-api-client-velocity"),
88
SERVER("surf-cloud-api-server"),
9+
STANDALONE("surf-cloud-standalone"),
910
}

surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/common/CommonSurfExtension.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ abstract class CommonSurfExtension(protected val objects: ObjectFactory) {
1111
internal val publishingUrl = objects.property<String>().convention("https://repo.slne.dev/repository/maven-releases")
1212
internal val publishingRepoName = objects.property<String>().convention("maven-releases")
1313
internal val cloudModule = objects.property<SurfCloudModules>()
14+
internal val migrationMainClass = objects.property<String>()
1415

1516
fun addSurfApiToClasspath(value: Boolean) {
1617
addSurfApiToClasspath.set(value)

surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/common/CommonSurfPlugin.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package dev.slne.surf.surfapi.gradle.platform.common
22

33
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
4+
import dev.slne.surf.surfapi.gradle.SurfCloudModules
45
import dev.slne.surf.surfapi.gradle.generated.Constants
56
import dev.slne.surf.surfapi.gradle.platform.SurfApiPlatform
7+
import dev.slne.surf.surfapi.gradle.platform.core.tasks.generateExposedMigrationScript
68
import dev.slne.surf.surfapi.gradle.util.slnePublic
79
import org.gradle.api.Plugin
810
import org.gradle.api.Project
@@ -201,6 +203,14 @@ abstract class CommonSurfPlugin<E : CommonSurfExtension>(
201203
"dev.slne.surf.cloud:${cloudModule.module}:${Constants.SURF_API_VERSION}"
202204
)
203205
}
206+
207+
val mainClass = extension.migrationMainClass.orNull
208+
if (cloudModule == SurfCloudModules.SERVER && mainClass != null) {
209+
generateExposedMigrationScript(
210+
mainClass = mainClass,
211+
cloudRuntimeDependency = "dev.slne.surf.cloud:${SurfCloudModules.STANDALONE.module}:${Constants.SURF_API_VERSION}"
212+
)
213+
}
204214
}
205215

206216
afterEvaluated0(extension)

surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/core/CoreSurfExtension.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,9 @@ open class CoreSurfExtension @Inject constructor(objects: ObjectFactory) :
2121
fun withCloudServer() {
2222
cloudModule.set(SurfCloudModules.SERVER)
2323
}
24+
25+
fun migrationMainClass(value: String) {
26+
migrationMainClass.set(value)
27+
migrationMainClass.finalizeValue()
28+
}
2429
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package dev.slne.surf.surfapi.gradle.platform.core.tasks
2+
3+
import org.gradle.api.GradleException
4+
import org.gradle.api.NamedDomainObjectProvider
5+
import org.gradle.api.Project
6+
import org.gradle.api.tasks.JavaExec
7+
import org.gradle.api.tasks.SourceSet
8+
import org.gradle.api.tasks.SourceSetContainer
9+
import org.gradle.kotlin.dsl.named
10+
import org.gradle.kotlin.dsl.register
11+
import java.util.*
12+
13+
14+
val Project.sourceSets: SourceSetContainer get() = this.extensions.getByName("sourceSets") as SourceSetContainer
15+
val SourceSetContainer.main: NamedDomainObjectProvider<SourceSet> get() = named<SourceSet>("main")
16+
17+
fun Project.generateExposedMigrationScript(cloudRuntimeDependency: String, mainClass: String) {
18+
val additionalDependencies = configurations.detachedConfiguration(
19+
dependencies.create(cloudRuntimeDependency)
20+
)
21+
22+
tasks.register<JavaExec>("generateExposedMigrationScript") {
23+
group = "migration"
24+
description = "Generate Exposed migration script"
25+
classpath = sourceSets.main.get().runtimeClasspath + additionalDependencies
26+
this.mainClass.set(mainClass)
27+
28+
val properties = project.file("migration.properties")
29+
30+
doFirst {
31+
if (!properties.exists()) {
32+
properties.parentFile.mkdirs()
33+
properties.writeText(
34+
"""
35+
# Migration database config
36+
migration.dbUrl=jdbc:mysql://localhost:3306/database
37+
migration.dbUser=
38+
migration.dbPassword=
39+
""".trimIndent()
40+
)
41+
throw GradleException("Created 'migration.properties' file. Please enter your credentials and run the task again.")
42+
}
43+
44+
val migrationProperties = Properties().apply {
45+
load(properties.inputStream())
46+
}
47+
48+
val requiredKeys = listOf("migration.dbUrl", "migration.dbUser", "migration.dbPassword")
49+
val missing =
50+
requiredKeys.filter { migrationProperties.getProperty(it).isNullOrBlank() }
51+
if (missing.isNotEmpty()) {
52+
throw GradleException("'migration.properties' is incomplete. Missing keys: ${missing.joinToString()}")
53+
}
54+
55+
systemProperties(
56+
requiredKeys.associateWith { migrationProperties.getProperty(it) }
57+
)
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)