Skip to content

Commit

Permalink
TB-33 TB-34 Kodelister med tilhørende endepunkt (#16)
Browse files Browse the repository at this point in the history
* wip kodelister

* koder for egenregistrering

* remove sql for kodelister, prefer runtime

* better kodeliste routes with more use of generics

* update kodelister to not have a short form code
  • Loading branch information
anderssonw authored Jul 22, 2024
1 parent 626d3e8 commit 2ce1cc6
Show file tree
Hide file tree
Showing 7 changed files with 183 additions and 81 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<Kode>,
val avlopsKoder: List<Kode>,
val energikildeKoder: List<Kode>,
val oppvarmingsKoder: List<Kode>,
)

/*
* 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 <reified T> KClass<T>.toKodeList(): List<Kode> where T : Enum<T>, T : IKode {
return enumValues<T>().map {
Kode(
kode = it.name,
presentasjonsnavn = it.presentasjonsnavn,
beskrivelse = it.beskrivelse
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -24,6 +23,7 @@ fun Application.baseRoutesV1(

route("v1") {
bygningRouting(bygningService, egenregistreringsService)
kodelisteRouting()
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -59,7 +59,7 @@ private fun Route.egenregistreringBygningIdDoc() {
request {
requestType<EgenregistreringRequest>()
required(true)
description("Egeneregistrert data")
description("Egenregistrert data")
examples(
"Bygning Id 1" to EgenregistreringRequest(
bygningsRegistrering = BygningsRegistrering(
Expand Down
Original file line number Diff line number Diff line change
@@ -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 <reified T> Route.kodelisteRoute(
name: String, kodeClass: KClass<T>
): Route where T : Enum<T>, 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<KodelisterResponse>()
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<List<Kode>>()
description("Kodeliste for $name")
}
}
}
}
54 changes: 1 addition & 53 deletions src/main/resources/db/migration/V1__init_db.sql
Original file line number Diff line number Diff line change
@@ -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);
create schema if not exists bygning;

0 comments on commit 2ce1cc6

Please sign in to comment.