From 0388b06f93537e02d95b60d1bb6af68414ba68e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amalie=20Mans=C3=A5ker?= Date: Mon, 10 Jul 2023 15:42:34 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20Oppsett=20av=20database?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sindre Kjelsrud Co-authored-by: Markus A. R. Johansen Co-authored-by: Hege Haavaldsen Co-authored-by: Helene Arnesen --- backend/build.gradle.kts | 1 + .../kotlin/no/nav/helse/sprik/Application.kt | 25 +++++++--- .../kotlin/no/nav/helse/sprik/db/Database.kt | 40 +++++++++++++-- .../no/nav/helse/sprik/plugins/Routing.kt | 49 +++++++++++-------- 4 files changed, 83 insertions(+), 32 deletions(-) diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 3bef183..068b0ac 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -42,6 +42,7 @@ dependencies { implementation("org.jetbrains.exposed:exposed-core:$exposed_version") implementation("org.jetbrains.exposed:exposed-jdbc:$exposed_version") implementation("org.jetbrains.exposed:exposed-java-time:$exposed_version") + implementation("io.ktor:ktor-server-cio:$ktor_version") testImplementation("io.ktor:ktor-server-tests-jvm:$ktor_version") testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version") testImplementation("org.testcontainers:postgresql:$testcontainers_postgresql_version") diff --git a/backend/src/main/kotlin/no/nav/helse/sprik/Application.kt b/backend/src/main/kotlin/no/nav/helse/sprik/Application.kt index 7d149f5..c6f1928 100644 --- a/backend/src/main/kotlin/no/nav/helse/sprik/Application.kt +++ b/backend/src/main/kotlin/no/nav/helse/sprik/Application.kt @@ -1,15 +1,26 @@ package no.nav.helse.sprik -import io.ktor.server.application.* -import io.ktor.server.engine.* -import io.ktor.server.netty.* +import kotlinx.coroutines.runBlocking +import no.nav.helse.sprik.db.Database import no.nav.helse.sprik.plugins.* fun main() { - embeddedServer(Netty, port = 8080, host = "0.0.0.0", module = Application::module) - .start(wait = true) + val db = Database() + db.migrate() + val app = Application(db) + app.startBlocking() } -fun Application.module() { - configureRouting() +class Application(private val db: Database) { + fun startBlocking() { + + runBlocking { + configureRouting().start(wait = false) + Runtime.getRuntime().addShutdownHook( + Thread { + db.dataSource.close() + } + ) + } + } } diff --git a/backend/src/main/kotlin/no/nav/helse/sprik/db/Database.kt b/backend/src/main/kotlin/no/nav/helse/sprik/db/Database.kt index ec36ea7..2dff291 100644 --- a/backend/src/main/kotlin/no/nav/helse/sprik/db/Database.kt +++ b/backend/src/main/kotlin/no/nav/helse/sprik/db/Database.kt @@ -5,13 +5,43 @@ import com.zaxxer.hikari.HikariDataSource import no.nav.helse.sprik.db.Environment.Database.host import no.nav.helse.sprik.db.Environment.Database.name import no.nav.helse.sprik.db.Environment.Database.port +import org.flywaydb.core.Flyway +import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.seconds +import kotlin.time.toJavaDuration -class Database(dbconfig: HikariConfig) { +class Database(dbconfig: HikariConfig = dbconfig()) { val dataSource by lazy { HikariDataSource(dbconfig) } + fun migrate() { + migrateconfig() + .let { HikariDataSource(it) } + .also { + Flyway.configure() + .dataSource(it) + .lockRetryCount(-1) + .load() + .migrate() + } + .close() + } } private fun dbconfig() = HikariConfig().apply { jdbcUrl = DB_URL + username = username + password = password + maximumPoolSize = 1 + connectionTimeout = 30.seconds.toJavaDuration().toMillis() + initializationFailTimeout = 1.minutes.toJavaDuration().toMillis() +} + +private fun migrateconfig() = HikariConfig().apply { + jdbcUrl = DB_URL + username = username + password = password + maximumPoolSize = 2 + connectionTimeout = 30.seconds.toJavaDuration().toMillis() + initializationFailTimeout = 1.minutes.toJavaDuration().toMillis() } val DB_URL = "jdbc:postgresql://%s:%s/%s".format(host, port, name) @@ -19,8 +49,10 @@ val DB_URL = "jdbc:postgresql://%s:%s/%s".format(host, port, name) object Environment { object Database { private val env = System.getenv() - val host = requireNotNull(env["DATABASE_HOST"]) { "Host må settes" } - val port = requireNotNull(env["DATABASE_PORT"]) { "Port må settes" } - val name = requireNotNull(env["DATABASE_DATABASE"]) { "Databasenavn må settes" } + internal val host = requireNotNull(env["DATABASE_HOST"]) { "Host må settes" } + internal val port = requireNotNull(env["DATABASE_PORT"]) { "Port må settes" } + internal val name = requireNotNull(env["DATABASE_DATABASE"]) { "Databasenavn må settes" } + internal val username = requireNotNull(env["DATABASE_USERNAME"]) { "Brukernavn må settes" } + internal val password = requireNotNull(env["DATABASE_PASSWORD"]) { "Passord må settes" } } } \ No newline at end of file diff --git a/backend/src/main/kotlin/no/nav/helse/sprik/plugins/Routing.kt b/backend/src/main/kotlin/no/nav/helse/sprik/plugins/Routing.kt index ff68d82..e60a50f 100644 --- a/backend/src/main/kotlin/no/nav/helse/sprik/plugins/Routing.kt +++ b/backend/src/main/kotlin/no/nav/helse/sprik/plugins/Routing.kt @@ -6,33 +6,40 @@ import io.ktor.server.response.* import io.ktor.server.application.* import io.ktor.server.plugins.contentnegotiation.* import io.ktor.serialization.kotlinx.json.* +import io.ktor.server.cio.* +import io.ktor.server.engine.* import io.ktor.server.plugins.cors.routing.* import io.ktor.server.request.* import no.nav.helse.sprik.Feil import no.nav.helse.sprik.Test -fun Application.configureRouting() { - install(CORS) { - anyHost() - allowMethod(HttpMethod.Get) - allowMethod(HttpMethod.Post) - allowNonSimpleContentTypes = true - } - install(ContentNegotiation) { - json() - } - routing { - get("/") { - call.respondText("Hello World!") +fun configureRouting(): ApplicationEngine = embeddedServer(CIO, applicationEngineEnvironment { + module { + install(CORS) { + anyHost() + allowMethod(HttpMethod.Get) + allowMethod(HttpMethod.Post) + allowNonSimpleContentTypes = true } - post("/test") { - val test = call.receive() - call.respond(status = HttpStatusCode.Created, message = test) + install(ContentNegotiation) { + json() } - post("/nyFeil"){ - val test = call.receive() - println(test) - call.respond(status = HttpStatusCode.Created, message = test) + routing { + get("/") { + call.respondText("Hello World!") + } + post("/test") { + val test = call.receive() + call.respond(status = HttpStatusCode.Created, message = test) + } + post("/nyFeil") { + val test = call.receive() + println(test) + call.respond(status = HttpStatusCode.Created, message = test) + } + } } -} +}) + +