From dae24f003ef0439ea4ee870b4054e4d2882830d7 Mon Sep 17 00:00:00 2001 From: Liz Ainslie Date: Wed, 6 Nov 2024 09:41:08 +0100 Subject: [PATCH] feat(exposed): add layer extensions & DbManager --- .../sh/illumi/kraft/x/exposed/DbManager.kt | 50 ++++++++++++++++++- .../kraft/x/exposed/dsl/ConfigureDsl.kt | 8 --- .../sh/illumi/kraft/x/exposed/dsl/config.kt | 38 ++++++++++++++ .../kraft/x/exposed/extensions/layer.kt | 19 +++++++ .../kraft/x/exposed/layer/LayerWithExposed.kt | 7 +++ 5 files changed, 112 insertions(+), 10 deletions(-) delete mode 100644 kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/dsl/ConfigureDsl.kt create mode 100644 kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/dsl/config.kt create mode 100644 kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/extensions/layer.kt create mode 100644 kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/layer/LayerWithExposed.kt diff --git a/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/DbManager.kt b/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/DbManager.kt index eb17e6e..3344a28 100644 --- a/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/DbManager.kt +++ b/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/DbManager.kt @@ -3,17 +3,63 @@ package sh.illumi.kraft.x.exposed import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource import org.jetbrains.exposed.sql.Database +import sh.illumi.kraft.layer.RootLayer +import sh.illumi.kraft.x.exposed.dsl.ExposedConfigurationDsl sealed interface DbManager { val db: Database val isPooled: Boolean + val layer: RootLayer - class Hikari() : DbManager { - private val dataSource = HikariDataSource(HikariConfig()) + class Hikari( + override val layer: RootLayer, + configure: ExposedConfigurationDsl.Hikari.() -> Unit + ) : DbManager { + private val dataSource: HikariDataSource + + init { + val dsl = ExposedConfigurationDsl.Hikari().apply(configure) + dsl.check() + + dataSource = HikariDataSource(HikariConfig().apply { + jdbcUrl = dsl.jdbcUrl + driverClassName = dsl.driverClassName + username = dsl.username + password = dsl.password + maximumPoolSize = dsl.hikari.maximumPoolSize + isReadOnly = dsl.hikari.isReadOnly + transactionIsolation = dsl.hikari.transactionIsolationLevel + }) + } override val isPooled = true override val db by lazy { Database.connect(dataSource) } } + + class Single( + override val layer: RootLayer, + configure: ExposedConfigurationDsl.() -> Unit + ) : DbManager { + private val jdbcUrl: String + private val driverClassName: String + private val username: String + private val password: String + + init { + val dsl = ExposedConfigurationDsl().apply(configure) + dsl.check() + + jdbcUrl = dsl.jdbcUrl + driverClassName = dsl.driverClassName + username = dsl.username + password = dsl.password + } + + override val isPooled = false + override val db by lazy { + Database.connect(jdbcUrl, driverClassName, username, password) + } + } } \ No newline at end of file diff --git a/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/dsl/ConfigureDsl.kt b/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/dsl/ConfigureDsl.kt deleted file mode 100644 index d4aca4f..0000000 --- a/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/dsl/ConfigureDsl.kt +++ /dev/null @@ -1,8 +0,0 @@ -package sh.illumi.kraft.x.exposed.dsl - -class ConfigureDsl { - lateinit var jdbcUrl: String - lateinit var driverClassName: String - lateinit var username: String - lateinit var password: String -} \ No newline at end of file diff --git a/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/dsl/config.kt b/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/dsl/config.kt new file mode 100644 index 0000000..d46c39e --- /dev/null +++ b/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/dsl/config.kt @@ -0,0 +1,38 @@ +package sh.illumi.kraft.x.exposed.dsl + +open class ExposedConfigurationDsl { + var jdbcUrl: String = "" + var driverClassName: String = "" + var username: String = "" + var password: String = "" + + open fun check() { + require(jdbcUrl.isNotBlank()) { "jdbcUrl must be set" } + require(driverClassName.isNotBlank()) { "driverClassName must be set" } + require(username.isNotBlank()) { "username must be set" } + require(password.isNotBlank()) { "password must be set" } + } + + class Hikari : ExposedConfigurationDsl() { + lateinit var hikari: ExposedHikariConfigurationDsl + + fun hikari(block: ExposedHikariConfigurationDsl.() -> Unit) { + hikari = ExposedHikariConfigurationDsl().apply(block) + } + + override fun check() { + super.check() + hikari.check() + } + } +} + +class ExposedHikariConfigurationDsl { + var maximumPoolSize = 10 + var isReadOnly = false + var transactionIsolationLevel: String? = null + + fun check() { + require(maximumPoolSize > 0) { "maximumPoolSize must be greater than 0" } + } +} \ No newline at end of file diff --git a/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/extensions/layer.kt b/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/extensions/layer.kt new file mode 100644 index 0000000..f2d5ac8 --- /dev/null +++ b/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/extensions/layer.kt @@ -0,0 +1,19 @@ +package sh.illumi.kraft.x.exposed.extensions + +import sh.illumi.kraft.layer.RootLayer +import sh.illumi.kraft.x.exposed.DbManager +import sh.illumi.kraft.x.exposed.dsl.ExposedConfigurationDsl +import sh.illumi.kraft.x.exposed.layer.LayerWithExposed + +fun TLayer.createExposedHikari(configure: ExposedConfigurationDsl.Hikari.() -> Unit) +where + TLayer : RootLayer, + TLayer : LayerWithExposed += DbManager.Hikari(this, configure) + + +fun TLayer.createExposedSingle(configure: ExposedConfigurationDsl.() -> Unit) +where + TLayer : RootLayer, + TLayer : LayerWithExposed += DbManager.Single(this, configure) diff --git a/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/layer/LayerWithExposed.kt b/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/layer/LayerWithExposed.kt new file mode 100644 index 0000000..eeeb199 --- /dev/null +++ b/kraftx/exposed/src/main/kotlin/sh/illumi/kraft/x/exposed/layer/LayerWithExposed.kt @@ -0,0 +1,7 @@ +package sh.illumi.kraft.x.exposed.layer + +import sh.illumi.kraft.x.exposed.DbManager + +interface LayerWithExposed { + val db: DbManager +} \ No newline at end of file