diff --git a/src/main/kotlin/no/kartverket/matrikkel/bygning/models/Egenregistrering.kt b/src/main/kotlin/no/kartverket/matrikkel/bygning/models/Egenregistrering.kt deleted file mode 100644 index c547467c..00000000 --- a/src/main/kotlin/no/kartverket/matrikkel/bygning/models/Egenregistrering.kt +++ /dev/null @@ -1,18 +0,0 @@ -package no.kartverket.matrikkel.bygning.models - -// TODO Hent fra kodelister i stedet for å definere selv -enum class OppvarmingsKode { - Elektrisk, Sentralvarme, Annen -} - -enum class EnergikildeKode { - Biobrensel, Elektrisitet, Fjernvarme, Gass, Oljeparafin, Solenergi, Varmepumpe, Annen -} - -enum class AvlopKode { - OffentligKloakk, PrivatKloakk, Ingen, -} - -enum class VannforsyningKode { - OffentligVannverk, TilknyttetPrivatVannverk, AnnenPrivatInnlagtVann, AnnenPrivatIkkeInnlagtVann, -} diff --git a/src/main/kotlin/no/kartverket/matrikkel/bygning/models/kodelister/EgenregistreringKoder.kt b/src/main/kotlin/no/kartverket/matrikkel/bygning/models/kodelister/EgenregistreringKoder.kt new file mode 100644 index 00000000..d9f1fe85 --- /dev/null +++ b/src/main/kotlin/no/kartverket/matrikkel/bygning/models/kodelister/EgenregistreringKoder.kt @@ -0,0 +1,97 @@ +package no.kartverket.matrikkel.bygning.models.kodelister + +import kotlinx.serialization.Serializable +import kotlin.reflect.KClass + +// Kan det finnes flere presentasjonsnavn på én kode? For eksempel per ett på bokmål og ett på nynorsk? +interface IKode { + val presentasjonsnavn: String + val beskrivelse: String +} + +@Serializable +data class Kode( + val kode: String, + val presentasjonsnavn: String, + val beskrivelse: String +) + +@Serializable +enum class VannforsyningsKode( + override val presentasjonsnavn: String, + override val beskrivelse: String +) : IKode { + OffentligVannverk("Offentlig vannverk", "Bygget er tilknyttet offentlig vannverk"), + TilknyttetPrivatVannverk( + "Tilknyttet privat vannverk", + "Bygget er tilknyttet privat vannverk. Privat vannverk er nett som forsyner mer enn 100 personer eller 20 husstander." + ), + AnnenPrivatInnlagtVann( + "Annen privat med innlagt vann", + "Annen privat vannforsyning, bygget har innlagt vann" + ), + AnnenPrivatIkkeInnlagtVann( + "Annen privat men ikke innlagt vann", + "Annen privat vannforsyning, bygget har ikke innlagt vann" + ) +} + +@Serializable +enum class AvlopsKode( + override val presentasjonsnavn: String, + override val beskrivelse: String +) : IKode { + OffentligKloakk("Offentlig kloakk", "Avløp er offentlig kloakk"), + PrivatKloakk("Privat kloakk", "Avløp er privat kloakk"), + IngenKloakk("Ingen kloakk", "Ingen tilknytning til kloakk") +} + +@Serializable +enum class EnergikildeKode( + override val presentasjonsnavn: String, + override val beskrivelse: String +) : IKode { + AnnenEnergikilde( + "Annen energikilde", + "Energikildekode for annen energikilde enn de som har ferdigdefinerte koder" + ), + Biobrensel("Biobrensel", "Energikildekode for biobrensel"), + Elektrisitet("Elektrisitet", "Energikildekode for elektrisitet"), + Fjernvarme("Fjernvarme", "Energikildekode for fjernvarme"), + Gass("Gass", "Energikildekode for gass"), + OljeParafin("Olje eller parafin", "Energikildekode for olje eller parafin"), + Solenergi("Solenergi", "Energikildekode for solenergi"), + Varmepumpe("Varmepumpe", "Energikildekode for varmepumpe"), +} + +@Serializable +enum class OppvarmingsKode( + override val presentasjonsnavn: String, + override val beskrivelse: String +) : IKode { + Elektrisk("Elektrisk", "Elektrisk oppvarming"), + Sentralvarme("Sentralvarme", "Sentralvarme"), + AnnenOppvarming("Annen oppvarming", "Annen oppvarming") +} + +@Serializable +data class KodelisterResponse( + val vannforsyningsKoder: List, + val avlopsKoder: List, + val energikildeKoder: List, + val oppvarmingsKoder: List, +) + +/* + * Enums i Kotlin returnerer kun name parameteret ved bruk av EnumClass.entries(). Denne extension functionen er til for å kunne returnere + * alle relevante parametere + */ +inline fun KClass.toKodeList(): List where T : Enum, T : IKode { + return enumValues().map { + Kode( + kode = it.name, + presentasjonsnavn = it.presentasjonsnavn, + beskrivelse = it.beskrivelse + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/no/kartverket/matrikkel/bygning/models/requests/EgenregistreringRequest.kt b/src/main/kotlin/no/kartverket/matrikkel/bygning/models/requests/EgenregistreringRequest.kt index f171ad14..f8594d2b 100644 --- a/src/main/kotlin/no/kartverket/matrikkel/bygning/models/requests/EgenregistreringRequest.kt +++ b/src/main/kotlin/no/kartverket/matrikkel/bygning/models/requests/EgenregistreringRequest.kt @@ -3,10 +3,10 @@ package no.kartverket.matrikkel.bygning.models.requests import kotlinx.datetime.Instant import kotlinx.datetime.LocalDate import kotlinx.serialization.Serializable -import no.kartverket.matrikkel.bygning.models.AvlopKode -import no.kartverket.matrikkel.bygning.models.EnergikildeKode -import no.kartverket.matrikkel.bygning.models.OppvarmingsKode -import no.kartverket.matrikkel.bygning.models.VannforsyningKode +import no.kartverket.matrikkel.bygning.models.kodelister.AvlopsKode +import no.kartverket.matrikkel.bygning.models.kodelister.EnergikildeKode +import no.kartverket.matrikkel.bygning.models.kodelister.OppvarmingsKode +import no.kartverket.matrikkel.bygning.models.kodelister.VannforsyningsKode @Serializable data class RegistreringMetadataRequest( @@ -27,12 +27,12 @@ data class BruksarealRegistrering( @Serializable data class VannforsyningsRegistrering( - val vannforsyning: VannforsyningKode, val metadata: RegistreringMetadataRequest + val vannforsyning: VannforsyningsKode, val metadata: RegistreringMetadataRequest ) @Serializable data class AvlopRegistrering( - val avlop: AvlopKode, val metadata: RegistreringMetadataRequest + val avlop: AvlopsKode, val metadata: RegistreringMetadataRequest ) @Serializable diff --git a/src/main/kotlin/no/kartverket/matrikkel/bygning/routes/v1/BaseRoutes.kt b/src/main/kotlin/no/kartverket/matrikkel/bygning/routes/v1/BaseRoutes.kt index 2c6f88a3..adbde741 100644 --- a/src/main/kotlin/no/kartverket/matrikkel/bygning/routes/v1/BaseRoutes.kt +++ b/src/main/kotlin/no/kartverket/matrikkel/bygning/routes/v1/BaseRoutes.kt @@ -9,8 +9,7 @@ import no.kartverket.matrikkel.bygning.services.BygningService import no.kartverket.matrikkel.bygning.services.EgenregistreringsService fun Application.baseRoutesV1( - bygningService: BygningService, - egenregistreringsService: EgenregistreringsService + bygningService: BygningService, egenregistreringsService: EgenregistreringsService ) { routing { swagger() @@ -24,6 +23,7 @@ fun Application.baseRoutesV1( route("v1") { bygningRouting(bygningService, egenregistreringsService) + kodelisteRouting() } } diff --git a/src/main/kotlin/no/kartverket/matrikkel/bygning/routes/v1/EgenregisteringRoutes.kt b/src/main/kotlin/no/kartverket/matrikkel/bygning/routes/v1/EgenregisteringRoutes.kt index 1a1b2c2b..e45f32de 100644 --- a/src/main/kotlin/no/kartverket/matrikkel/bygning/routes/v1/EgenregisteringRoutes.kt +++ b/src/main/kotlin/no/kartverket/matrikkel/bygning/routes/v1/EgenregisteringRoutes.kt @@ -12,7 +12,7 @@ import io.ktor.server.routing.* import kotlinx.datetime.Clock import kotlinx.datetime.TimeZone import kotlinx.datetime.toLocalDateTime -import no.kartverket.matrikkel.bygning.models.EnergikildeKode +import no.kartverket.matrikkel.bygning.models.kodelister.EnergikildeKode import no.kartverket.matrikkel.bygning.models.requests.* import no.kartverket.matrikkel.bygning.services.EgenregistreringsService @@ -59,7 +59,7 @@ private fun Route.egenregistreringBygningIdDoc() { request { requestType() required(true) - description("Egeneregistrert data") + description("Egenregistrert data") examples( "Bygning Id 1" to EgenregistreringRequest( bygningsRegistrering = BygningsRegistrering( diff --git a/src/main/kotlin/no/kartverket/matrikkel/bygning/routes/v1/KodelisteRoutes.kt b/src/main/kotlin/no/kartverket/matrikkel/bygning/routes/v1/KodelisteRoutes.kt new file mode 100644 index 00000000..c2660246 --- /dev/null +++ b/src/main/kotlin/no/kartverket/matrikkel/bygning/routes/v1/KodelisteRoutes.kt @@ -0,0 +1,75 @@ +package no.kartverket.matrikkel.bygning.routes.v1 + +import io.bkbn.kompendium.core.metadata.GetInfo +import io.bkbn.kompendium.core.plugin.NotarizedRoute +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import no.kartverket.matrikkel.bygning.models.kodelister.* +import kotlin.reflect.KClass + +fun Route.kodelisteRouting() { + route("/kodelister") { + kodelisterDoc() + get { + call.respond( + KodelisterResponse( + energikildeKoder = EnergikildeKode::class.toKodeList(), + vannforsyningsKoder = VannforsyningsKode::class.toKodeList(), + avlopsKoder = AvlopsKode::class.toKodeList(), + oppvarmingsKoder = OppvarmingsKode::class.toKodeList(), + ) + ) + } + + kodelisteRoute("avlop", AvlopsKode::class) + kodelisteRoute("oppvarming", OppvarmingsKode::class) + kodelisteRoute("energikilde", EnergikildeKode::class) + kodelisteRoute("vannforsyning", VannforsyningsKode::class) + + } +} + +private inline fun Route.kodelisteRoute( + name: String, kodeClass: KClass +): Route where T : Enum, T : IKode { + return route(name) { + kodelisteDoc(name) + get { + call.respond(kodeClass.toKodeList()) + } + } +} + +private fun Route.kodelisterDoc() { + install(NotarizedRoute()) { + tags = setOf("Kodelister") + get = GetInfo.builder { + summary("Henter alle kodelister relatert til egenregistreringer") + description("Henter alle kodelister relatert til egenregistreringer, med tilhørende kode, kodenavn, presentasjonsnavn og beskrivelse") + + response { + responseCode(HttpStatusCode.OK) + responseType() + description("Kodelister") + } + } + } +} + +private fun Route.kodelisteDoc(name: String) { + install(NotarizedRoute()) { + tags = setOf("Kodelister") + get = GetInfo.builder { + summary("Henter kodeliste relatert til $name") + description("Henter kodeliste relatert til $name, med tilhørende kode, kodenavn, presentasjonsnavn og beskrivelse") + + response { + responseCode(HttpStatusCode.OK) + responseType>() + description("Kodeliste for $name") + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/db/migration/V1__init_db.sql b/src/main/resources/db/migration/V1__init_db.sql index 4ce3b4f0..71c2a780 100644 --- a/src/main/resources/db/migration/V1__init_db.sql +++ b/src/main/resources/db/migration/V1__init_db.sql @@ -1,53 +1 @@ -create schema if not exists bygning; - -create table if not exists oppvarming -( - id serial primary key, - navn varchar(50) not null -); - -create table if not exists energikilde -( - id serial primary key, - navn varchar(50) not null -); - -create table if not exists bygning -( - id varchar(50) primary key, - byggeaar int, - vann boolean not null, - avlop boolean not null -); - -create table if not exists bygning_oppvarminger -( - bygning_id varchar(50) not null, - oppvarming_id int not null -); - -create table if not exists bygning_energikilder -( - bygning_id varchar(50) not null, - energikilde_id int not null -); - -alter table bygning_oppvarminger - add primary key (bygning_id, oppvarming_id); -alter table bygning_energikilder - add primary key (bygning_id, energikilde_id); - -insert into oppvarming (navn) -values ('varmepumpe'); -insert into energikilde (navn) -values ('geotermisk'); - -insert into bygning (id, vann, avlop) -values ('1', true, true); -insert into bygning (id, byggeaar, vann, avlop) -values ('2', 1983, true, false); - -insert into bygning_oppvarminger (bygning_id, oppvarming_id) -values ('1', 1); -insert into bygning_energikilder (bygning_id, energikilde_id) -VALUES ('2', 1); \ No newline at end of file +create schema if not exists bygning; \ No newline at end of file