Skip to content

Commit

Permalink
m5l6 - Add real db to ktor
Browse files Browse the repository at this point in the history
  • Loading branch information
evgnep committed Nov 9, 2023
1 parent 6db10a8 commit fea1ebb
Show file tree
Hide file tree
Showing 15 changed files with 236 additions and 22 deletions.
4 changes: 4 additions & 0 deletions ok-marketplace-app-ktor/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,10 @@ kotlin {
implementation("com.sndyuk:logback-more-appenders:1.8.8")
implementation("org.fluentd:fluent-logger:0.3.4")

// Repo
implementation(project(":ok-marketplace-repo-postgresql"))
implementation(project(":ok-marketplace-repo-cassandra"))
implementation(project(":ok-marketplace-repo-gremlin"))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import ru.otus.otuskotlin.marketplace.repo.inmemory.AdRepoInMemory
fun Application.initAppSettings(): MkplAppSettings {
val corSettings = MkplCorSettings(
loggerProvider = getLoggerProviderConf(),
repoTest = AdRepoInMemory(),
repoTest = getDatabaseConf(AdDbType.TEST),
repoProd = getDatabaseConf(AdDbType.PROD),
repoStub = AdRepoStub()
)
return MkplAppSettings(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ru.otus.otuskotlin.marketplace.app.plugins

import io.ktor.server.application.*
import ru.otus.otuskotlin.marketplace.common.repo.IAdRepository

expect fun Application.getDatabaseConf(type: AdDbType): IAdRepository

enum class AdDbType(val confName: String) {
PROD("prod"), TEST("test")
}
10 changes: 0 additions & 10 deletions ok-marketplace-app-ktor/src/commonMain/resources/application.conf

This file was deleted.

14 changes: 14 additions & 0 deletions ok-marketplace-app-ktor/src/commonMain/resources/application.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# application.yaml работает в jvm и native, но не работает в режиме сервлета с Tomcat
# в этом случае необходимо сформировать application.conf

ktor:
development: true
deployment:
port: 8080
watch:
- classes
- resources
application:
modules:
- "ru.otus.otuskotlin.marketplace.app.ApplicationKt.module"

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.otus.otuskotlin.marketplace.app.configs

import io.ktor.server.config.*

data class CassandraConfig(
val host: String = "localhost",
val port: Int = 9042,
val user: String = "cassandra",
val pass: String = "cassandra",
val keyspace: String = "test_keyspace"
) {
constructor(config: ApplicationConfig) : this(
host = config.property("$PATH.host").getString(),
port = config.property("$PATH.port").getString().toInt(),
user = config.property("$PATH.user").getString(),
pass = config.property("$PATH.pass").getString(),
keyspace = config.property("$PATH.keyspace").getString()
)

companion object {
const val PATH = "${ConfigPaths.repository}.cassandra"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ru.otus.otuskotlin.marketplace.app.configs

object ConfigPaths {
const val mkplRoot = "marketplace"
const val repository = "$mkplRoot.repository"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ru.otus.otuskotlin.marketplace.app.configs

import io.ktor.server.config.*

data class GremlinConfig(
val host: String = "localhost",
val port: Int = 8182,
val user: String = "root",
val pass: String,
val enableSsl: Boolean = false,
) {
constructor(config: ApplicationConfig): this(
host = config.property("$PATH.host").getString(),
user = config.property("$PATH.user").getString(),
pass = config.property("$PATH.password").getString(),
enableSsl = config.property("$PATH.enableSsl").getString().toBoolean(),
)

companion object {
const val PATH = "${ConfigPaths.repository}.gremlin"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.otus.otuskotlin.marketplace.app.configs

import io.ktor.server.config.*

data class PostgresConfig(
val url: String = "jdbc:postgresql://localhost:5432/marketplace",
val user: String = "postgres",
val password: String = "marketplace-pass",
val schema: String = "marketplace",
) {
constructor(config: ApplicationConfig): this(
url = config.property("$PATH.url").getString(),
user = config.property("$PATH.user").getString(),
password = config.property("$PATH.password").getString(),
schema = config.property("$PATH.schema").getString(),
)

companion object {
const val PATH = "${ConfigPaths.repository}.psql"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package ru.otus.otuskotlin.marketplace.app.plugins

import io.ktor.server.application.*
import ru.otus.otuskotlin.marketplace.app.configs.CassandraConfig
import ru.otus.otuskotlin.marketplace.app.configs.ConfigPaths
import ru.otus.otuskotlin.marketplace.app.configs.GremlinConfig
import ru.otus.otuskotlin.marketplace.app.configs.PostgresConfig
import ru.otus.otuskotlin.marketplace.backend.repo.cassandra.RepoAdCassandra
import ru.otus.otuskotlin.marketplace.backend.repo.sql.RepoAdSQL
import ru.otus.otuskotlin.marketplace.backend.repo.sql.SqlProperties
import ru.otus.otuskotlin.marketplace.backend.repository.gremlin.AdRepoGremlin
import ru.otus.otuskotlin.marketplace.common.repo.IAdRepository
import ru.otus.otuskotlin.marketplace.repo.inmemory.AdRepoInMemory
import kotlin.time.Duration
import kotlin.time.Duration.Companion.minutes

actual fun Application.getDatabaseConf(type: AdDbType): IAdRepository {
val dbSettingPath = "${ConfigPaths.repository}.${type.confName}"
val dbSetting = environment.config.propertyOrNull(dbSettingPath)?.getString()?.lowercase()
return when (dbSetting) {
"in-memory", "inmemory", "memory", "mem" -> initInMemory()
"postgres", "postgresql", "pg", "sql", "psql" -> initPostgres()
"cassandra", "nosql", "cass" -> initCassandra()
"arcade", "arcadedb", "graphdb", "gremlin", "g", "a" -> initGremliln()
else -> throw IllegalArgumentException(
"$dbSettingPath must be set in application.yml to one of: " +
"'inmemory', 'postgres', 'cassandra', 'gremlin'"
)
}
}

private fun Application.initPostgres(): IAdRepository {
val config = PostgresConfig(environment.config)
return RepoAdSQL(
properties = SqlProperties(
url = config.url,
user = config.user,
password = config.password,
schema = config.schema,
)
)
}

private fun Application.initCassandra(): IAdRepository {
val config = CassandraConfig(environment.config)
return RepoAdCassandra(
keyspaceName = config.keyspace,
host = config.host,
port = config.port,
user = config.user,
pass = config.pass,
)
}

private fun Application.initGremliln(): IAdRepository {
val config = GremlinConfig(environment.config)
return AdRepoGremlin(
hosts = config.host,
port = config.port,
user = config.user,
pass = config.pass,
enableSsl = config.enableSsl,
)
}

private fun Application.initInMemory(): IAdRepository {
val ttlSetting = environment.config.propertyOrNull("db.prod")?.getString()?.let {
Duration.parse(it)
}
return AdRepoInMemory(ttl = ttlSetting ?: 10.minutes)
}
11 changes: 0 additions & 11 deletions ok-marketplace-app-ktor/src/jvmMain/resources/application.conf

This file was deleted.

36 changes: 36 additions & 0 deletions ok-marketplace-app-ktor/src/jvmMain/resources/application.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# application.yaml работает в jvm и native, но не работает в режиме сервлета с Tomcat
# в этом случае необходимо сформировать application.conf
ktor:
application:
modules:
- ru.otus.otuskotlin.marketplace.app.ApplicationJvmKt.moduleJvm
deployment:
port: 8080
urls:
- "http://127.0.0.1:8080/"
- "http://0.0.0.0:8080/"
- "http://192.168.0.182:8080/"
watch:
- classes
- resources
marketplace:
repository:
test: "$DB_TYPE_TEST:inmemory"
prod: "$DB_TYPE_PROD:inmemory"
cassandra:
hosts: localhost
keyspace: test_keyspace
pass: cassandra
port: 9042
user: cassandra
psql:
password: marketplace-pass
schema: marketplace
url: "jdbc:postgresql://localhost:5432/marketplace"
user: postgres
gremlin:
host: "$DB_GREMLIN_HOST:localhost"
user: "$DB_GREMLIN_HOST:root"
password: "$DB_GREMLIN_HOST:root_root"
port: "$DB_GREMLIN_PORT:8182"
enableSsl: false
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ru.otus.otuskotlin.marketplace.app.plugins

import io.ktor.server.application.*
import ru.otus.otuskotlin.marketplace.common.repo.IAdRepository
import ru.otus.otuskotlin.marketplace.repo.inmemory.AdRepoInMemory

actual fun Application.getDatabaseConf(type: AdDbType): IAdRepository {
return AdRepoInMemory()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ru.otus.otuskotlin.marketplace.app.plugins

import io.ktor.server.application.*
import ru.otus.otuskotlin.marketplace.common.repo.IAdRepository
import ru.otus.otuskotlin.marketplace.repo.inmemory.AdRepoInMemory

actual fun Application.getDatabaseConf(type: AdDbType): IAdRepository {
return AdRepoInMemory()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ru.otus.otuskotlin.marketplace.app.plugins

import io.ktor.server.application.*
import ru.otus.otuskotlin.marketplace.common.repo.IAdRepository
import ru.otus.otuskotlin.marketplace.repo.inmemory.AdRepoInMemory

actual fun Application.getDatabaseConf(type: AdDbType): IAdRepository {
return AdRepoInMemory()
}

0 comments on commit fea1ebb

Please sign in to comment.