Skip to content

Commit

Permalink
Gjør henting av sak og oppgave uavhengige av hverandre (#382)
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga authored Dec 14, 2023
1 parent 90223fb commit 2b2e5f5
Show file tree
Hide file tree
Showing 7 changed files with 123 additions and 119 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,23 +43,23 @@ class ForespoerselRepository(private val db: Database) {
}
}

fun hentOppgaveId(forespoerselId: String): String? {
fun hentOppgaveId(forespoerselId: UUID): String? {
val requestTimer = requestLatency.labels("hentOppgaveId").startTimer()
return transaction(db) {
ForespoerselEntitet.let {
it.select { (it.forespoerselId eq forespoerselId) }
ForespoerselEntitet.select {
ForespoerselEntitet.forespoerselId eq forespoerselId.toString()
}
.firstOrNull(ForespoerselEntitet.oppgaveId)
}.also {
requestTimer.observeDuration()
}
}

fun hentSakId(forespoerselId: String): String? {
fun hentSakId(forespoerselId: UUID): String? {
val requestTimer = requestLatency.labels("hentSakId").startTimer()
return transaction(db) {
ForespoerselEntitet.let {
it.select { (it.forespoerselId eq forespoerselId) }
ForespoerselEntitet.select {
ForespoerselEntitet.forespoerselId eq forespoerselId.toString()
}
.firstOrNull(ForespoerselEntitet.sakId)
}.also {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,17 @@ import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.json.toJson
import no.nav.helsearbeidsgiver.felles.json.toMap
import no.nav.helsearbeidsgiver.felles.rapidsrivers.Loeser
import no.nav.helsearbeidsgiver.felles.rapidsrivers.demandValues
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Behov
import no.nav.helsearbeidsgiver.felles.rapidsrivers.publish
import no.nav.helsearbeidsgiver.felles.rapidsrivers.requireKeys
import no.nav.helsearbeidsgiver.felles.utils.Log
import no.nav.helsearbeidsgiver.inntektsmelding.db.ForespoerselRepository
import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.parseJson
import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.log.MdcUtils
import no.nav.helsearbeidsgiver.utils.log.logger
Expand Down Expand Up @@ -60,50 +64,65 @@ class NotifikasjonHentIdLoeser(
private fun loesBehov(behov: Behov) {
logger.info("Mottok melding med behov '${BehovType.NOTIFIKASJON_HENT_ID}'.")

MdcUtils.withLogFields(
Log.forespoerselId(UUID.fromString(behov.forespoerselId))
) {
hentNotifikasjonId(
behov
)
val json = behov.jsonMessage.toJson().parseJson()

val transaksjonId = json.toMap()[Key.UUID]?.fromJson(UuidSerializer)
val forespoerselId = behov.forespoerselId?.let(UUID::fromString)

if (transaksjonId != null && forespoerselId != null) {
MdcUtils.withLogFields(
Log.transaksjonId(transaksjonId),
Log.forespoerselId(forespoerselId)
) {
hentNotifikasjonId(transaksjonId, forespoerselId)
}
} else {
"Mangler transaksjonId og/eller forespoerselId.".also {
logger.error(it)
sikkerLogger.error(it)
}
}
}

private fun hentNotifikasjonId(behov: Behov) {
val sakId = forespoerselRepo.hentSakId(behov.forespoerselId!!)
private fun hentNotifikasjonId(transaksjonId: UUID, forespoerselId: UUID) {
val sakId = forespoerselRepo.hentSakId(forespoerselId)
"Fant sakId '$sakId'.".also {
logger.info(it)
sikkerLogger.info(it)
}

val oppgaveId = forespoerselRepo.hentOppgaveId(behov.forespoerselId!!)
val oppgaveId = forespoerselRepo.hentOppgaveId(forespoerselId)
"Fant oppgaveId '$oppgaveId'.".also {
logger.info(it)
sikkerLogger.info(it)
}

if (sakId != null && oppgaveId != null) {
if (sakId != null) {
rapid.publish(
Key.EVENT_NAME to EventName.FORESPOERSEL_BESVART.toJson(),
Key.SAK_ID to sakId.toJson(),
Key.OPPGAVE_ID to oppgaveId.toJson(),
Key.FORESPOERSEL_ID to behov.forespoerselId!!.toJson(),
Key.UUID to behov[Key.UUID].asText().toJson()
Key.UUID to transaksjonId.toJson(),
Key.FORESPOERSEL_ID to forespoerselId.toJson(),
Key.SAK_ID to sakId.toJson()
)
} else if (oppgaveId != null) {
logger.warn("Fant ikke sakId, ferdigstiller kun oppgave for ${behov.forespoerselId}!")
} else {
"Fant ikke sakId.".also {
logger.error(it)
sikkerLogger.error(it)
}
}

if (oppgaveId != null) {
rapid.publish(
Key.EVENT_NAME to EventName.FORESPOERSEL_BESVART.toJson(),
Key.OPPGAVE_ID to oppgaveId.toJson(),
Key.FORESPOERSEL_ID to behov.forespoerselId!!.toJson(),
Key.UUID to behov[Key.UUID].asText().toJson()
Key.UUID to transaksjonId.toJson(),
Key.FORESPOERSEL_ID to forespoerselId.toJson(),
Key.OPPGAVE_ID to oppgaveId.toJson()
)
} else {
"Klarte ikke hente notifikasjons-ID-er. Begge er 'null'.".also {
"Fant ikke oppgaveId.".also {
logger.error(it)
sikkerLogger.error(it)
}
// publishBehov(behov)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,18 @@ import io.mockk.every
import io.mockk.mockk
import io.mockk.verifySequence
import kotlinx.serialization.UseSerializers
import kotlinx.serialization.builtins.serializer
import no.nav.helse.rapids_rivers.testsupport.TestRapid
import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.json.lesOrNull
import no.nav.helsearbeidsgiver.felles.json.toJson
import no.nav.helsearbeidsgiver.felles.json.toMap
import no.nav.helsearbeidsgiver.felles.rapidsrivers.interestedIn
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Behov
import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.firstMessage
import no.nav.helsearbeidsgiver.felles.test.rapidsrivers.sendJson
import no.nav.helsearbeidsgiver.inntektsmelding.db.ForespoerselRepository
import no.nav.helsearbeidsgiver.utils.json.parseJson
import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer
import no.nav.helsearbeidsgiver.utils.json.toJson
import java.util.UUID
Expand All @@ -38,38 +38,44 @@ class NotifikasjonHentIdLoeserTest : FunSpec({
}

test("Ved behov om å hente notifikasjon-ID-er publiseres ID-ene på samme event") {
val expected = Behov.create(
EventName.FORESPOERSEL_BESVART,
BehovType.NOTIFIKASJON_HENT_ID,
UUID.randomUUID().toString(),
mapOf(
Key.UUID to UUID.randomUUID(),
Key.OPPGAVE_ID to "syngende-hemul",
Key.SAK_ID to "skuffet-apokalypse"
)
) {
it.interestedIn(Key.OPPGAVE_ID, Key.SAK_ID, Key.UUID)
}
val expectedTransaksjonId: UUID = UUID.randomUUID()
val expectedForespoerselId: UUID = UUID.randomUUID()
val expectedOppgaveId = "syngende-hemul"
val expectedSakId = "skuffet-apokalypse"

every { mockForespoerselRepo.hentSakId(any()) } returns expected[Key.SAK_ID].asText()
every { mockForespoerselRepo.hentOppgaveId(any()) } returns expected[Key.OPPGAVE_ID].asText()
every { mockForespoerselRepo.hentSakId(any()) } returns expectedSakId
every { mockForespoerselRepo.hentOppgaveId(any()) } returns expectedOppgaveId

testRapid.sendJson(
Key.EVENT_NAME to EventName.FORESPOERSEL_BESVART.toJson(),
Key.BEHOV to BehovType.NOTIFIKASJON_HENT_ID.toJson(),
Key.FORESPOERSEL_ID to expected.forespoerselId!!.toJson(),
Key.UUID to expected[Key.UUID].asText().toJson()
Key.UUID to expectedTransaksjonId.toJson(),
Key.FORESPOERSEL_ID to expectedForespoerselId.toJson()
)

testRapid.inspektør.size shouldBeExactly 1
testRapid.inspektør.size shouldBeExactly 2

val actual = testRapid.firstMessage().toMap()
testRapid.firstMessage().toMap().also { sakMelding ->
Key.EVENT_NAME.lesOrNull(EventName.serializer(), sakMelding) shouldBe EventName.FORESPOERSEL_BESVART
Key.UUID.lesOrNull(UuidSerializer, sakMelding) shouldBe expectedTransaksjonId
Key.FORESPOERSEL_ID.lesOrNull(UuidSerializer, sakMelding) shouldBe expectedForespoerselId
Key.SAK_ID.lesOrNull(String.serializer(), sakMelding) shouldBe expectedSakId
}

Key.FORESPOERSEL_ID.lesOrNull(UuidSerializer, actual)?.toString() shouldBe expected.forespoerselId
testRapid.inspektør.message(1)
.toString()
.parseJson()
.toMap()
.also { oppgaveMelding ->
Key.EVENT_NAME.lesOrNull(EventName.serializer(), oppgaveMelding) shouldBe EventName.FORESPOERSEL_BESVART
Key.UUID.lesOrNull(UuidSerializer, oppgaveMelding) shouldBe expectedTransaksjonId
Key.FORESPOERSEL_ID.lesOrNull(UuidSerializer, oppgaveMelding) shouldBe expectedForespoerselId
Key.OPPGAVE_ID.lesOrNull(String.serializer(), oppgaveMelding) shouldBe expectedOppgaveId
}

verifySequence {
mockForespoerselRepo.hentSakId(any())
mockForespoerselRepo.hentOppgaveId(any())
mockForespoerselRepo.hentSakId(expectedForespoerselId)
mockForespoerselRepo.hentOppgaveId(expectedForespoerselId)
}
}
})
Original file line number Diff line number Diff line change
Expand Up @@ -40,29 +40,6 @@ class Behov(
it.interestedIn(Key.UUID.str)
it.interestedIn(Key.FORESPOERSEL_ID.str)
}

fun create(
event: EventName,
behov: BehovType,
forespoerselId: String,
map: Map<Key, Any> = emptyMap(),
packetValidation: River.PacketValidation = River.PacketValidation { }
): Behov {
return Behov(
event = event,
behov = behov,
forespoerselId = forespoerselId,
jsonMessage = JsonMessage.newMessage(
event.name,
mapOf(
Key.BEHOV.str to behov.name,
Key.FORESPOERSEL_ID.str to forespoerselId
) + map.mapKeys { it.key.str }
)
).also {
packetValidation.validate(it.jsonMessage)
}
}
}

operator fun get(key: Key): JsonNode = jsonMessage[key.str]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@ import io.kotest.matchers.maps.shouldNotContainKey
import io.kotest.matchers.shouldBe
import io.mockk.every
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonElement
import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.json.les
import no.nav.helsearbeidsgiver.felles.json.toJson
import no.nav.helsearbeidsgiver.felles.json.toMap
import no.nav.helsearbeidsgiver.felles.rapidsrivers.pritopic.Pri
import no.nav.helsearbeidsgiver.felles.utils.randomUuid
import no.nav.helsearbeidsgiver.inntektsmelding.integrasjonstest.utils.EndToEndTest
Expand Down Expand Up @@ -84,28 +82,32 @@ class ForespoerselBesvartIT : EndToEndTest() {
Key.FORESPOERSEL_ID.les(UuidSerializer, it) shouldBe Mock.forespoerselId
Key.UUID.les(UuidSerializer, it) shouldBe Mock.transaksjonId
}

messages.filter(EventName.FORESPOERSEL_BESVART)
.all()
.map(JsonElement::toMap)
.first {
it.containsKey(Key.SAK_ID) &&
it.containsKey(Key.OPPGAVE_ID)
}
.filter(Key.SAK_ID, utenDataKey = true)
.firstAsMap()
.also {
it shouldNotContainKey Key.BEHOV
Key.EVENT_NAME.les(EventName.serializer(), it) shouldBe EventName.FORESPOERSEL_BESVART
Key.FORESPOERSEL_ID.les(UuidSerializer, it) shouldBe Mock.forespoerselId
Key.UUID.les(UuidSerializer, it) shouldBe Mock.transaksjonId
Key.SAK_ID.les(String.serializer(), it) shouldBe Mock.SAK_ID
}

messages.filter(EventName.FORESPOERSEL_BESVART)
.filter(Key.OPPGAVE_ID, utenDataKey = true)
.firstAsMap()
.also {
it shouldNotContainKey Key.BEHOV
Key.EVENT_NAME.les(EventName.serializer(), it) shouldBe EventName.FORESPOERSEL_BESVART
Key.FORESPOERSEL_ID.les(UuidSerializer, it) shouldBe Mock.forespoerselId
Key.UUID.les(UuidSerializer, it) shouldBe Mock.transaksjonId
Key.OPPGAVE_ID.les(String.serializer(), it) shouldBe Mock.OPPGAVE_ID
}

messages.filter(EventName.SAK_FERDIGSTILT)
.all()
.map(JsonElement::toMap)
.first {
it.containsKey(Key.SAK_ID)
}
.filter(Key.SAK_ID, utenDataKey = true)
.firstAsMap()
.also {
Key.EVENT_NAME.les(EventName.serializer(), it) shouldBe EventName.SAK_FERDIGSTILT
Key.FORESPOERSEL_ID.les(UuidSerializer, it) shouldBe Mock.forespoerselId
Expand All @@ -114,11 +116,8 @@ class ForespoerselBesvartIT : EndToEndTest() {
}

messages.filter(EventName.OPPGAVE_FERDIGSTILT)
.all()
.map(JsonElement::toMap)
.first {
it.containsKey(Key.OPPGAVE_ID)
}
.filter(Key.OPPGAVE_ID, utenDataKey = true)
.firstAsMap()
.also {
Key.EVENT_NAME.les(EventName.serializer(), it) shouldBe EventName.OPPGAVE_FERDIGSTILT
Key.FORESPOERSEL_ID.les(UuidSerializer, it) shouldBe Mock.forespoerselId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,11 +188,17 @@ class InnsendingIT : EndToEndTest() {

messages.filter(EventName.FORESPOERSEL_BESVART)
.filter(Key.SAK_ID, utenDataKey = true)
.filter(Key.OPPGAVE_ID, utenDataKey = true)
.firstAsMap()
.also {
Key.FORESPOERSEL_ID.les(UuidSerializer, it) shouldBe Mock.forespoerselId
Key.SAK_ID.les(String.serializer(), it) shouldBe Mock.SAK_ID
}

messages.filter(EventName.FORESPOERSEL_BESVART)
.filter(Key.OPPGAVE_ID, utenDataKey = true)
.firstAsMap()
.also {
Key.FORESPOERSEL_ID.les(UuidSerializer, it) shouldBe Mock.forespoerselId
Key.OPPGAVE_ID.les(String.serializer(), it) shouldBe Mock.OPPGAVE_ID
}

Expand Down
Loading

0 comments on commit 2b2e5f5

Please sign in to comment.