Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TB-59 Aggregerte registeringer på bruksenhet og bygning #89

Merged
merged 9 commits into from
Sep 16, 2024
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package no.kartverket.matrikkel.bygning.repositories

import no.kartverket.matrikkel.bygning.models.BruksarealRegistrering
import no.kartverket.matrikkel.bygning.models.BruksenhetRegistrering
import no.kartverket.matrikkel.bygning.models.BygningRegistrering
import no.kartverket.matrikkel.bygning.models.Egenregistrering
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import java.time.Instant
import java.util.*
Expand All @@ -13,91 +13,70 @@ class EgenregistreringRepositoryTest : TestWithDb() {
val egenregistreringRepository = EgenregistreringRepository(dataSource)

val defaultBygningRegistrering = BygningRegistrering(
registreringId = UUID.randomUUID(),
registreringstidspunkt = Instant.parse("2024-01-01T12:00:00.00Z"),
bygningId = 1L,
bruksarealRegistrering = BruksarealRegistrering(
bruksareal = 125.0,
),
byggeaarRegistrering = null,
vannforsyningRegistrering = null,
avlopRegistrering = null,
)

val defaultBruksenhetRegistrering = BruksenhetRegistrering(
registreringId = UUID.randomUUID(),
registreringstidspunkt = Instant.parse("2024-01-01T12:00:00.00Z"),
bruksenhetId = 1L,
bruksarealRegistrering = BruksarealRegistrering(
bruksareal = 125.0,
),
energikildeRegistrering = null,
oppvarmingRegistrering = null,
bruksenhetRegistreringer = emptyList()
)

val defaultEgenregistrering = Egenregistrering(
id = UUID.randomUUID(),
registreringstidspunkt = Instant.parse("2024-01-01T12:00:00.00Z"),
bygningId = 1L,
bygningRegistrering = defaultBygningRegistrering,
bruksenhetRegistreringer = emptyList(),
)

val defaultBruksenhetEgenregistrering = defaultEgenregistrering.copy(
bygningRegistrering = null,
bruksenhetRegistreringer = listOf(
defaultBruksenhetRegistrering,
),
)

@Test
fun `lagring av to egenregistreringer med bygningregistrering skal returnere nyeste registrering ved henting`() {
val newUUIDEgenregistrering = UUID.randomUUID()
val newUUIDBygningRegistrering = UUID.randomUUID()
fun `lagring av 1 egenregistrering skal kun returnere 1 egenregistrering`() {
egenregistreringRepository.saveEgenregistrering(defaultEgenregistrering)

val bygningRegistreringer = egenregistreringRepository.getAllEgenregistreringerForBygning(1L)

assertThat(bygningRegistreringer).size().isEqualTo(1)
assertThat(bygningRegistreringer[0]).satisfies(
{ egenregistrering ->
assertThat(egenregistrering.id).isEqualTo(defaultEgenregistrering.id)
assertThat(egenregistrering.registreringstidspunkt).isEqualTo(defaultEgenregistrering.registreringstidspunkt)
}
)
}

val registrering2 = defaultEgenregistrering.copy(
id = newUUIDEgenregistrering,
defaultEgenregistrering.registreringstidspunkt.plusSeconds(60),
bygningRegistrering = defaultBygningRegistrering.copy(
registreringId = newUUIDBygningRegistrering,
bruksarealRegistrering = BruksarealRegistrering(
bruksareal = 130.0,
),
),
@Test
fun `lagring av 2 egenregistreringer skal returneres i riktig rekkefolge med seneste registreringer forst i listen`() {
val laterRegistreringId = UUID.randomUUID()
val laterRegistrering = defaultEgenregistrering.copy(
id = laterRegistreringId,
registreringstidspunkt = defaultEgenregistrering.registreringstidspunkt.plusSeconds(60)
)

egenregistreringRepository.saveEgenregistrering(defaultEgenregistrering)
egenregistreringRepository.saveEgenregistrering(registrering2)
egenregistreringRepository.saveEgenregistrering(laterRegistrering)

val newestBygningRegistrering = egenregistreringRepository.findNewestBygningRegistrering(1L)
val registreringer = egenregistreringRepository.getAllEgenregistreringerForBygning(1L)

assertThat(newestBygningRegistrering?.bruksarealRegistrering?.bruksareal).isEqualTo(130.0)
assertThat(registreringer[0].id).isEqualTo(laterRegistrering.id)
assertThat(registreringer[1].id).isEqualTo(defaultEgenregistrering.id)
}


@Test
fun `lagring av to egenregistreringer med bruksenhetregistrering skal returnere nyeste registrering ved henting`() {
val newUUIDEgenregistrering = UUID.randomUUID()
val newUUIDBruksenhetRegistrering = UUID.randomUUID()

val registrering2 = defaultBruksenhetEgenregistrering.copy(
id = newUUIDEgenregistrering,
defaultEgenregistrering.registreringstidspunkt.plusSeconds(60),
bruksenhetRegistreringer = listOf(
defaultBruksenhetRegistrering.copy(
registreringId = newUUIDBruksenhetRegistrering,
bruksarealRegistrering = BruksarealRegistrering(
bruksareal = 130.0,
),
),
),
)
fun `henting av registreringer skal gi tom liste hvis bygningen ikke har registreringer`() {
egenregistreringRepository.saveEgenregistrering(defaultEgenregistrering)

egenregistreringRepository.saveEgenregistrering(defaultBruksenhetEgenregistrering)
egenregistreringRepository.saveEgenregistrering(registrering2)
val registreringer = egenregistreringRepository.getAllEgenregistreringerForBygning(2L)

val newestBruksenhetRegistrering = egenregistreringRepository.findNewestBruksenhetRegistrering(1L)
assertThat(registreringer).isEmpty()
}

assertThat(newestBruksenhetRegistrering?.bruksarealRegistrering?.bruksareal).isEqualTo(130.0)
// Aner ikke om dette er en vettug måte å gjøre dette på? Vi må ha en måte å ha en tom db mellom tester, hvert fall
@BeforeEach
fun clearEgenregistreringer() {
dataSource.connection.use { connection ->
connection.createStatement().use { statement ->
statement.execute("DELETE FROM bygning.egenregistrering")
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ fun Application.mainModule() {


val egenregistreringService = EgenregistreringService(bygningClient, egenregistreringRepository)
val bygningService = BygningService(bygningClient, egenregistreringRepository)
val bygningService = BygningService(bygningClient, egenregistreringService)

routing {
swagger()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,45 +16,6 @@ data class Bygning(
val vannforsyning: Vannforsyning? = null,
val avlop: Avlop? = null,
) {
fun withEgenregistrertData(bygningRegistrering: BygningRegistrering): Bygning {
val registreringstidspunkt = bygningRegistrering.registreringstidspunkt

return this.copy(
byggeaar = bygningRegistrering.byggeaarRegistrering?.byggeaar?.let {
Byggeaar(
data = it,
metadata = RegisterMetadata(
registreringstidspunkt = registreringstidspunkt,
),
)
},
bruksareal = bygningRegistrering.bruksarealRegistrering?.bruksareal?.let {
Bruksareal(
data = it,
metadata = RegisterMetadata(
registreringstidspunkt = registreringstidspunkt,
),
)
},
vannforsyning = bygningRegistrering.vannforsyningRegistrering?.vannforsyning?.let {
Vannforsyning(
data = it,
metadata = RegisterMetadata(
registreringstidspunkt = registreringstidspunkt,
),
)
},
avlop = bygningRegistrering.avlopRegistrering?.avlop?.let {
Avlop(
data = it,
metadata = RegisterMetadata(
registreringstidspunkt = registreringstidspunkt,
),
)
},
)
}

fun withBruksenheter(bruksenheter: List<Bruksenhet>): Bygning {
return this.copy(
bruksenheter = bruksenheter,
Expand All @@ -76,34 +37,4 @@ data class Bruksenhet(
val bruksareal: Bruksareal? = null,
val energikilder: List<Energikilde> = emptyList(),
val oppvarminger: List<Oppvarming> = emptyList(),
) {
fun withEgenregistrertData(bruksenhetRegistrering: BruksenhetRegistrering): Bruksenhet {
val registreringstidspunkt = bruksenhetRegistrering.registreringstidspunkt
return this.copy(
bruksareal = bruksenhetRegistrering.bruksarealRegistrering?.bruksareal?.let {
Bruksareal(
data = it,
metadata = RegisterMetadata(
registreringstidspunkt = registreringstidspunkt,
),
)
},
energikilder = bruksenhetRegistrering.energikildeRegistrering?.energikilder?.map {
Energikilde(
data = it,
metadata = RegisterMetadata(
registreringstidspunkt = registreringstidspunkt,
),
)
} ?: emptyList(),
oppvarminger = bruksenhetRegistrering.oppvarmingRegistrering?.oppvarminger?.map {
Oppvarming(
data = it,
metadata = RegisterMetadata(
registreringstidspunkt = registreringstidspunkt,
),
)
} ?: emptyList(),
)
}
}
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package no.kartverket.matrikkel.bygning.models

/**
* Burde vi kanskje sortere egenregistreringer her, da vi er avhengig av at egenregistreringene er sortert her,
* men ikke nødvendigvis andre steder?
*/

fun Bygning.withEgenregistrertData(egenregistreringer: List<Egenregistrering>): Bygning {
return egenregistreringer.fold(this) { bygningAggregate, egenregistrering ->
Bygning(
bygningId = bygningAggregate.bygningId,
bygningsnummer = bygningAggregate.bygningsnummer,
bruksenheter = bygningAggregate.bruksenheter,
byggeaar = bygningAggregate.byggeaar ?: egenregistrering.bygningRegistrering.byggeaarRegistrering?.let {
Byggeaar(
data = it.byggeaar,
metadata = RegisterMetadata(
registreringstidspunkt = egenregistrering.registreringstidspunkt,
),
)
},
bruksareal = bygningAggregate.bruksareal ?: egenregistrering.bygningRegistrering.bruksarealRegistrering?.let {
Bruksareal(
data = it.bruksareal,
metadata = RegisterMetadata(
registreringstidspunkt = egenregistrering.registreringstidspunkt,
),
)
},
vannforsyning = bygningAggregate.vannforsyning ?: egenregistrering.bygningRegistrering.vannforsyningRegistrering?.let {
Vannforsyning(
data = it.vannforsyning,
metadata = RegisterMetadata(
registreringstidspunkt = egenregistrering.registreringstidspunkt,
),
)
},
avlop = bygningAggregate.avlop ?: egenregistrering.bygningRegistrering.avlopRegistrering?.let {
Avlop(
data = it.avlop,
metadata = RegisterMetadata(
registreringstidspunkt = egenregistrering.registreringstidspunkt,
),
)
},
)
}
}


fun Bruksenhet.withEgenregistrertData(egenregistreringer: List<Egenregistrering>): Bruksenhet {
// Her så antar jeg at man bare har registrert bruksenheten én gang per registrering, som gir mening
// Likevel har vi ikke noen logisk sjekk på dette ved registrering, så det bør vi nok ha
val bruksenhetRegistreringer = egenregistreringer.mapNotNull { egenregistrering ->
val bruksenhetRegistrering =
egenregistrering.bygningRegistrering.bruksenhetRegistreringer.filter { it.bruksenhetId == this.bruksenhetId }.firstOrNull()

if (bruksenhetRegistrering != null) {
egenregistrering.registreringstidspunkt to bruksenhetRegistrering
} else {
null
}
}

// Jeg er litt usikker på om det er nødvendig å filtrere ut og lage et Pair, så folde på bare bruksenhetregistreringene
// fremfor å gjøre det på hele bygningregistreringen dersom vi legger til logikk for å kun godkjenne én registrering
return bruksenhetRegistreringer.fold(this) { bruksenhetAggregate, egenregistrering ->
Bruksenhet(
bruksenhetId = bruksenhetAggregate.bruksenhetId,
bygningId = bruksenhetAggregate.bygningId,
bruksareal = bruksenhetAggregate.bruksareal ?: egenregistrering.second.bruksarealRegistrering?.let {
Bruksareal(
data = it.bruksareal,
metadata = RegisterMetadata(
registreringstidspunkt = egenregistrering.first,
),
)
},
energikilder = bruksenhetAggregate.energikilder.takeIf { it.isNotEmpty() }
?: egenregistrering.second.energikildeRegistrering?.let {
it.energikilder.map { registrertKilde ->
Energikilde(
data = registrertKilde,
metadata = RegisterMetadata(
registreringstidspunkt = egenregistrering.first,
),
)
}
} ?: emptyList(),
oppvarminger = bruksenhetAggregate.oppvarminger.takeIf { it.isNotEmpty() }
?: egenregistrering.second.oppvarmingRegistrering?.let {
it.oppvarminger.map { registrertOppvarming ->
Oppvarming(
data = registrertOppvarming,
metadata = RegisterMetadata(
registreringstidspunkt = egenregistrering.first,
),
)
}
} ?: emptyList(),
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ 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
import no.kartverket.matrikkel.bygning.serializers.InstantSerializer
import no.kartverket.matrikkel.bygning.serializers.UUIDSerializer
import java.time.Instant
import java.util.*

Expand Down Expand Up @@ -40,44 +38,28 @@ data class OppvarmingRegistrering(
val oppvarminger: List<OppvarmingKode>,
)

sealed interface Registrering {
val registreringId: UUID
val registreringstidspunkt: Instant
val bruksarealRegistrering: BruksarealRegistrering?
}

@Serializable
data class BygningRegistrering(
@Serializable(with = UUIDSerializer::class)
override val registreringId: UUID,
val bygningId: Long,
override val bruksarealRegistrering: BruksarealRegistrering?,
val bruksarealRegistrering: BruksarealRegistrering?,
val byggeaarRegistrering: ByggeaarRegistrering?,
val vannforsyningRegistrering: VannforsyningRegistrering?,
val avlopRegistrering: AvlopRegistrering?,
@Serializable(with = InstantSerializer::class)
override val registreringstidspunkt: Instant,
) : Registrering
val bruksenhetRegistreringer: List<BruksenhetRegistrering>
)

@Serializable
data class BruksenhetRegistrering(
@Serializable(with = UUIDSerializer::class)
override val registreringId: UUID,
val bruksenhetId: Long,
override val bruksarealRegistrering: BruksarealRegistrering?,
val bruksarealRegistrering: BruksarealRegistrering?,
val energikildeRegistrering: EnergikildeRegistrering?,
val oppvarmingRegistrering: OppvarmingRegistrering?,
@Serializable(with = InstantSerializer::class)
override val registreringstidspunkt: Instant,
) : Registrering
)


// Ikke så fan av at egenregistrering har bygningID på toppnivå, og en bygning også har bygningId
// Per nå trenger man det for at bygningRegistreringer kan hentes opp på bygningId, samt at man må hente riktig bygning og bruksenheter
// når man egenregistrerer bruksenheter
data class Egenregistrering(
val id: UUID,
val registreringstidspunkt: Instant,
val bygningId: Long,
val bygningRegistrering: BygningRegistrering?,
val bruksenhetRegistreringer: List<BruksenhetRegistrering>?
val bygningRegistrering: BygningRegistrering,
)
Loading
Loading