diff --git a/.idea/misc.xml b/.idea/misc.xml index 87a20fc..3661012 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,10 @@ + + + + + diff --git a/build.gradle.kts b/build.gradle.kts index 50ceff0..f6af309 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -38,6 +38,8 @@ dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0") implementation("com.google.code.gson:gson:2.8.9") + implementation("com.zaxxer:HikariCP:5.1.0") + } @@ -64,7 +66,7 @@ kotlin { moduleJson { name = "CloudNet-Rest-Module" author = "TheCGuy" - main = "io.github.thecguy.cloudnet_rest_module.CloudNet-Rest-Module" + main = "io.github.thecguy.cloudnet_rest_module.CloudNet_Rest_Module" description = "This CloudNet Module enables a Rest API!" } diff --git a/src/main/kotlin/io/github/thecguy/cloudnet_rest_module/CloudNet-Rest-Module.kt b/src/main/kotlin/io/github/thecguy/cloudnet_rest_module/CloudNet_Rest_Module.kt similarity index 59% rename from src/main/kotlin/io/github/thecguy/cloudnet_rest_module/CloudNet-Rest-Module.kt rename to src/main/kotlin/io/github/thecguy/cloudnet_rest_module/CloudNet_Rest_Module.kt index 3751d01..20c94b5 100644 --- a/src/main/kotlin/io/github/thecguy/cloudnet_rest_module/CloudNet-Rest-Module.kt +++ b/src/main/kotlin/io/github/thecguy/cloudnet_rest_module/CloudNet_Rest_Module.kt @@ -1,13 +1,22 @@ package io.github.thecguy.cloudnet_rest_module + + +import com.zaxxer.hikari.HikariConfig +import com.zaxxer.hikari.HikariDataSource +import eu.cloudnetservice.common.log.LogManager +import eu.cloudnetservice.common.log.Logger +import eu.cloudnetservice.driver.document.Document +import eu.cloudnetservice.driver.document.DocumentFactory import eu.cloudnetservice.driver.inject.InjectionLayer import eu.cloudnetservice.driver.module.ModuleLifeCycle import eu.cloudnetservice.driver.module.ModuleTask import eu.cloudnetservice.driver.module.driver.DriverModule -import eu.cloudnetservice.node.service.CloudServiceManager import eu.cloudnetservice.node.ShutdownHandler import eu.cloudnetservice.node.command.CommandProvider +import eu.cloudnetservice.node.service.CloudServiceManager import io.github.thecguy.cloudnet_rest_module.commands.Test +import io.github.thecguy.cloudnet_rest_module.config.Configuration import io.ktor.server.application.* import io.ktor.server.engine.* import io.ktor.server.netty.* @@ -21,9 +30,20 @@ import kong.unirest.core.json.JSONObject import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import org.jetbrains.annotations.NotNull +import kotlin.concurrent.Volatile + @Singleton -class `CloudNet-Rest-Module` : DriverModule() { +class CloudNet_Rest_Module : DriverModule() { + + @Volatile + private var configuration: Configuration? = null + private val logger: Logger = LogManager.logger(CloudNet_Rest_Module::class.java) + + + + + @ModuleTask(lifecycle = ModuleLifeCycle.STARTED) fun started( @@ -31,12 +51,61 @@ class `CloudNet-Rest-Module` : DriverModule() { @NotNull shutdownHandler: ShutdownHandler, @NotNull @Named("module") injectionLayer: InjectionLayer<*> ) { - + logger.info("Listening on port 8080!") GlobalScope.launch { - main(cloudServiceManager,shutdownHandler, injectionLayer) + main(cloudServiceManager, shutdownHandler) } + } - + @ModuleTask(order = 127, lifecycle = ModuleLifeCycle.LOADED) + fun load() { + val config = this.readConfig(DocumentFactory.json()) + this.writeConfig( + Document.newJsonDocument().appendTree( + Configuration( + config.getString("username"), + config.getString("password"), + config.getString("database"), + config.getString("host"), + config.getInt("port") + ) + ) + ) + } + @ModuleTask(order = 125, lifecycle = ModuleLifeCycle.LOADED) + fun lload() { + configuration = this.readConfig( + Configuration::class.java, + { + Configuration( + "root", + "123456", + "cloudnet_rest", + "127.0.0.1", + 3306 + ) + }, + DocumentFactory.json() + ) + + val config = HikariConfig() + + config.jdbcUrl = "jdbc:mysql://${configuration!!.host}:${configuration!!.port}/${configuration!!.database}" + config.username = configuration!!.username + config.password = configuration!!.password + config.driverClassName = "com.mysql.cj.jdbc.Driver" + config.addDataSourceProperty("cachePrepStmts", "true") + config.addDataSourceProperty("prepStmtCacheSize", "250") + config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048") + + val ds = HikariDataSource(config) + + ds.connection.use { connection -> + connection.prepareStatement("CREATE TABLE IF NOT EXISTS cloudnet_rest_users (id SERIAL PRIMARY KEY, user TEXT, password TEXT)").use { statement -> + statement.executeUpdate() + } + } + ds.close() } @ModuleTask(lifecycle = ModuleLifeCycle.STARTED) @@ -44,16 +113,10 @@ class `CloudNet-Rest-Module` : DriverModule() { commandProvider.register(Test::class.java) } - @ModuleTask(lifecycle = ModuleLifeCycle.STOPPED) - fun stop(gracePeriodMillis: Long, timeoutMillis: Long) { - println("SHUTTING DOWN KTOR!") - } - - fun services(cloudServiceManager: CloudServiceManager): JSONObject { + private fun services(cloudServiceManager: CloudServiceManager): JSONObject { val ser = cloudServiceManager.services() val servicesArray = JSONArray() - ser.forEach { service -> val serviceObject = JSONObject() serviceObject.put("Name", service.name()) @@ -67,16 +130,15 @@ class `CloudNet-Rest-Module` : DriverModule() { serviceObject.put("ConnectedTime", service.connectedTime()) servicesArray.put(serviceObject) } - val result = JSONObject() result.put("services", servicesArray) - return result } - private fun main(@NotNull cloudServiceManager: CloudServiceManager, - @NotNull shutdownHandler: ShutdownHandler, - @NotNull @Named("module") injectionLayer: InjectionLayer<*>) { + private fun main( + @NotNull cloudServiceManager: CloudServiceManager, + @NotNull shutdownHandler: ShutdownHandler + ) { embeddedServer(Netty, port = 8080) { install(ShutDownUrl.ApplicationCallPlugin) { @@ -88,7 +150,7 @@ class `CloudNet-Rest-Module` : DriverModule() { routing { - swaggerUI(path = "swagger", swaggerFile = "openapi/swagger.yaml") + //swaggerUI(path = "swagger", swaggerFile = "openapi/swagger.yaml") get("/") { diff --git a/src/main/kotlin/io/github/thecguy/cloudnet_rest_module/commands/Test.kt b/src/main/kotlin/io/github/thecguy/cloudnet_rest_module/commands/Test.kt index 2988ccc..c002523 100644 --- a/src/main/kotlin/io/github/thecguy/cloudnet_rest_module/commands/Test.kt +++ b/src/main/kotlin/io/github/thecguy/cloudnet_rest_module/commands/Test.kt @@ -11,8 +11,7 @@ import eu.cloudnetservice.driver.service.ServiceTask import eu.cloudnetservice.driver.database.DatabaseProvider import eu.cloudnetservice.node.command.annotation.Description import eu.cloudnetservice.node.command.source.CommandSource -import eu.cloudnetservice.driver.document.Document -import eu.cloudnetservice.driver.document.DocumentFactory + import jakarta.inject.Singleton import java.util.* @@ -27,13 +26,14 @@ class Test { + @Suggestions("test") - fun suggestion(`$`: CommandContext<*>?, input: String?): List { + fun suggestion(context: CommandContext<*>, input: String?): List { return taskProvider.serviceTasks().toList() } @Parser(name = "test", suggestions = "test") - fun parser(`$`: CommandContext<*>?, input: Queue): List { + fun parser(context: CommandContext<*>, input: Queue): List { return taskProvider.serviceTasks().toList() } @@ -56,7 +56,7 @@ class Test { fun insert( source: CommandSource, ) { - databaseProvider.database("test").insert("test", Document.newDocument(DocumentFactory.json())) + println("test") } diff --git a/src/main/kotlin/io/github/thecguy/cloudnet_rest_module/config/config.kt b/src/main/kotlin/io/github/thecguy/cloudnet_rest_module/config/config.kt new file mode 100644 index 0000000..51ba861 --- /dev/null +++ b/src/main/kotlin/io/github/thecguy/cloudnet_rest_module/config/config.kt @@ -0,0 +1,12 @@ +package io.github.thecguy.cloudnet_rest_module.config + +import org.jetbrains.annotations.NotNull + + +class Configuration( + @NotNull val username: String, + @NotNull val password: String, + @NotNull val database: String, + @NotNull val host: String, + @NotNull val port: Int +) \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml deleted file mode 100644 index e0017b1..0000000 --- a/src/main/resources/application.yaml +++ /dev/null @@ -1,6 +0,0 @@ -ktor: - application: - modules: - - io.github.thecguy.cloudnetmoduletest.ApplicationKt.module - deployment: - port: 8080 \ No newline at end of file diff --git a/src/main/resources/config.json b/src/main/resources/config.json new file mode 100644 index 0000000..ce30091 --- /dev/null +++ b/src/main/resources/config.json @@ -0,0 +1,7 @@ +{ + "host": "127.0.0.1", + "port": 3306, + "database": "cloudnet-rest", + "user": "", + "password": "" +} \ No newline at end of file