Skip to content

Commit

Permalink
♻️ Fjerner global state commandContext i Kommandofabrikk
Browse files Browse the repository at this point in the history
Funksjonen lagKommandostarter ble litt vel komplisert, forhåpentligvis
kan den forenkles eller fjernes en gang i fremtiden
  • Loading branch information
havstein committed Aug 23, 2024
1 parent d715310 commit 4ab59b1
Show file tree
Hide file tree
Showing 25 changed files with 127 additions and 174 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ import no.nav.helse.modell.overstyring.OverstyringDao
import no.nav.helse.modell.overstyring.OverstyringIgangsatt
import no.nav.helse.modell.person.EndretEgenAnsattStatus
import no.nav.helse.modell.person.EndretEgenAnsattStatusCommand
import no.nav.helse.modell.person.OppdaterPersonsnapshot
import no.nav.helse.modell.person.OppdaterPersonsnapshotCommand
import no.nav.helse.modell.person.Person
import no.nav.helse.modell.person.PersonDao
Expand Down Expand Up @@ -69,6 +68,8 @@ import org.slf4j.LoggerFactory
import java.util.UUID
import javax.sql.DataSource

internal typealias Kommandostarter = Personmelding.(Kommandofabrikk.() -> Command?) -> Unit

internal class Kommandofabrikk(
dataSource: DataSource,
private val meldingDao: MeldingDao = MeldingDao(dataSource),
Expand Down Expand Up @@ -114,7 +115,6 @@ internal class Kommandofabrikk(
private val avviksvurderingDao = AvviksvurderingDao(dataSource)
private val metrikkDao = MetrikkDao(dataSource)
private val oppgaveService: OppgaveService by lazy { oppgaveService() }
private var commandContext: CommandContext? = null
private val observers: MutableList<CommandContextObserver> = mutableListOf()

internal fun nyObserver(vararg observers: CommandContextObserver) {
Expand All @@ -125,27 +125,11 @@ internal class Kommandofabrikk(
this.observers.removeAll(observers.toSet())
}

internal fun settEksisterendeContext(commandContext: CommandContext) {
if (this.commandContext != null) {
logg.info(
"""
Å nei, commandContext HAR allerede en verdi! Det skyldes sannsynligvis at samme pod behandler to kall eller meldinger samtidig, eller at noe ikke har ryddet opp etter seg. Vi jobber forhåpentligvis med problemet.
Forrige commandContext: ${this.commandContext?.id()}, ny: ${commandContext.id()}
""".trimIndent(),
)
}
this.commandContext = commandContext
}

internal fun nullstilleEksisterendeContext() {
this.commandContext = null
}

internal fun avviksvurdering(avviksvurdering: AvviksvurderingDto) {
avviksvurderingDao.lagre(avviksvurdering)
}

private fun endretEgenAnsattStatus(melding: EndretEgenAnsattStatus): EndretEgenAnsattStatusCommand =
internal fun endretEgenAnsattStatus(melding: EndretEgenAnsattStatus): EndretEgenAnsattStatusCommand =
EndretEgenAnsattStatusCommand(
fødselsnummer = melding.fødselsnummer(),
erEgenAnsatt = melding.erEgenAnsatt,
Expand All @@ -154,7 +138,7 @@ internal class Kommandofabrikk(
oppgaveService = oppgaveService,
)

private fun gosysOppgaveEndret(
internal fun gosysOppgaveEndret(
melding: GosysOppgaveEndret,
person: Person,
oppgaveDataForAutomatisering: OppgaveDataForAutomatisering,
Expand Down Expand Up @@ -184,7 +168,7 @@ internal class Kommandofabrikk(
)
}

private fun tilbakedateringGodkjent(
internal fun tilbakedateringGodkjent(
melding: TilbakedateringBehandlet,
person: Person,
oppgaveDataForAutomatisering: OppgaveDataForAutomatisering,
Expand All @@ -211,7 +195,7 @@ internal class Kommandofabrikk(
)
}

private fun finnOppgavedata(fødselsnummer: String): OppgaveDataForAutomatisering? {
internal fun finnOppgavedata(fødselsnummer: String): OppgaveDataForAutomatisering? {
return oppgaveDao.finnOppgaveId(fødselsnummer)?.let { oppgaveId ->
sikkerlogg.info("Fant en oppgave for {}: {}", fødselsnummer, oppgaveId)
val oppgaveDataForAutomatisering = oppgaveDao.oppgaveDataForAutomatisering(oppgaveId)
Expand All @@ -231,7 +215,7 @@ internal class Kommandofabrikk(
}
}

private fun vedtaksperiodeReberegnet(hendelse: VedtaksperiodeReberegnet): VedtaksperiodeReberegnetCommand =
internal fun vedtaksperiodeReberegnet(hendelse: VedtaksperiodeReberegnet): VedtaksperiodeReberegnetCommand =
VedtaksperiodeReberegnetCommand(
fødselsnummer = hendelse.fødselsnummer(),
vedtaksperiodeId = hendelse.vedtaksperiodeId(),
Expand All @@ -245,7 +229,7 @@ internal class Kommandofabrikk(
totrinnsvurderingMediator = totrinnsvurderingMediator,
)

private fun vedtaksperiodeNyUtbetaling(hendelse: VedtaksperiodeNyUtbetaling): VedtaksperiodeNyUtbetalingCommand =
internal fun vedtaksperiodeNyUtbetaling(hendelse: VedtaksperiodeNyUtbetaling): VedtaksperiodeNyUtbetalingCommand =
VedtaksperiodeNyUtbetalingCommand(
vedtaksperiodeId = hendelse.vedtaksperiodeId(),
utbetalingId = hendelse.utbetalingId,
Expand All @@ -261,10 +245,10 @@ internal class Kommandofabrikk(
arbeidsgiverDao = arbeidsgiverDao,
)

private fun adressebeskyttelseEndret(melding: AdressebeskyttelseEndret): AdressebeskyttelseEndretCommand =
internal fun adressebeskyttelseEndret(melding: AdressebeskyttelseEndret): AdressebeskyttelseEndretCommand =
AdressebeskyttelseEndretCommand(melding.fødselsnummer(), personDao, oppgaveDao, godkjenningMediator)

private fun oppdaterPersonsnapshot(hendelse: Personmelding): OppdaterPersonsnapshotCommand =
internal fun oppdaterPersonsnapshot(hendelse: Personmelding): OppdaterPersonsnapshotCommand =
OppdaterPersonsnapshotCommand(
fødselsnummer = hendelse.fødselsnummer(),
førsteKjenteDagFinner = { generasjonRepository.førsteKjenteDag(hendelse.fødselsnummer()) },
Expand All @@ -274,22 +258,22 @@ internal class Kommandofabrikk(
snapshotClient = snapshotClient,
)

private fun overstyringIgangsatt(melding: OverstyringIgangsatt): OverstyringIgangsattCommand =
internal fun overstyringIgangsatt(melding: OverstyringIgangsatt): OverstyringIgangsattCommand =
OverstyringIgangsattCommand(
berørteVedtaksperiodeIder = melding.berørteVedtaksperiodeIder,
kilde = melding.kilde,
overstyringDao = overstyringDao,
)

private fun utbetalingAnnullert(hendelse: UtbetalingAnnullert): UtbetalingAnnullertCommand =
internal fun utbetalingAnnullert(hendelse: UtbetalingAnnullert): UtbetalingAnnullertCommand =
UtbetalingAnnullertCommand(
fødselsnummer = hendelse.fødselsnummer(),
personDao = personDao,
snapshotDao = snapshotDao,
snapshotClient = snapshotClient,
)

private fun utbetalingEndret(hendelse: UtbetalingEndret): UtbetalingEndretCommand =
internal fun utbetalingEndret(hendelse: UtbetalingEndret): UtbetalingEndretCommand =
UtbetalingEndretCommand(
fødselsnummer = hendelse.fødselsnummer(),
organisasjonsnummer = hendelse.organisasjonsnummer,
Expand All @@ -311,7 +295,7 @@ internal class Kommandofabrikk(
json = hendelse.toJson(),
)

private fun vedtaksperiodeForkastet(hendelse: VedtaksperiodeForkastet): VedtaksperiodeForkastetCommand =
internal fun vedtaksperiodeForkastet(hendelse: VedtaksperiodeForkastet): VedtaksperiodeForkastetCommand =
VedtaksperiodeForkastetCommand(
fødselsnummer = hendelse.fødselsnummer(),
vedtaksperiodeId = hendelse.vedtaksperiodeId(),
Expand All @@ -327,7 +311,7 @@ internal class Kommandofabrikk(
totrinnsvurderingMediator = totrinnsvurderingMediator,
)

private fun utbetalingsgodkjenning(
internal fun utbetalingsgodkjenning(
melding: Saksbehandlerløsning,
person: Person,
): UtbetalingsgodkjenningCommand {
Expand Down Expand Up @@ -360,7 +344,7 @@ internal class Kommandofabrikk(
)
}

private fun godkjenningsbehov(
internal fun godkjenningsbehov(
hendelse: Godkjenningsbehov,
person: Person,
tags: List<String>,
Expand Down Expand Up @@ -414,94 +398,33 @@ internal class Kommandofabrikk(
)
}

private fun oppdaterSnapshotCommand(personmelding: Personmelding): OppdaterSnapshotCommand =
internal fun oppdaterSnapshotCommand(personmelding: Personmelding): OppdaterSnapshotCommand =
OppdaterSnapshotCommand(snapshotClient, snapshotDao, personmelding.fødselsnummer(), personDao)

internal fun iverksettOppdaterPersonsnapshot(melding: OppdaterPersonsnapshot) {
iverksett(oppdaterPersonsnapshot(melding), melding.id)
}

internal fun iverksettOppdaterSnapshot(melding: Personmelding) {
iverksett(oppdaterSnapshotCommand(melding), melding.id)
}

internal fun iverksettVedtaksperiodeForkastet(melding: VedtaksperiodeForkastet) {
iverksett(vedtaksperiodeForkastet(melding), melding.id)
}

internal fun iverksettUtbetalingEndret(melding: UtbetalingEndret) {
iverksett(utbetalingEndret(melding), melding.id)
}

internal fun iverksettUtbetalingAnnulert(melding: UtbetalingAnnullert) {
iverksett(utbetalingAnnullert(melding), melding.id)
}

internal fun iverksettVedtaksperiodeNyUtbetaling(melding: VedtaksperiodeNyUtbetaling) {
iverksett(vedtaksperiodeNyUtbetaling(melding), melding.id)
}

internal fun iverksettGodkjenningsbehov(
melding: Godkjenningsbehov,
person: Person,
tags: List<String>,
) {
iverksett(godkjenningsbehov(melding, person, tags), melding.id)
}

internal fun iverksettOverstyringIgangsatt(melding: OverstyringIgangsatt) {
iverksett(overstyringIgangsatt(melding), melding.id)
}

internal fun iverksettVedtaksperiodeReberegnet(melding: VedtaksperiodeReberegnet) {
iverksett(vedtaksperiodeReberegnet(melding), melding.id)
}

internal fun iverksettEndretAnsattStatus(melding: EndretEgenAnsattStatus) {
iverksett(endretEgenAnsattStatus(melding), melding.id)
}

internal fun iverksettAdressebeskyttelseEndret(melding: AdressebeskyttelseEndret) {
iverksett(adressebeskyttelseEndret(melding), melding.id)
}

internal fun iverksettGosysOppgaveEndret(
melding: GosysOppgaveEndret,
person: Person,
) {
val oppgaveDataForAutomatisering = finnOppgavedata(melding.fødselsnummer()) ?: return
iverksett(gosysOppgaveEndret(melding, person, oppgaveDataForAutomatisering), melding.id)
}

internal fun iverksettTilbakedateringBehandlet(
melding: TilbakedateringBehandlet,
person: Person,
) {
val oppgaveDataForAutomatisering = finnOppgavedata(melding.fødselsnummer()) ?: return
iverksett(tilbakedateringGodkjent(melding, person, oppgaveDataForAutomatisering), melding.id)
}

internal fun iverksettSaksbehandlerløsning(
melding: Saksbehandlerløsning,
person: Person,
) {
iverksett(utbetalingsgodkjenning(melding, person), melding.id)
}

// Kanskje prøve å få håndtering av søknad inn i samme flyt som andre kommandokjeder
internal fun iverksettSøknadSendt(melding: SøknadSendt) {
iverksett(søknadSendt(melding), melding.id)
iverksett(søknadSendt(melding), melding.id, nyContext(melding.id))
}

private fun nyContext(meldingId: UUID) =
CommandContext(UUID.randomUUID()).apply {
opprett(commandContextDao, meldingId)
}

internal fun lagKommandostarter(commandContext: CommandContext): Kommandostarter {
return { kommandooppretter ->
val melding = this
this@Kommandofabrikk.kommandooppretter()?.let { command ->
iverksett(command, melding.id, commandContext)
}
}
}

private fun iverksett(
command: Command,
meldingId: UUID,
commandContext: CommandContext,
) {
val commandContext = this.commandContext ?: nyContext(meldingId)
observers.forEach { commandContext.nyObserver(it) }
val contextId = commandContext.id()
withMDC(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -413,15 +413,29 @@ internal class MeldingMediator(
) {
logg.info("Melding $meldingnavn gjenopptatt")
sikkerlogg.info("Melding $meldingnavn gjenopptatt:\n${melding.toJson()}")
kommandofabrikk.settEksisterendeContext(commandContext)
behandleMelding(melding, messageContext)
kommandofabrikk.nullstilleEksisterendeContext()
behandleMelding(melding, messageContext, commandContext)
}
}

private fun nyContext(meldingId: UUID) =
CommandContext(UUID.randomUUID()).apply {
opprett(commandContextDao, meldingId)
}

// Denne kalles når vi behandler en melding som starter en kommandokjede, eller den er i hvert fall ikke inne i
// bildet når vi gjenopptar kommandokjeder
private fun behandleMelding(
melding: Personmelding,
messageContext: MessageContext,
) {
behandleMelding(melding, messageContext, nyContext(melding.id))
}

// Denne kalles både ved oppstart av en kommandokjede og ved gjenopptak etter svar på behov
private fun behandleMelding(
melding: Personmelding,
messageContext: MessageContext,
commandContext: CommandContext,
) {
val meldingnavn = requireNotNull(melding::class.simpleName)
val utgåendeMeldingerMediator = UtgåendeMeldingerMediator()
Expand All @@ -434,7 +448,7 @@ internal class MeldingMediator(
logg.info("Personen finnes i databasen, behandler melding $meldingnavn")
sikkerlogg.info("Personen finnes i databasen, behandler melding $meldingnavn")

melding.behandle(this, kommandofabrikk)
melding.behandle(this, kommandofabrikk.lagKommandostarter(commandContext))
}
if (melding is VedtakFattet) melding.doFinally(vedtakDao) // Midlertidig frem til spesialsak ikke er en ting lenger
vedtakFattetMelder.publiserUtgåendeMeldinger()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package no.nav.helse.mediator.meldinger

import com.fasterxml.jackson.databind.JsonNode
import no.nav.helse.mediator.GodkjenningMediator
import no.nav.helse.mediator.Kommandofabrikk
import no.nav.helse.mediator.Kommandostarter
import no.nav.helse.mediator.asUUID
import no.nav.helse.mediator.oppgave.OppgaveDao
import no.nav.helse.modell.kommando.AvvisVedStrengtFortroligAdressebeskyttelseCommand
Expand Down Expand Up @@ -37,9 +37,9 @@ internal class AdressebeskyttelseEndret private constructor(

override fun behandle(
person: Person,
kommandofabrikk: Kommandofabrikk,
kommandostarter: Kommandostarter,
) {
kommandofabrikk.iverksettAdressebeskyttelseEndret(this)
kommandostarter { adressebeskyttelseEndret(this@AdressebeskyttelseEndret) }
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package no.nav.helse.mediator.meldinger

import no.nav.helse.mediator.Kommandofabrikk
import no.nav.helse.mediator.Kommandostarter
import no.nav.helse.modell.person.Person
import java.util.UUID

Expand All @@ -13,8 +13,9 @@ internal interface Melding {
internal interface Personmelding : Melding {
fun behandle(
person: Person,
kommandofabrikk: Kommandofabrikk,
kommandostarter: Kommandostarter,
)

fun fødselsnummer(): String
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package no.nav.helse.mediator.meldinger.hendelser
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.treeToValue
import no.nav.helse.db.AvviksvurderingDao
import no.nav.helse.mediator.Kommandofabrikk
import no.nav.helse.mediator.Kommandostarter
import no.nav.helse.mediator.asUUID
import no.nav.helse.mediator.meldinger.Vedtaksperiodemelding
import no.nav.helse.modell.person.Person
Expand Down Expand Up @@ -45,7 +45,7 @@ internal class AvsluttetMedVedtakMessage(

override fun behandle(
person: Person,
kommandofabrikk: Kommandofabrikk,
kommandostarter: Kommandostarter,
) {
person.fattVedtak(avsluttetMedVedtak)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package no.nav.helse.mediator.meldinger.hendelser

import com.fasterxml.jackson.databind.JsonNode
import no.nav.helse.mediator.Kommandofabrikk
import no.nav.helse.mediator.Kommandostarter
import no.nav.helse.mediator.asUUID
import no.nav.helse.mediator.meldinger.Vedtaksperiodemelding
import no.nav.helse.modell.person.Person
Expand Down Expand Up @@ -50,7 +50,7 @@ internal class AvsluttetUtenVedtakMessage private constructor(

override fun behandle(
person: Person,
kommandofabrikk: Kommandofabrikk,
kommandostarter: Kommandostarter,
) {
person.avsluttetUtenVedtak(avsluttetUtenVedtak)
}
Expand Down
Loading

0 comments on commit 4ab59b1

Please sign in to comment.