Skip to content

Commit

Permalink
Ei sprø finte med å generere versjon fra feltene 🪅
Browse files Browse the repository at this point in the history
  • Loading branch information
fraadsbrandth committed Feb 8, 2024
1 parent b51d74a commit ba31e1c
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Versjon> {
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<String>) {
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<String>, felter: Set<String>): Pair<Set<String>, 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<String>, forrigeVersjon: Versjon -> nesteVersjon(forrigeVersjon, forrigeFelter, forrigeFelter + "eksempelverdi_1" + "eksempelverdi_2") },
{ forrigeFelter: Set<String>, forrigeVersjon: Versjon -> nesteVersjon(forrigeVersjon, forrigeFelter, forrigeFelter - "eksempelverdi_2") },
{ forrigeFelter: Set<String>, 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<String>) = 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<String>, forrigeVersjon: Versjon -> nesteVersjon(forrigeVersjon, forrigeFelter, forrigeFelter${nyeFelter.eksempelverdi('+')}${fjernedeFelter.eksempelverdi('-')} )}
""".trimIndent())
}
private fun Set<String>.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(".")
Expand All @@ -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")
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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" }
Expand All @@ -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()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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<IllegalStateException> { 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<IllegalStateException> { 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<IllegalStateException> { 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<IllegalStateException> { Versjon.of(initielleFelter - "aktørId") }
assertThrows<IllegalStateException> { Versjon.of(initielleFelter + "finnesIkke") }
assertThrows<IllegalStateException> { Versjon.of(initielleFelter + "finnesIkke" - "aktørId") }
}

private val initielleFelter = setOf("aktørId", "mottattTid", "registrertTid", "behandlingstatus", "behandlingtype", "behandlingskilde", "behandlingsmetode", "relatertBehandlingId", "behandlingsresultat")
}

0 comments on commit ba31e1c

Please sign in to comment.