Skip to content

Commit

Permalink
create domain models and response models for Bygning/Bruksenhet and m…
Browse files Browse the repository at this point in the history
…ove models around to better see where they are used
  • Loading branch information
anderssonw committed Aug 23, 2024
1 parent 6a5be3d commit c6431da
Show file tree
Hide file tree
Showing 14 changed files with 156 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import io.ktor.client.request.*
import io.ktor.http.*
import io.ktor.server.testing.*
import no.kartverket.matrikkel.bygning.TestWithDb
import no.kartverket.matrikkel.bygning.matrikkel.Bygning
import no.kartverket.matrikkel.bygning.routes.v1.dto.response.BygningResponse
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

Expand All @@ -18,8 +18,8 @@ class BygningRouteTest : TestWithDb() {
val response = client.get("/v1/bygninger/1")

assertThat(response.status).isEqualTo(HttpStatusCode.OK)
assertThat(response.body<Bygning>().bygningId).isEqualTo(1L)
assertThat(response.body<Bygning>().bruksenheter).hasSize(2)
assertThat(response.body<BygningResponse>().bygningId).isEqualTo(1L)
assertThat(response.body<BygningResponse>().bruksenheter).hasSize(2)
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import io.ktor.client.request.*
import io.ktor.http.*
import io.ktor.server.testing.*
import no.kartverket.matrikkel.bygning.TestWithDb
import no.kartverket.matrikkel.bygning.models.requests.BruksarealRegistrering
import no.kartverket.matrikkel.bygning.models.requests.BruksenhetRegistreringRequest
import no.kartverket.matrikkel.bygning.models.requests.ByggeaarRegistrering
import no.kartverket.matrikkel.bygning.models.requests.BygningRegistreringRequest
import no.kartverket.matrikkel.bygning.models.requests.EgenregistreringRequest
import no.kartverket.matrikkel.bygning.models.BruksarealRegistrering
import no.kartverket.matrikkel.bygning.models.ByggeaarRegistrering
import no.kartverket.matrikkel.bygning.routes.v1.dto.request.BruksenhetRegistreringRequest
import no.kartverket.matrikkel.bygning.routes.v1.dto.request.BygningRegistreringRequest
import no.kartverket.matrikkel.bygning.routes.v1.dto.request.EgenregistreringRequest
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

Expand All @@ -22,8 +22,8 @@ class EgenregistreringRouteTest : TestWithDb() {
contentType(ContentType.Application.Json)
setBody(
EgenregistreringRequest(
bygningId = 1L,
bygningRegistrering = BygningRegistreringRequest(
bygningId = 1L,
bruksarealRegistrering = BruksarealRegistrering(bruksareal = 125.0),
byggeaarRegistrering = ByggeaarRegistrering(byggeaar = 2010),
vannforsyningRegistrering = null,
Expand Down Expand Up @@ -52,8 +52,8 @@ class EgenregistreringRouteTest : TestWithDb() {
contentType(ContentType.Application.Json)
setBody(
EgenregistreringRequest(
bygningId = 1L,
bygningRegistrering = BygningRegistreringRequest(
bygningId = 1L,
bruksarealRegistrering = BruksarealRegistrering(bruksareal = 125.0),
byggeaarRegistrering = ByggeaarRegistrering(byggeaar = 2010),
vannforsyningRegistrering = null,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package no.kartverket.matrikkel.bygning.matrikkel

import no.kartverket.matrikkel.bygning.models.Bygning


interface BygningClient {
fun getBygningById(id: Long): Bygning?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package no.kartverket.matrikkel.bygning.matrikkel.adapters

import no.kartverket.matrikkel.bygning.matrikkel.Bruksenhet
import no.kartverket.matrikkel.bygning.matrikkel.Bygning
import no.kartverket.matrikkel.bygning.matrikkel.BygningClient
import no.kartverket.matrikkel.bygning.models.Bruksenhet
import no.kartverket.matrikkel.bygning.models.Bygning

internal class LocalBygningClient : BygningClient {
private val bruksenheter: List<Bruksenhet> = listOf(
Expand All @@ -13,7 +13,6 @@ internal class LocalBygningClient : BygningClient {
Bruksenhet(
bruksenhetId = 2L,
bygningId = 1L,
bruksareal = 148.0
),
Bruksenhet(
bruksenhetId = 3L,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package no.kartverket.matrikkel.bygning.matrikkel.adapters

import no.kartverket.matrikkel.bygning.matrikkel.Bruksenhet
import no.kartverket.matrikkel.bygning.matrikkel.Bygning
import no.kartverket.matrikkel.bygning.matrikkel.BygningClient
import no.kartverket.matrikkel.bygning.matrikkelapi.MatrikkelApi
import no.kartverket.matrikkel.bygning.matrikkelapi.getObjectAs
import no.kartverket.matrikkel.bygning.matrikkelapi.getObjectsAs
import no.kartverket.matrikkel.bygning.models.Bruksenhet
import no.kartverket.matrikkel.bygning.models.Bygning
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.domain.bygning.BygningId
import no.statkart.matrikkel.matrikkelapi.wsapi.v1.service.store.ServiceException
import org.slf4j.Logger
Expand Down Expand Up @@ -39,7 +39,7 @@ internal class MatrikkelBygningClient(
},
)
} catch (exception: ServiceException) {
log.warn("Noe gikk galt under henting av bygning med id {}", bygningId, exception)
log.warn("Noe gikk galt under henting av bygning med id {}", bygningId.value, exception)
return null
}
}
Expand Down
42 changes: 42 additions & 0 deletions src/main/kotlin/no/kartverket/matrikkel/bygning/models/Bygning.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package no.kartverket.matrikkel.bygning.models

import no.kartverket.matrikkel.bygning.models.kodelister.AvlopKode
import no.kartverket.matrikkel.bygning.models.kodelister.EnergikildeKode
import no.kartverket.matrikkel.bygning.models.kodelister.OppvarmingKode
import no.kartverket.matrikkel.bygning.models.kodelister.VannforsyningKode

// TODO Sette opp DTOer for Bygning/Bruksenhet hentet fra Matrikkel
data class Bygning(
val bygningId: Long,
val bygningNummer: Long,
val bruksenheter: List<Bruksenhet>,
val byggeaar: Int? = null,
val bruksareal: Double? = null,
val vannforsyning: VannforsyningKode? = null,
val avlop: AvlopKode? = null,
) {
fun withEgenregistrertData(bygningRegistrering: BygningRegistrering): Bygning {
return this.copy(
byggeaar = bygningRegistrering.byggeaarRegistrering?.byggeaar,
bruksareal = bygningRegistrering.bruksarealRegistrering?.bruksareal,
vannforsyning = bygningRegistrering.vannforsyningRegistrering?.vannforsyning,
avlop = bygningRegistrering.avlopRegistrering?.avlop,
)
}
}

data class Bruksenhet(
val bruksenhetId: Long,
val bygningId: Long,
val bruksareal: Double? = null,
val energikilder: List<EnergikildeKode> = emptyList(),
val oppvarminger: List<OppvarmingKode> = emptyList(),
) {
fun withEgenregistrertData(bruksenhetRegistrering: BruksenhetRegistrering): Bruksenhet {
return this.copy(
bruksareal = bruksenhetRegistrering.bruksarealRegistrering?.bruksareal,
energikilder = bruksenhetRegistrering.energikildeRegistrering?.energikilder ?: emptyList(),
oppvarminger = bruksenhetRegistrering.oppvarmingRegistrering?.oppvarminger ?: emptyList(),
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,15 @@ sealed interface ErrorResponse {
override val correlationId: String = resolveCallID(),
override val details: List<ErrorDetail> = emptyList(),
) : ErrorResponse

@Serializable
class NotFoundError(
override val status: Int = HttpStatusCode.NotFound.value,
override val title: String = "Ikke funnet",
override val description: String = "Ressursen du etterspurte kunne ikke bli funnet",
override val correlationId: String = resolveCallID(),
override val details: List<ErrorDetail> = emptyList(),
) : ErrorResponse
}

fun resolveCallID(): String {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import io.ktor.server.util.*
import no.kartverket.matrikkel.bygning.matrikkel.Bruksenhet
import no.kartverket.matrikkel.bygning.matrikkel.Bygning
import no.kartverket.matrikkel.bygning.models.Result.ErrorResult
import no.kartverket.matrikkel.bygning.models.Result.Success
import no.kartverket.matrikkel.bygning.models.responses.ErrorResponse
import no.kartverket.matrikkel.bygning.routes.v1.dto.response.BruksenhetResponse
import no.kartverket.matrikkel.bygning.routes.v1.dto.response.BygningResponse
import no.kartverket.matrikkel.bygning.routes.v1.dto.response.toBruksenhetResponse
import no.kartverket.matrikkel.bygning.routes.v1.dto.response.toBygningResponse
import no.kartverket.matrikkel.bygning.services.BygningService

fun Route.bygningRouting(
Expand All @@ -26,11 +28,15 @@ fun Route.bygningRouting(
val bygningId = call.parameters.getOrFail("bygningId").toLong()

when (val result = bygningService.getBygningWithEgenregistrertData(bygningId)) {
is Success -> call.respond(HttpStatusCode.OK, result.data)
is Success -> {
val bygningResponse = result.data.toBygningResponse()

call.respond(HttpStatusCode.OK, bygningResponse)
}

is ErrorResult -> call.respond(
HttpStatusCode.BadRequest,
ErrorResponse.ValidationError(
HttpStatusCode.NotFound,
ErrorResponse.NotFoundError(
details = result.errors,
),
)
Expand All @@ -46,11 +52,15 @@ fun Route.bygningRouting(
val bruksenhetId = call.parameters.getOrFail("bruksenhetId").toLong()

when (val result = bygningService.getBruksenhetWithEgenregistrertData(bygningId, bruksenhetId)) {
is Success -> call.respond(HttpStatusCode.OK, result.data)
is Success -> {
val bruksenhetResponse = result.data.toBruksenhetResponse()

call.respond(HttpStatusCode.OK, bruksenhetResponse)
}

is ErrorResult -> call.respond(
HttpStatusCode.BadRequest,
ErrorResponse.ValidationError(
HttpStatusCode.NotFound,
ErrorResponse.NotFoundError(
details = result.errors,
),
)
Expand All @@ -76,13 +86,13 @@ private fun Route.bygningDoc() {

response {
responseCode(HttpStatusCode.OK)
responseType<Bygning>()
responseType<BygningResponse>()
description("Bygning med tilhørende bruksenheter")
}

canRespond {
responseCode(HttpStatusCode.NotFound)
responseType<ErrorResponse.BadRequestError>()
responseType<ErrorResponse.NotFoundError>()
description("Fant ikke bygning med gitt id")
}
}
Expand All @@ -91,7 +101,7 @@ private fun Route.bygningDoc() {

private fun Route.bruksenhetDoc() {
install(NotarizedRoute()) {
tags = setOf("Bruksenheter")
tags = setOf("Bygninger")
parameters = listOf(
Parameter(
name = "bygningId", `in` = Parameter.Location.path, schema = TypeDefinition.STRING,
Expand All @@ -107,13 +117,13 @@ private fun Route.bruksenhetDoc() {

response {
responseCode(HttpStatusCode.OK)
responseType<Bruksenhet>()
responseType<BruksenhetResponse>()
description("Bruksenhet")
}

canRespond {
responseCode(HttpStatusCode.NotFound)
responseType<ErrorResponse.BadRequestError>()
responseType<ErrorResponse.NotFoundError>()
description("Fant ikke bruksenhet med gitt id")
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ import no.kartverket.matrikkel.bygning.models.EnergikildeRegistrering
import no.kartverket.matrikkel.bygning.models.Result.ErrorResult
import no.kartverket.matrikkel.bygning.models.Result.Success
import no.kartverket.matrikkel.bygning.models.kodelister.EnergikildeKode
import no.kartverket.matrikkel.bygning.models.requests.BruksenhetRegistreringRequest
import no.kartverket.matrikkel.bygning.models.requests.BygningRegistreringRequest
import no.kartverket.matrikkel.bygning.models.requests.EgenregistreringRequest
import no.kartverket.matrikkel.bygning.models.responses.ErrorResponse
import no.kartverket.matrikkel.bygning.routes.v1.dto.request.BruksenhetRegistreringRequest
import no.kartverket.matrikkel.bygning.routes.v1.dto.request.BygningRegistreringRequest
import no.kartverket.matrikkel.bygning.routes.v1.dto.request.EgenregistreringRequest
import no.kartverket.matrikkel.bygning.services.EgenregistreringService

fun Route.egenregistreringRouting(egenregistreringService: EgenregistreringService) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package no.kartverket.matrikkel.bygning.models.requests
package no.kartverket.matrikkel.bygning.routes.v1.dto.request

import kotlinx.serialization.Serializable
import no.kartverket.matrikkel.bygning.models.AvlopRegistrering
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package no.kartverket.matrikkel.bygning.routes.v1.dto.response

import kotlinx.serialization.Serializable
import no.kartverket.matrikkel.bygning.models.Bruksenhet
import no.kartverket.matrikkel.bygning.models.Bygning
import no.kartverket.matrikkel.bygning.models.kodelister.AvlopKode
import no.kartverket.matrikkel.bygning.models.kodelister.EnergikildeKode
import no.kartverket.matrikkel.bygning.models.kodelister.OppvarmingKode
import no.kartverket.matrikkel.bygning.models.kodelister.VannforsyningKode

@Serializable
data class BygningResponse(
val bygningId: Long,
val bygningNummer: Long,
val byggeaar: Int? = null,
val bruksareal: Double? = null,
val vannforsyning: VannforsyningKode? = null,
val avlop: AvlopKode? = null,
val bruksenheter: List<BruksenhetResponse>,
)

fun Bygning.toBygningResponse(): BygningResponse = BygningResponse(
bygningId = this.bygningId,
bygningNummer = this.bygningNummer,
bruksareal = this.bruksareal,
byggeaar = this.byggeaar,
bruksenheter = this.bruksenheter.map { it.toBruksenhetResponse() },
vannforsyning = this.vannforsyning,
avlop = this.avlop,
)

@Serializable
data class BruksenhetResponse(
val bruksenhetId: Long,
val bruksareal: Double? = null,
val energikilder: List<EnergikildeKode> = emptyList(),
val oppvarminger: List<OppvarmingKode> = emptyList(),
)

fun Bruksenhet.toBruksenhetResponse(): BruksenhetResponse = BruksenhetResponse(
bruksenhetId = this.bruksenhetId,
bruksareal = this.bruksareal,
energikilder = this.energikilder,
oppvarminger = this.oppvarminger,
)
Loading

0 comments on commit c6431da

Please sign in to comment.