Skip to content

Commit

Permalink
WIP: Versjonering
Browse files Browse the repository at this point in the history
navikt/dagpenger#979

Co-authored-by: Geir Andre Lund <[email protected]>
Co-authored-by: Giao Cung <[email protected]>
Co-authored-by: Jørn Greger Nyegaard-Larsen <[email protected]>
  • Loading branch information
4 people committed Nov 25, 2021
1 parent c417222 commit f823d01
Show file tree
Hide file tree
Showing 21 changed files with 110 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ internal class ApplicationBuilder : RapidsConnection.StatusListener {
val resultatRecord = ResultatRecord()
AvslagPåMinsteinntektOppsett.registrer { søknad, versjonId -> FaktumTable(søknad, versjonId) }
AvslagPåMinsteinntektService(søknadRecord, rapidsConnection)
Dagpenger.registrer { søknad, versjonId -> FaktumTable(søknad, versjonId) }
Dagpenger.registrer { søknad, prosessVersjon -> FaktumTable(søknad) }
DagpengerService(søknadRecord, rapidsConnection)
FaktumSvarService(søknadRecord, resultatRecord, rapidsConnection)
BehandlingsdatoService(rapidsConnection)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,24 @@ import java.time.LocalDate
import java.util.UUID

// Forstår initialisering av faktum tabellen
class FaktumTable(søknad: Søknad, private val versjonId: Int) : SøknadVisitor {
class FaktumTable(søknad: Søknad) : SøknadVisitor {

private var rootId: Int = 0
private var indeks: Int = 0
private val dbIder = mutableMapOf<Faktum<*>, Int>()
private val avhengigheter = mutableMapOf<Faktum<*>, Set<Faktum<*>>>()
private var prosessVersjonId = 0

init {
if (!exists(versjonId)) søknad.accept(this)
if (!exists(prosessVersjon)) søknad.accept(this)
}

companion object {
private fun exists(versjonId: Int): Boolean {
val query = queryOf("SELECT versjon_id FROM faktum WHERE versjon_id = :versjonId", mapOf("versjonId" to versjonId))
private fun exists(prosessVersjon: ProsessVersjon): Boolean {
val query = queryOf(//language=PostgreSQL
"SELECT id FROM V1_PROSESSVERSJON WHERE navn = :navn AND versjon_id = :versjon_id",
mapOf("navn" to prosessVersjon.navn, "versjon_id" to prosessVersjon.versjon)
)
return using(sessionOf(dataSource)) { session ->
session.run(
query.map { true }.asSingle
Expand All @@ -50,6 +54,18 @@ class FaktumTable(søknad: Søknad, private val versjonId: Int) : SøknadVisitor
}
}

override fun preVisit(søknad: Søknad, prosessVersjon: ProsessVersjon, uuid: UUID) {
val query = queryOf(//language=PostgreSQL
"INSERT INTO V1_PROSESSVERSJON (navn, versjon_id) VALUES (:navn, :versjon_id) RETURNING id",
mapOf("navn" to prosessVersjon.navn, "versjon_id" to prosessVersjon.versjon)
)
prosessVersjonId = using(sessionOf(dataSource)) { session ->
session.run(
query.map { rad -> rad.int("id") }.asSingle
)?: throw IllegalStateException("Klarte ikke å opprette prosessversjon, $prosessVersjon")
}
}

override fun visit(faktumId: FaktumId, rootId: Int, indeks: Int) {
this.rootId = rootId
this.indeks = indeks
Expand Down Expand Up @@ -135,7 +151,7 @@ class FaktumTable(søknad: Søknad, private val versjonId: Int) : SøknadVisitor
"""WITH inserted_id as (INSERT INTO navn (navn) values (?) returning id)
INSERT INTO faktum (versjon_id, faktum_type, root_id, regel, navn_id ) SELECT ?, ?, ?, ?, id from inserted_id returning id""".trimMargin(),
faktum.navn,
versjonId,
prosessVersjonId,
ClassKode[clazz],
rootId,
regel?.navn
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import java.util.UUID

class NySøknad(søknad: Søknad, private val type: Versjon.UserInterfaceType) : SøknadVisitor {
private var søknadId = 0
private var versjonId = 0
private var internVersjonId = 0
private var rootId = 0
private var indeks = 0
private val faktumList = mutableListOf<Faktum<*>>()
Expand All @@ -35,14 +35,26 @@ class NySøknad(søknad: Søknad, private val type: Versjon.UserInterfaceType) :
personId = uuid
}

private fun hentInternId(prosessVersjon: ProsessVersjon): Int {
val query = queryOf(//language=PostgreSQL
"SELECT id FROM V1_PROSESSVERSJON WHERE navn = :navn AND versjon_id = :versjon_id",
mapOf("navn" to prosessVersjon.navn, "versjon_id" to prosessVersjon.versjon)
)
return using(sessionOf(dataSource)) { session ->
session.run(
query.map { it.intOrNull("id") }.asSingle
) ?: throw IllegalStateException("Fant ikke internid for prosessversjon $prosessVersjon")
}
}

override fun preVisit(søknad: Søknad, prosessVersjon: ProsessVersjon, uuid: UUID) {
this.versjonId = prosessVersjon
this.internVersjonId = hentInternId(prosessVersjon)
søknadId = using(sessionOf(dataSource)) { session ->
session.run(
queryOf(
"INSERT INTO soknad(uuid, versjon_id, person_id, sesjon_type_id) VALUES (?, ?, ?, ?) returning id",
uuid,
prosessVersjon,
internVersjonId,
personId,
type.id
).map { it.int(1) }.asSingle
Expand Down Expand Up @@ -114,7 +126,7 @@ class NySøknad(søknad: Søknad, private val type: Versjon.UserInterfaceType) :
(SELECT id FROM faktum WHERE versjon_id = ? AND root_id = ?))""".trimMargin(),
søknadId,
indeks,
versjonId,
internVersjonId,
rootId
).asExecute
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package no.nav.dagpenger.quiz.mediator.db

import no.nav.dagpenger.model.faktum.Identer
import no.nav.dagpenger.model.faktum.ProsessVersjon
import no.nav.dagpenger.model.faktum.Søknad
import no.nav.dagpenger.model.seksjon.Søknadprosess
import no.nav.dagpenger.model.seksjon.Versjon
import java.time.LocalDateTime
import java.util.UUID

interface SøknadPersistence {
fun ny(identer: Identer, type: Versjon.UserInterfaceType, versjonId: Int, uuid: UUID = UUID.randomUUID()): Søknadprosess
fun ny(identer: Identer, type: Versjon.UserInterfaceType, prosessVersjon: ProsessVersjon, uuid: UUID = UUID.randomUUID()): Søknadprosess
fun hent(uuid: UUID, type: Versjon.UserInterfaceType? = null): Søknadprosess
fun lagre(søknad: Søknad): Boolean
fun opprettede(identer: Identer): Map<LocalDateTime, UUID>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import no.nav.dagpenger.model.faktum.Identer
import no.nav.dagpenger.model.faktum.Identer.Ident
import no.nav.dagpenger.model.faktum.Inntekt
import no.nav.dagpenger.model.faktum.Inntekt.Companion.årlig
import no.nav.dagpenger.model.faktum.ProsessVersjon
import no.nav.dagpenger.model.faktum.Søknad
import no.nav.dagpenger.model.seksjon.Søknadprosess
import no.nav.dagpenger.model.seksjon.Versjon
Expand All @@ -24,15 +25,15 @@ import java.util.UUID
class SøknadRecord : SøknadPersistence {
private val personRecord = PersonRecord()

override fun ny(identer: Identer, type: Versjon.UserInterfaceType, versjonId: Int, uuid: UUID): Søknadprosess {
override fun ny(identer: Identer, type: Versjon.UserInterfaceType, prosessVersjon: ProsessVersjon, uuid: UUID): Søknadprosess {
val person = personRecord.hentEllerOpprettPerson(identer)
return Versjon.id(versjonId).søknadprosess(person, type, uuid).also { søknadprosess ->
return Versjon.id(prosessVersjon).søknadprosess(person, type, uuid).also { søknadprosess ->
NySøknad(søknadprosess.søknad, type)
}
}

override fun hent(uuid: UUID, type: Versjon.UserInterfaceType?): Søknadprosess {
data class SoknadRad(val personId: UUID, val versjonId: Int, var typeId: Int)
data class SoknadRad(val personId: UUID, val navn: String, val versjonId: Int, var typeId: Int)

val rad = using(sessionOf(dataSource)) { session ->
if (type != null) {
Expand All @@ -43,15 +44,15 @@ class SøknadRecord : SøknadPersistence {

session.run(
queryOf( //language=PostgreSQL
"SELECT person_id, versjon_id, sesjon_type_id FROM soknad WHERE uuid = ?",
"SELECT soknad.person_id, versjon.navn , versjon.versjon_id, soknad.sesjon_type_id FROM soknad JOIN V1_PROSESSVERSJON as versjon ON (versjon.id = soknad.versjon_id) WHERE uuid = ?",
uuid
).map { row ->
SoknadRad(UUID.fromString(row.string(1)), row.int(2), row.int(3))
SoknadRad(UUID.fromString(row.string(1)), row.string(2), row.int(3), row.int(4))
}.asSingle
)
} ?: throw IllegalArgumentException("Søknad finnes ikke, uuid: $uuid")

return Versjon.id(rad.versjonId)
return Versjon.id(ProsessVersjon(rad.navn, rad.versjonId))
.søknadprosess(
person = personRecord.hentPerson(rad.personId),
type = Versjon.UserInterfaceType.fromId(rad.typeId),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.dagpenger.quiz.mediator.meldinger
import mu.KotlinLogging
import no.nav.dagpenger.model.faktum.Dokument
import no.nav.dagpenger.model.faktum.Identer
import no.nav.dagpenger.model.faktum.ProsessVersjon
import no.nav.dagpenger.model.seksjon.Versjon
import no.nav.dagpenger.quiz.mediator.db.SøknadPersistence
import no.nav.dagpenger.quiz.mediator.soknad.AvslagPåMinsteinntektOppsett
Expand All @@ -19,7 +20,7 @@ import java.time.LocalDateTime
internal class AvslagPåMinsteinntektService(
private valknadPersistence: SøknadPersistence,
rapidsConnection: RapidsConnection,
private val versjonId: Int = AvslagPåMinsteinntektOppsett.VERSJON_ID
private val prosessVersjon: ProsessVersjon = AvslagPåMinsteinntektOppsett.VERSJON_ID
) : River.PacketListener {

private companion object {
Expand Down Expand Up @@ -52,7 +53,7 @@ internal class AvslagPåMinsteinntektService(
val faktagrupperType = Versjon.UserInterfaceType.Web
val journalpostId = packet["journalpostId"].asText()

søknadPersistence.ny(identer, faktagrupperType, versjonId)
søknadPersistence.ny(identer, faktagrupperType, prosessVersjon)
.also { søknadprosess ->
// Arena-fagsakId for at arena-sink skal kunne lage vedtak på riktig sak
if (!packet["fagsakId"].isMissingOrNull()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package no.nav.dagpenger.quiz.mediator.meldinger

import mu.KotlinLogging
import no.nav.dagpenger.model.faktum.Identer
import no.nav.dagpenger.model.faktum.ProsessVersjon
import no.nav.dagpenger.model.seksjon.Versjon
import no.nav.dagpenger.quiz.mediator.db.SøknadRecord
import no.nav.dagpenger.quiz.mediator.soknad.Dagpenger
Expand All @@ -14,7 +15,7 @@ import java.util.UUID
internal class DagpengerService(
private valknadPersistence: SøknadRecord,
rapidsConnection: RapidsConnection,
private val versjonId: Int = Dagpenger.VERSJON_ID
private val prosessVersjon: ProsessVersjon = Dagpenger.VERSJON_ID
) : River.PacketListener {

private companion object {
Expand Down Expand Up @@ -42,7 +43,7 @@ internal class DagpengerService(

val søknadUuid = packet["søknad_uuid"].asText().let { søknadUuid -> UUID.fromString(søknadUuid) }
val faktagrupperType = Versjon.UserInterfaceType.Web
søknadPersistence.ny(identer, faktagrupperType, versjonId, søknadUuid).also { søknadsprosess ->
søknadPersistence.ny(identer, faktagrupperType, prosessVersjon, søknadUuid).also { søknadsprosess ->
søknadPersistence.lagre(søknadsprosess.søknad)
log.info { "Opprettet ny søknadprosess ${søknadsprosess.søknad.uuid} på grunn av ønsket rettighetsavklaring" }
søknadsprosess.nesteSeksjoner()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import no.nav.dagpenger.quiz.mediator.soknad.Seksjoner.søknadprosess
// Forstår dagpengesøknaden
internal object AvslagPåMinsteinntektOppsett {
private val logger = KotlinLogging.logger { }
private val VERSJON_ID = ProsessVersjon("AvslagPåMinsteinntekt", 26)
val VERSJON_ID = ProsessVersjon("AvslagPåMinsteinntekt", 26)

fun registrer(registrer: (søknad: Søknad, prosessVersjon: ProsessVersjon) -> Unit) {
registrer(søknad, VERSJON_ID)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.dagpenger.quiz.mediator.soknad
import mu.KotlinLogging
import no.nav.dagpenger.model.factory.BaseFaktumFactory.Companion.boolsk
import no.nav.dagpenger.model.factory.BaseFaktumFactory.Companion.dokument
import no.nav.dagpenger.model.faktum.ProsessVersjon
import no.nav.dagpenger.model.faktum.Rolle
import no.nav.dagpenger.model.faktum.Søknad
import no.nav.dagpenger.model.regel.dokumenteresAv
Expand All @@ -20,7 +21,7 @@ internal object Dagpenger {

private val logger = KotlinLogging.logger { }

const val VERSJON_ID = 101
val VERSJON_ID = ProsessVersjon("Dagpenger", 101)

const val `Har du hatt dagpenger i løpet av de siste 52 ukene` = 1
const val `Villig til å ta hel og deltidsjobb` = 2
Expand All @@ -31,7 +32,7 @@ internal object Dagpenger {
const val `Redusert helse, fysisk eller psykisk` = 7
const val `Bekreftelse fra relevant fagpersonell` = 8

fun registrer(registrer: (søknad: Søknad, versjonId: Int) -> Unit) {
fun registrer(registrer: (søknad: Søknad) -> Unit) {
registrer(søknad, VERSJON_ID)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import no.nav.dagpenger.model.factory.BaseFaktumFactory.Companion.inntekt
import no.nav.dagpenger.model.factory.UtledetFaktumFactory.Companion.maks
import no.nav.dagpenger.model.faktum.Identer
import no.nav.dagpenger.model.faktum.Person
import no.nav.dagpenger.model.faktum.ProsessVersjon
import no.nav.dagpenger.model.faktum.Rolle
import no.nav.dagpenger.model.faktum.Søknad
import no.nav.dagpenger.model.marshalling.SubsumsjonsGraf
Expand Down Expand Up @@ -50,7 +51,7 @@ class Graftest {
val registrertArbeidssøkerPeriodeTom = 15

val prototypeSøknad = Søknad(
509,
ProsessVersjon("test", 509),
dato faktum "Datoen du fyller 67" id bursdag67,
dato faktum "Datoen du søker om dagpenger" id søknadsdato,
dato faktum "Datoen du ønsker dagpenger fra" id ønsketdato,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import no.nav.dagpenger.model.factory.BaseFaktumFactory.Companion.boolsk
import no.nav.dagpenger.model.factory.BaseFaktumFactory.Companion.dato
import no.nav.dagpenger.model.factory.UtledetFaktumFactory.Companion.maks
import no.nav.dagpenger.model.faktum.Identer
import no.nav.dagpenger.model.faktum.ProsessVersjon
import no.nav.dagpenger.model.faktum.Rolle
import no.nav.dagpenger.model.faktum.Søknad
import no.nav.dagpenger.model.regel.er
Expand Down Expand Up @@ -34,10 +35,10 @@ internal class AvhengigeFaktaTest {

@Test
fun `Avhengig faktum reset`() {
val versjonId = 634
val prosessVersjon = ProsessVersjon("test", 634)
Postgres.withMigratedDb {
val prototypeFakta = Søknad(
versjonId,
prosessVersjon,
boolsk faktum "f1" id 19 avhengerAv 2 og 13,
dato faktum "f2" id 2,
dato faktum "f3" id 13,
Expand All @@ -56,9 +57,9 @@ internal class AvhengigeFaktaTest {
)
)
).registrer()
FaktumTable(prototypeFakta, versjonId)
FaktumTable(prototypeFakta, prosessVersjon)
søknadRecord = SøknadRecord()
originalSøknadprosess = søknadRecord.ny(SøknadRecordTest.UNG_PERSON_FNR_2018, Web, versjonId)
originalSøknadprosess = søknadRecord.ny(SøknadRecordTest.UNG_PERSON_FNR_2018, Web, prosessVersjon)

originalSøknadprosess.dato(2).besvar(2.januar)
originalSøknadprosess.dato(13).besvar(13.januar)
Expand All @@ -75,10 +76,11 @@ internal class AvhengigeFaktaTest {

@Test
fun `Avhengig faktum rehydreres`() {
val versjonId = 635
val prosessVersjon = ProsessVersjon("test", 635)

Postgres.withMigratedDb {
val prototypeFakta = Søknad(
versjonId,
prosessVersjon,
boolsk faktum "f1" id 1 avhengerAv 4,
boolsk faktum "f2" id 2,
boolsk faktum "f3" id 3 avhengerAv 1,
Expand All @@ -98,10 +100,10 @@ internal class AvhengigeFaktaTest {
)
)
).registrer()
FaktumTable(prototypeFakta, versjonId)
FaktumTable(prototypeFakta, prosessVersjon)

søknadRecord = SøknadRecord()
originalSøknadprosess = søknadRecord.ny(SøknadRecordTest.UNG_PERSON_FNR_2018, Web, versjonId)
originalSøknadprosess = søknadRecord.ny(SøknadRecordTest.UNG_PERSON_FNR_2018, Web, prosessVersjon)

originalSøknadprosess.boolsk(2).besvar(true)
originalSøknadprosess.boolsk(5).besvar(true)
Expand All @@ -119,10 +121,11 @@ internal class AvhengigeFaktaTest {

@Test
fun `Avhengig av utledet faktum rehydreres`() {
val versjonId = 636
val prosessVersjon = ProsessVersjon("test", 636)

Postgres.withMigratedDb {
val prototypeFakta = Søknad(
versjonId,
prosessVersjon,
boolsk faktum "f1" id 1 avhengerAv 4,
dato faktum "f2" id 2,
dato faktum "f3" id 3,
Expand All @@ -142,10 +145,10 @@ internal class AvhengigeFaktaTest {
)
)
).registrer()
FaktumTable(prototypeFakta, versjonId)
FaktumTable(prototypeFakta, prosessVersjon)

søknadRecord = SøknadRecord()
originalSøknadprosess = søknadRecord.ny(SøknadRecordTest.UNG_PERSON_FNR_2018, Web, versjonId)
originalSøknadprosess = søknadRecord.ny(SøknadRecordTest.UNG_PERSON_FNR_2018, Web, prosessVersjon)

originalSøknadprosess.dato(2).besvar(1.januar)
originalSøknadprosess.dato(3).besvar(10.januar)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.dagpenger.quiz.mediator.db
import kotliquery.queryOf
import kotliquery.sessionOf
import kotliquery.using
import no.nav.dagpenger.model.faktum.ProsessVersjon
import no.nav.dagpenger.quiz.mediator.db.PostgresDataSourceBuilder.dataSource
import no.nav.dagpenger.quiz.mediator.helpers.Postgres
import no.nav.dagpenger.quiz.mediator.helpers.SøknadEksempel1
Expand All @@ -15,13 +16,15 @@ internal class FaktumTableTest {
}
@Test
fun `Bygg faktum tabell`() {
val prosessVersjon = ProsessVersjon("test", 1)

Postgres.withMigratedDb {
FaktumTable(SøknadEksempel1.prototypeFakta1, 1)
FaktumTable(SøknadEksempel1.prototypeFakta1, prosessVersjon)
assertRecordCount(expectedFaktumRecordCount, "faktum")
assertRecordCount(6, "utledet_faktum")
assertRecordCount(3, "template_faktum")
assertRecordCount(5, "avhengig_faktum")
FaktumTable(SøknadEksempel1.prototypeFakta1, 1)
FaktumTable(SøknadEksempel1.prototypeFakta1, prosessVersjon)
assertRecordCount(expectedFaktumRecordCount, "faktum")
}
}
Expand Down
Loading

0 comments on commit f823d01

Please sign in to comment.