Skip to content

Commit

Permalink
Legger på @Final på pakker som bare har ett behov
Browse files Browse the repository at this point in the history
  • Loading branch information
geiralund committed Apr 17, 2024
1 parent 38b44b1 commit c87e8b1
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 27 deletions.
53 changes: 32 additions & 21 deletions mediator/src/main/kotlin/no/nav/dagpenger/mottak/BehovMediator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ class BehovMediator(
private val rapidsConnection: RapidsConnection,
private val sikkerLogg: KLogger,
) {
private companion object {
val logger = KotlinLogging.logger { }
}

internal fun håndter(hendelse: Hendelse) {
hendelse.kontekster().forEach { if (!it.hasErrors()) håndter(hendelse, it.behov()) }
}
Expand All @@ -19,27 +23,34 @@ class BehovMediator(
hendelse: Hendelse,
behov: List<Aktivitetslogg.Aktivitet.Behov>,
) {
behov.groupBy { it.kontekst() }.forEach { (kontekst, behov) ->
val behovsliste = mutableListOf<String>()

mutableMapOf<String, Any>().apply {
putAll(kontekst)
behov.forEach { behov ->
require(behov.type.name !in behovsliste) { "Kan ikke produsere samme behov ${behov.type.name} på samme kontekst" }
require(
behov.detaljer().filterKeys { this.containsKey(it) && this[it] != behov.detaljer()[it] }
.isEmpty(),
) { "Kan ikke produsere behov med duplikate detaljer" }
behovsliste.add(behov.type.name)
putAll(behov.detaljer())
}
behov
.groupBy { it.kontekst() }
.onEach { (_, behovMap) ->
require(
behovMap.size ==
behovMap.map { it.type.name }
.toSet().size,
) { "Kan ikke produsere samme behov på samme kontekst" }
}
.forEach { (kontekst, behov) ->
val behovMap: Map<String, Map<String, Any>> =
behov.associate { enkeltBehov -> enkeltBehov.type.name to enkeltBehov.detaljer() }
val behovParametere =
behovMap.values.fold<Map<String, Any>, Map<String, Any>>(emptyMap()) { acc, map -> acc + map }
val final = erFinal(behovMap.size)
(kontekst + behovMap + behovParametere).let { JsonMessage.newNeed(behovMap.keys, it + final) }
.also { message ->
sikkerLogg.info("sender behov for {}:\n{}", behovMap.keys, message.toJson())
rapidsConnection.publish(hendelse.journalpostId(), message.toJson())
logger.info("Sender behov for {}", behovMap.keys)
}
}
.let { JsonMessage.newNeed(behovsliste, it) }
.also { message ->
sikkerLogg.info { "Sender behov for ${hendelse.journalpostId()} ${message.toJson()}" }
rapidsConnection.publish(hendelse.journalpostId(), message.toJson())
logg.info { "Sender behov ${behovsliste.joinToString { it }}" }
}
}
}

private fun erFinal(antallBehov: Int) =
if (antallBehov == 1) {
mapOf("@final" to true)
} else {
emptyMap()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,24 @@ internal class BehovMediatorTest {
}
}

@Test
fun `Legger på @final på pakker som bare har ett behov`() {
val hendelse = TestHendelse("Hendelse1", aktivitetslogg.barn())
hendelse.kontekst(innsending)

hendelse.behov(
Aktivitetslogg.Aktivitet.Behov.Behovtype.Persondata,
"Trenger personopplysninger",
mapOf(
"aktørId" to "12344",
),
)
behovMediator.håndter(hendelse)
testRapid.inspektør.message(0).also {
assertEquals(true, it["@final"].asBoolean())
}
}

@Test
internal fun `sjekker etter duplikatverdier`() {
val hendelse = TestHendelse("Hendelse1", aktivitetslogg.barn())
Expand Down Expand Up @@ -102,12 +120,6 @@ internal class BehovMediatorTest {
assertThrows<IllegalArgumentException> { behovMediator.håndter(hendelse) }
}

private class Testkontekst(
private val melding: String,
) : Aktivitetskontekst {
override fun toSpesifikkKontekst() = SpesifikkKontekst(melding, mapOf(melding to melding))
}

private class TestHendelse(
private val melding: String,
internal val logg: Aktivitetslogg,
Expand Down

0 comments on commit c87e8b1

Please sign in to comment.