From ba31e1c5188b7c5e815292c0799fcbcc2ab3ba51 Mon Sep 17 00:00:00 2001 From: Erik Maximilian Forsman Date: Thu, 8 Feb 2024 17:52:11 +0100 Subject: [PATCH] =?UTF-8?q?Ei=20spr=C3=B8=20finte=20med=20=C3=A5=20generer?= =?UTF-8?q?e=20versjon=20fra=20feltene=20=F0=9F=AA=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../teamsak/behandling/Behandling.kt | 10 +--- .../teamsak/behandling/Versjon.kt | 53 +++++++++++++------ .../teamsak/PostgresBehandlingDao.kt | 5 +- .../teamsak/PostgresBehandlingDaoTest.kt | 2 - .../teamsak/behandling/VersjonTest.kt | 41 ++++++++------ 5 files changed, 66 insertions(+), 45 deletions(-) diff --git a/styringsinfo/src/main/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/Behandling.kt b/styringsinfo/src/main/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/Behandling.kt index 5a1b5a51..de604e9b 100644 --- a/styringsinfo/src/main/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/Behandling.kt +++ b/styringsinfo/src/main/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/Behandling.kt @@ -25,8 +25,7 @@ internal data class Behandling( internal val behandlingstatus: Behandlingstatus, internal val behandlingstype: Behandlingstype, internal val behandlingsresultat: Behandlingsresultat? = null, - internal val behandlingskilde: Behandlingskilde, - internal val versjon: Versjon = NåværendeVersjon + internal val behandlingskilde: Behandlingskilde ) { internal enum class Behandlingstatus { Registrert, @@ -58,16 +57,11 @@ internal data class Behandling( } internal fun funksjoneltLik(other: Behandling): Boolean { - return copy(funksjonellTid = MIN, versjon = Versjonløs) == other.copy(funksjonellTid = MIN, versjon = Versjonløs) + return copy(funksjonellTid = MIN) == other.copy(funksjonellTid = MIN) } fun utledBehandlingsmetode(): Behandlingsmetode = if (behandlingskilde == Behandlingskilde.Saksbehandler) Manuell else Automatisk - private companion object { - val Versjonløs = Versjon.of("0.0.0") - val NåværendeVersjon = Versjon.of("0.0.1") - } - class Builder(private val forrige: Behandling) { private var behandlingstatus: Behandlingstatus? = null diff --git a/styringsinfo/src/main/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/Versjon.kt b/styringsinfo/src/main/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/Versjon.kt index 4a2c9847..e02b86e6 100644 --- a/styringsinfo/src/main/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/Versjon.kt +++ b/styringsinfo/src/main/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/Versjon.kt @@ -1,28 +1,55 @@ package no.nav.helse.spre.styringsinfo.teamsak.behandling - internal class Versjon private constructor( private val major: Int, private val minor: Int, private val patch: Int -) { +): Comparable { private val majorUpdate get() = Versjon(major + 1, 0, 0) private val minorUpdate get() = Versjon(major, minor + 1, 0) + private val tall = "$major$minor$patch".toInt() + override fun compareTo(other: Versjon) = this.tall.compareTo(other.tall) + override fun equals(other: Any?) = other is Versjon && this.toString() == other.toString() override fun hashCode() = toString().hashCode() override fun toString() = "$major.$minor.$patch" - private val mineFelter get() = versjoner[this] ?: throw IllegalStateException("Mangler definerte felter for versjon $this") - - internal fun valider(felter: Set) { - if (felter == mineFelter) return - val nyeFelter = felter - mineFelter - if (nyeFelter.isNotEmpty()) throw IllegalStateException("Ettersom feltene $nyeFelter er lagt til burde versjon bumpes fra $this til $minorUpdate") - val fjernedeFelter = mineFelter - felter - if (fjernedeFelter.isNotEmpty()) throw IllegalStateException("Ettersom feltene $fjernedeFelter er fjernet burde versjon bumpes fra $this til $majorUpdate") - } internal companion object { + private val initiellVersjon = of("0.0.1") + private val initielleFelter = setOf("aktørId", "mottattTid", "registrertTid", "behandlingstatus", "behandlingtype", "behandlingskilde", "behandlingsmetode", "relatertBehandlingId", "behandlingsresultat") + + private fun nesteVersjon(forrigeVersjon: Versjon, forrigeFelter: Set, felter: Set): Pair, Versjon> { + check(forrigeFelter != felter) { "Trenger ikke lage en ny versjon. $forrigeVersjon dekker allerede feltene $felter" } + if ((forrigeFelter - felter).isNotEmpty()) return felter to forrigeVersjon.majorUpdate + return felter to forrigeVersjon.minorUpdate + } + + private val versjoner = listOf( + { forrigeFelter: Set, forrigeVersjon: Versjon -> nesteVersjon(forrigeVersjon, forrigeFelter, forrigeFelter + "eksempelverdi_1" + "eksempelverdi_2") }, + { forrigeFelter: Set, forrigeVersjon: Versjon -> nesteVersjon(forrigeVersjon, forrigeFelter, forrigeFelter - "eksempelverdi_2") }, + { forrigeFelter: Set, forrigeVersjon: Versjon -> nesteVersjon(forrigeVersjon, forrigeFelter, forrigeFelter - "eksempelverdi_1" + "eksempelverdi_3") } + ) + + private val genererteVersjoner = versjoner.fold(listOf(initielleFelter to initiellVersjon)) { versjoner, genererNesteVersjon -> + val (forrigeFelter, forrigeVersjon) = versjoner.last() + versjoner + genererNesteVersjon(forrigeFelter, forrigeVersjon) + }.associate { (felter, versjon) -> felter to versjon} + + internal fun of(felter: Set) = genererteVersjoner[felter] ?: genererteVersjoner.maxBy { it.value }.let { (sisteFelter, sisteVersjon) -> + val nyeFelter = felter - sisteFelter + val fjernedeFelter = sisteFelter - felter + throw IllegalStateException(""" + Finner ingen definert versjon for disse feltene. Differanse i forhold til siste versjon $sisteVersjon: + NyeFelter: ${nyeFelter.joinToString()} + FjernedeFelter: ${fjernedeFelter.joinToString()} + Legges dette til blir det versjon ${nesteVersjon(sisteVersjon, sisteFelter, felter).second} + Dette gjøres ved å legge til følgende innslag i `val versjoner`: + { forrigeFelter: Set, forrigeVersjon: Versjon -> nesteVersjon(forrigeVersjon, forrigeFelter, forrigeFelter${nyeFelter.eksempelverdi('+')}${fjernedeFelter.eksempelverdi('-')} )} + """.trimIndent()) + } + private fun Set.eksempelverdi(prefix: Char) = takeUnless { it.isEmpty() }?.let { "setOf(${it.joinToString { felt -> "\"$felt\"" }})" }?.let { " $prefix $it" } ?: "" + private val String.ikkeNegativInt get() = toIntOrNull()?.takeIf { it >= 0 } internal fun of(versjon: String): Versjon { val split = versjon.split(".") @@ -32,9 +59,5 @@ internal class Versjon private constructor( val patch = checkNotNull(split[2].ikkeNegativInt) { "Ugyldig patch $versjon" } return Versjon(major, minor, patch) } - - private val versjoner = mapOf( - of("0.0.1") to setOf("aktørId", "mottattTid", "registrertTid", "behandlingstatus", "behandlingtype", "behandlingskilde", "behandlingsmetode", "relatertBehandlingId", "behandlingsresultat") - ) } } \ No newline at end of file diff --git a/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/PostgresBehandlingDao.kt b/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/PostgresBehandlingDao.kt index 49892dbc..12b4eec3 100644 --- a/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/PostgresBehandlingDao.kt +++ b/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/PostgresBehandlingDao.kt @@ -66,13 +66,13 @@ internal class PostgresBehandlingDao(private val dataSource: DataSource): Behand putString("behandlingsresultat", behandling.behandlingsresultat?.name) } - behandling.versjon.valider(data.felter) + val versjon = Versjon.of(data.felter) check(run(queryOf(sql, mapOf( "sakId" to behandling.sakId.id, "behandlingId" to behandling.behandlingId.id, "funksjonellTid" to behandling.funksjonellTid, - "versjon" to behandling.versjon.toString(), + "versjon" to versjon.toString(), "siste" to siste, "data" to data.toString() )).asUpdate) == 1) { "Forventet at en rad skulle legges til" } @@ -93,7 +93,6 @@ internal class PostgresBehandlingDao(private val dataSource: DataSource): Behand sakId = SakId(uuid("sakId")), behandlingId = BehandlingId(uuid("behandlingId")), funksjonellTid = localDateTime("funksjonellTid"), - versjon = Versjon.of(string("versjon")), relatertBehandlingId = data.path("relatertBehandlingId").uuidOrNull?.let { BehandlingId(it) }, aktørId = data.path("aktørId").asText(), mottattTid = LocalDateTime.parse(data.path("mottattTid").asText()), diff --git a/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/PostgresBehandlingDaoTest.kt b/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/PostgresBehandlingDaoTest.kt index e7672bff..af42d15d 100644 --- a/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/PostgresBehandlingDaoTest.kt +++ b/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/PostgresBehandlingDaoTest.kt @@ -61,8 +61,6 @@ internal class PostgresBehandlingDaoTest: AbstractDatabaseTest() { assertEquals(1, behandlingId.rader) behandlingDao.lagre(behandling) behandlingDao.lagre(behandling.copy(funksjonellTid = LocalDateTime.now())) - behandlingDao.lagre(behandling.copy(versjon = Versjon.of("9.9.9"))) - behandlingDao.lagre(behandling.copy(funksjonellTid = LocalDateTime.now(), versjon = Versjon.of("9.9.9"))) assertEquals(1, behandlingId.rader) } diff --git a/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/VersjonTest.kt b/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/VersjonTest.kt index a5ccb5e1..3add7188 100644 --- a/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/VersjonTest.kt +++ b/styringsinfo/src/test/kotlin/no/nav/helse/spre/styringsinfo/teamsak/behandling/VersjonTest.kt @@ -2,7 +2,6 @@ package no.nav.helse.spre.styringsinfo.teamsak.behandling import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertDoesNotThrow import org.junit.jupiter.api.assertThrows internal class VersjonTest { @@ -17,24 +16,32 @@ internal class VersjonTest { } @Test - fun `Validerer om felter legges til eller fjernes`() { - val førsteVersjon = Versjon.of("0.0.1") - val førsteVersjonFelter = setOf("aktørId", "mottattTid", "registrertTid", "behandlingstatus", "behandlingtype", "behandlingskilde", "behandlingsmetode", "relatertBehandlingId", "behandlingsresultat") - assertDoesNotThrow { førsteVersjon.valider(førsteVersjonFelter) } - - assertEquals( - "Ettersom feltene [aktørId, mottattTid, registrertTid, behandlingstatus, behandlingtype, behandlingskilde, behandlingsmetode, relatertBehandlingId, behandlingsresultat] er fjernet burde versjon bumpes fra 0.0.1 til 1.0.0", - assertThrows { førsteVersjon.valider(emptySet()) }.message + fun `sammenligne versjoner`() { + val versjoner = listOf( + Versjon.of("0.0.1"), + Versjon.of("0.1.0"), + Versjon.of("1.0.0"), + Versjon.of("2.0.0") ) + assertEquals(Versjon.of("2.0.0"), versjoner.max()) + assertEquals(Versjon.of("0.0.1"), versjoner.min()) + } - assertEquals( - "Ettersom feltene [aktørId, mottattTid, behandlingtype, behandlingskilde, behandlingsmetode, relatertBehandlingId, behandlingsresultat] er fjernet burde versjon bumpes fra 0.0.1 til 1.0.0", - assertThrows { førsteVersjon.valider(setOf("registrertTid", "behandlingstatus")) }.message - ) + @Test + fun `Evaluerer versjon ut i fra felter`() { + assertEquals(Versjon.of("0.0.1"), Versjon.of(initielleFelter)) + assertEquals(Versjon.of("0.1.0"), Versjon.of(initielleFelter + "eksempelverdi_1" + "eksempelverdi_2")) + assertEquals(Versjon.of("1.0.0"), Versjon.of(initielleFelter + "eksempelverdi_1")) + assertEquals(Versjon.of("2.0.0"), Versjon.of(initielleFelter + "eksempelverdi_3")) + } - assertEquals( - "Ettersom feltene [noeNytt] er lagt til burde versjon bumpes fra 0.0.1 til 0.1.0", - assertThrows { førsteVersjon.valider(førsteVersjonFelter + "noeNytt") }.message - ) + @Test + fun `Feiler om versjon for felter ikke er definert`() { + val initielleFelter = setOf("aktørId", "mottattTid", "registrertTid", "behandlingstatus", "behandlingtype", "behandlingskilde", "behandlingsmetode", "relatertBehandlingId", "behandlingsresultat") + assertThrows { Versjon.of(initielleFelter - "aktørId") } + assertThrows { Versjon.of(initielleFelter + "finnesIkke") } + assertThrows { Versjon.of(initielleFelter + "finnesIkke" - "aktørId") } } + + private val initielleFelter = setOf("aktørId", "mottattTid", "registrertTid", "behandlingstatus", "behandlingtype", "behandlingskilde", "behandlingsmetode", "relatertBehandlingId", "behandlingsresultat") } \ No newline at end of file