Skip to content

Commit

Permalink
Merge branch 'main' into dev/fjern-ubrukte-keys
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga committed Dec 27, 2023
2 parents 337df64 + 05c24b0 commit 7d3415f
Show file tree
Hide file tree
Showing 39 changed files with 515 additions and 266 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package no.nav.helsearbeidsgiver.inntektsmelding.brospinn

import no.nav.helsearbeidsgiver.felles.json.jacksonOm
import no.nav.inntektsmeldingkontrakt.Inntektsmelding

object Jackson {
fun fromJson(json: String): Inntektsmelding =
jacksonOm.readValue(json, Inntektsmelding::class.java)

fun toJson(im: Inntektsmelding): String =
jacksonOm.writeValueAsString(im)
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ import io.ktor.http.HttpStatusCode
import io.ktor.http.contentType
import kotlinx.coroutines.runBlocking
import no.nav.helsearbeidsgiver.felles.EksternInntektsmelding
import no.nav.helsearbeidsgiver.felles.json.Jackson
import no.nav.inntektsmeldingkontrakt.Inntektsmelding

class SpinnKlient(
val url: String,
Expand All @@ -27,7 +25,7 @@ class SpinnKlient(
if (response.status != HttpStatusCode.OK) {
throw SpinnApiException("$FIKK_SVAR_MED_RESPONSE_STATUS: ${response.status.value}")
}
Jackson.fromJson<Inntektsmelding>(response.bodyAsText())
Jackson.fromJson(response.bodyAsText())
} catch (e: ClientRequestException) {
throw SpinnApiException("$FIKK_SVAR_MED_RESPONSE_STATUS: ${e.response.status.value}", e)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,16 +61,8 @@ class SpinnService(
val json = message.toJsonMap()

val transaksjonId = Key.UUID.les(UuidSerializer, json)
val forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, json)

val forespoerselId = RedisKey.of(transaksjonId, Key.FORESPOERSEL_ID)
.read()?.let(UUID::fromString)
if (forespoerselId == null) {
"Klarte ikke finne forespoerselId for transaksjon $transaksjonId i Redis.".also {
logger.error(it)
sikkerLogger.error(it)
}
return
}
val spinnImId = RedisKey.of(transaksjonId, Key.SPINN_INNTEKTSMELDING_ID)
.read()?.let(UUID::fromString)
if (spinnImId == null) {
Expand Down Expand Up @@ -106,11 +98,9 @@ class SpinnService(
override fun finalize(message: JsonMessage) {
val json = message.toJsonMap()
val transaksjonId = Key.UUID.les(UuidSerializer, json)
val forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, json)
val eksternInntektsmelding = Key.EKSTERN_INNTEKTSMELDING.lesOrNull(EksternInntektsmelding.serializer(), json)
val forespoerselId = RedisKey.of(transaksjonId, Key.FORESPOERSEL_ID)
.read()?.let(UUID::fromString)
if (
forespoerselId != null &&
eksternInntektsmelding?.avsenderSystemNavn != null &&
eksternInntektsmelding.avsenderSystemNavn != AVSENDER_NAV_NO
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,13 @@ import io.kotest.assertions.throwables.shouldThrowExactly
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import io.ktor.http.HttpStatusCode
import no.nav.helsearbeidsgiver.felles.json.Jackson
import no.nav.helsearbeidsgiver.utils.test.resource.readResource
import no.nav.inntektsmeldingkontrakt.AvsenderSystem
import no.nav.inntektsmeldingkontrakt.Inntektsmelding

class SpinnKlientTest : FunSpec({

val expectedJson = "gyldigRespons.json".readResource()
val expectedInntektsmelding = Jackson.fromJson<Inntektsmelding>(expectedJson)
val expectedInntektsmelding = Jackson.fromJson(expectedJson)

test("Hvis inntektsmelding ikke finnes kastes feil") {
val spinnKlient = mockSpinnKlient("", HttpStatusCode.NotFound)
Expand Down
7 changes: 7 additions & 0 deletions config/feil-behandler/dev-gcp.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
kafkaPool: nav-dev
azure:
enabled: true
database: im-error-recovery
envFrom:
- type: secret
name: google-sql-im-feil-behandler
7 changes: 7 additions & 0 deletions config/feil-behandler/prod-gcp.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
kafkaPool: nav-prod
azure:
enabled: true
database: im-error-recovery
envFrom:
- type: secret
name: google-sql-im-feil-behandler
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.rapidsrivers.Loeser
import no.nav.helsearbeidsgiver.felles.rapidsrivers.interestedIn
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Behov
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Event
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.publishEvent
import no.nav.helsearbeidsgiver.felles.rapidsrivers.toPretty
import no.nav.helsearbeidsgiver.felles.utils.Log
import no.nav.helsearbeidsgiver.inntektsmelding.db.InntektsmeldingRepository
Expand All @@ -35,12 +35,12 @@ class LagreEksternInntektsmeldingLoeser(
}
}
override fun onBehov(behov: Behov) {
val transaksjonsId = behov[Key.UUID].asText()
val forespoerselId = behov[Key.FORESPOERSEL_ID].asText()
val transaksjonsId = behov[Key.UUID].asText().let(UUID::fromString)
val forespoerselId = behov[Key.FORESPOERSEL_ID].asText().let(UUID::fromString)
MdcUtils.withLogFields(
Log.klasse(this),
Log.event(behov.event),
Log.transaksjonId(UUID.fromString(transaksjonsId)),
Log.transaksjonId(transaksjonsId),
Log.behov(behov.behov)
) {
logger.info("Mottok behov ${BehovType.LAGRE_EKSTERN_INNTEKTSMELDING.name}")
Expand All @@ -52,12 +52,17 @@ class LagreEksternInntektsmeldingLoeser(
publishFail(behov.createFail("Klarte ikke lagre EksternInntektsmelding for transaksjonsId $transaksjonsId. Mangler datafelt"))
} else {
try {
repository.lagreEksternInntektsmelding(forespoerselId, eksternInntektsmelding)
repository.lagreEksternInntektsmelding(forespoerselId.toString(), eksternInntektsmelding)
logger.info(
"Lagret EksternInntektsmelding med arkiv referanse ${eksternInntektsmelding.arkivreferanse}" +
" i database for forespoerselId $forespoerselId"
)
publishEvent(Event.create(EventName.EKSTERN_INNTEKTSMELDING_LAGRET, forespoerselId, mapOf(Key.UUID to transaksjonsId)))

rapidsConnection.publishEvent(
eventName = EventName.EKSTERN_INNTEKTSMELDING_LAGRET,
transaksjonId = transaksjonsId,
forespoerselId = forespoerselId
)
} catch (ex: Exception) {
publishFail(behov.createFail("Klarte ikke lagre EksternInntektsmelding for transaksjonsId $transaksjonsId"))
logger.error("Klarte ikke lagre EksternInntektsmelding")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.rapidsrivers.Loeser
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Behov
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.publishEvent
import no.nav.helsearbeidsgiver.inntektsmelding.db.ForespoerselRepository
import no.nav.helsearbeidsgiver.utils.json.toJson
import java.util.UUID

class LagreForespoerselLoeser(rapidsConnection: RapidsConnection, private val repository: ForespoerselRepository) : Loeser(rapidsConnection) {

Expand All @@ -21,16 +24,18 @@ class LagreForespoerselLoeser(rapidsConnection: RapidsConnection, private val re
}

override fun onBehov(behov: Behov) {
val forespoerselId = behov.forespoerselId!!.let(UUID::fromString)
val orgnr = behov[Key.ORGNRUNDERENHET].asText()
val fnr = behov[Key.IDENTITETSNUMMER].asText()
repository.lagreForespoersel(behov.forespoerselId!!, orgnr)

behov.createEvent(
EventName.FORESPØRSEL_LAGRET,
mapOf(
Key.IDENTITETSNUMMER to fnr,
Key.ORGNRUNDERENHET to orgnr
)
).also { publishEvent(it) }
repository.lagreForespoersel(forespoerselId.toString(), orgnr)

rapidsConnection.publishEvent(
eventName = EventName.FORESPØRSEL_LAGRET,
transaksjonId = null,
forespoerselId = forespoerselId,
Key.IDENTITETSNUMMER to fnr.toJson(),
Key.ORGNRUNDERENHET to orgnr.toJson()
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,11 @@ 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.lesOrNull
import no.nav.helsearbeidsgiver.felles.json.toJsonNode
import no.nav.helsearbeidsgiver.felles.json.toMap
import no.nav.helsearbeidsgiver.felles.rapidsrivers.Loeser
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Behov
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.publishEvent
import no.nav.helsearbeidsgiver.felles.utils.Log
import no.nav.helsearbeidsgiver.felles.utils.mapOfNotNull
import no.nav.helsearbeidsgiver.inntektsmelding.db.InntektsmeldingRepository
import no.nav.helsearbeidsgiver.utils.json.parseJson
import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer
Expand Down Expand Up @@ -84,14 +83,13 @@ class LagreJournalpostIdLoeser(

val inntektsmelding = repository.hentNyeste(forespoerselId)

behov.createEvent(
EventName.INNTEKTSMELDING_JOURNALFOERT,
mapOfNotNull(
Key.JOURNALPOST_ID to journalpostId,
Key.INNTEKTSMELDING_DOKUMENT to inntektsmelding?.toJson(Inntektsmelding.serializer())?.toJsonNode()
)
rapidsConnection.publishEvent(
eventName = EventName.INNTEKTSMELDING_JOURNALFOERT,
transaksjonId = null,
forespoerselId = forespoerselId,
Key.JOURNALPOST_ID to journalpostId.toJson(),
Key.INNTEKTSMELDING_DOKUMENT to inntektsmelding?.toJson(Inntektsmelding.serializer())
)
.also { publishEvent(it) }
} catch (ex: Exception) {
behov.createFail("Klarte ikke lagre journalpostId for transaksjonsId $transaksjonId")
.also { publishFail(it) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@ import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.rapidsrivers.Loeser
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Behov
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.publishEvent
import no.nav.helsearbeidsgiver.inntektsmelding.db.ForespoerselRepository
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.log.sikkerLogger
import java.util.UUID

class PersisterOppgaveLoeser(
rapidsConnection: RapidsConnection,
Expand All @@ -24,9 +27,19 @@ class PersisterOppgaveLoeser(

override fun onBehov(behov: Behov) {
sikkerLogger.info("PersisterOppgaveLøser mottok for uuid: ${behov.uuid()}")

val forespoerselId = behov.forespoerselId!!.let(UUID::fromString)
val oppgaveId = behov[Key.OPPGAVE_ID].asText()
repository.oppdaterOppgaveId(behov.forespoerselId!!, oppgaveId)
behov.createEvent(EventName.OPPGAVE_LAGRET, mapOf(Key.OPPGAVE_ID to oppgaveId)).also { publishEvent(it) }

repository.oppdaterOppgaveId(forespoerselId.toString(), oppgaveId)

rapidsConnection.publishEvent(
eventName = EventName.OPPGAVE_LAGRET,
transaksjonId = null,
forespoerselId = forespoerselId,
Key.OPPGAVE_ID to oppgaveId.toJson()
)

sikkerLogger.info("PersisterOppgaveLøser lagret oppgaveId $oppgaveId for forespoerselID ${behov.forespoerselId}")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@ import no.nav.helsearbeidsgiver.domene.inntektsmelding.Inntektsmelding
import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.json.toJsonNode
import no.nav.helsearbeidsgiver.felles.rapidsrivers.Loeser
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Behov
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Event
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.publishEvent
import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.json.toJsonStr
import no.nav.helsearbeidsgiver.utils.log.logger
import org.apache.kafka.clients.producer.KafkaProducer
import org.apache.kafka.clients.producer.ProducerRecord
import java.util.UUID

private const val TOPIC_HELSEARBEIDSGIVER_INNTEKTSMELDING_EKSTERN = "helsearbeidsgiver.inntektsmelding"

Expand Down Expand Up @@ -63,16 +63,13 @@ class DistribusjonLoeser(
logger.info("Distribuerte eksternt for journalpostId: $journalpostId")
sikkerLogger.info("Distribuerte eksternt for journalpostId: $journalpostId json: $journalførtJson")

Event.create(
EventName.INNTEKTSMELDING_DISTRIBUERT,
behov.forespoerselId!!,
mapOf(
Key.JOURNALPOST_ID to journalpostId,
Key.INNTEKTSMELDING_DOKUMENT to inntektsmelding.toJson(Inntektsmelding.serializer()).toJsonNode()
)
).also {
publishEvent(it)
}
rapidsConnection.publishEvent(
eventName = EventName.INNTEKTSMELDING_DISTRIBUERT,
transaksjonId = null,
forespoerselId = behov.forespoerselId?.let(UUID::fromString),
Key.JOURNALPOST_ID to journalpostId.toJson(),
Key.INNTEKTSMELDING_DOKUMENT to inntektsmelding.toJson(Inntektsmelding.serializer())
)

logger.info("Distribuerte inntektsmelding for journalpostId: $journalpostId")
} catch (e: DeserialiseringException) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class JournalfoertListener(rapidsConnection: RapidsConnection) : EventListener(r
override fun onEvent(packet: JsonMessage) {
logger.info("Fikk event: ${EventName.INNTEKTSMELDING_JOURNALFOERT}")
sikkerLogger.info("Fikk event: ${EventName.INNTEKTSMELDING_JOURNALFOERT} med pakke\n${packet.toPretty()}")

val jsonMessage = JsonMessage.newMessage(
mapOf(
Key.EVENT_NAME.str to EventName.INNTEKTSMELDING_JOURNALFOERT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import java.util.UUID
import java.util.concurrent.CompletableFuture

class DistribusjonLoeserTest {
Expand All @@ -48,6 +49,7 @@ class DistribusjonLoeserTest {
rapid.sendJson(
Key.EVENT_NAME to EventName.INNTEKTSMELDING_JOURNALFOERT.toJson(),
Key.BEHOV to BehovType.DISTRIBUER_IM.toJson(),
Key.FORESPOERSEL_ID to UUID.randomUUID().toJson(),
Key.JOURNALPOST_ID to JOURNALPOST_ID.toJson(),
Key.INNTEKTSMELDING_DOKUMENT to mockInntektsmelding().toJson(Inntektsmelding.serializer())
)
Expand Down
15 changes: 15 additions & 0 deletions feil-behandler/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
val exposedVersion: String by project
val flywayVersion: String by project
val hikariVersion: String by project
val postgresqlVersion: String by project
val testcontainersPostgresqlVersion: String by project

dependencies {
implementation("com.zaxxer:HikariCP:$hikariVersion")
implementation("org.flywaydb:flyway-core:$flywayVersion")
implementation("org.flywaydb:flyway-database-postgresql:$flywayVersion")

runtimeOnly("org.postgresql:postgresql:$postgresqlVersion")

testImplementation("org.testcontainers:postgresql:$testcontainersPostgresqlVersion")
}
5 changes: 5 additions & 0 deletions feil-behandler/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Dependency versions
flywayVersion=10.1.0
hikariVersion=5.1.0
postgresqlVersion=42.7.0
testcontainersPostgresqlVersion=1.19.3
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package no.nav.helsearbeidsgiver.inntektsmelding.feilbehandler

import com.zaxxer.hikari.HikariConfig
import no.nav.helse.rapids_rivers.RapidApplication
import no.nav.helse.rapids_rivers.RapidsConnection
import no.nav.helsearbeidsgiver.inntektsmelding.feilbehandler.config.Database
import no.nav.helsearbeidsgiver.inntektsmelding.feilbehandler.config.DatabaseConfig
import no.nav.helsearbeidsgiver.inntektsmelding.feilbehandler.config.mapHikariConfig
import no.nav.helsearbeidsgiver.inntektsmelding.feilbehandler.river.FeilLytter
import no.nav.helsearbeidsgiver.utils.log.logger
import no.nav.helsearbeidsgiver.utils.log.sikkerLogger

private val logger = "helsearbeidsgiver-im-feil-behandler".logger()
private val sikkerLogger = sikkerLogger()

fun main() {
buildApp(mapHikariConfig(DatabaseConfig()), System.getenv()).start()
}

fun buildApp(config: HikariConfig, env: Map<String, String>): RapidsConnection {
val database = Database(config)
sikkerLogger.info("Bruker database url: ${config.jdbcUrl}")
logger.info("Migrering starter...")
database.migrate()
logger.info("Migrering ferdig.")
return RapidApplication
.create(env)
.createFeilLytter(database)
}

fun RapidsConnection.createFeilLytter(database: Database): RapidsConnection =
also {
registerDbLifecycle(database)
FeilLytter(it)
}

private fun RapidsConnection.registerDbLifecycle(db: Database) {
register(object : RapidsConnection.StatusListener {
override fun onShutdown(rapidsConnection: RapidsConnection) {
logger.info("Mottatt stoppsignal, lukker databasetilkobling")
db.dataSource.close()
}
})
}
Loading

0 comments on commit 7d3415f

Please sign in to comment.