Skip to content

Commit

Permalink
Bruk service med steg i OpprettOppgaveService
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga committed Jul 16, 2024
1 parent ccdb42e commit f1a24b2
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 133 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ import no.nav.helsearbeidsgiver.inntektsmelding.integrasjonstest.utils.fromJsonT
import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig
import no.nav.helsearbeidsgiver.utils.wrapper.Fnr
import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import java.util.UUID
Expand All @@ -31,8 +34,8 @@ class NotifikasjonIT : EndToEndTest() {

publish(
Key.EVENT_NAME to EventName.SAK_OPPRETT_REQUESTED.toJson(),
Key.IDENTITETSNUMMER to Mock.FNR.toJson(),
Key.ORGNRUNDERENHET to Mock.ORGNR.toJson(),
Key.IDENTITETSNUMMER to Mock.fnr.toJson(),
Key.ORGNRUNDERENHET to Mock.orgnr.toJson(),
Key.FORESPOERSEL_ID to Mock.forespoerselId.toJson(),
)

Expand All @@ -41,7 +44,7 @@ class NotifikasjonIT : EndToEndTest() {
.filter(BehovType.FULLT_NAVN)
.firstAsMap()
.also {
it[Key.IDENTITETSNUMMER]?.fromJsonToString() shouldBe Mock.FNR
it[Key.IDENTITETSNUMMER]?.fromJson(Fnr.serializer()) shouldBe Mock.fnr
it[Key.FORESPOERSEL_ID]?.fromJson(UuidSerializer) shouldBe Mock.forespoerselId
}

Expand Down Expand Up @@ -93,7 +96,9 @@ class NotifikasjonIT : EndToEndTest() {

publish(
Key.EVENT_NAME to EventName.OPPGAVE_OPPRETT_REQUESTED.toJson(),
Key.ORGNRUNDERENHET to Mock.ORGNR.toJson(),
Key.UUID to UUID.randomUUID().toJson(),
Key.DATA to "".toJson(),
Key.ORGNRUNDERENHET to Mock.orgnr.toJson(),
Key.FORESPOERSEL_ID to Mock.forespoerselId.toJson(),
)

Expand All @@ -108,9 +113,9 @@ class NotifikasjonIT : EndToEndTest() {
it[Key.FORESPOERSEL_ID]?.fromJson(UuidSerializer) shouldBe Mock.forespoerselId
it[Key.UUID]?.fromJson(UuidSerializer).shouldNotBeNull()

val orgnr = it[Key.ORGNRUNDERENHET]?.fromJsonToString()
val orgnr = it[Key.ORGNRUNDERENHET]?.fromJson(Orgnr.serializer())

orgnr shouldBe Mock.ORGNR
orgnr shouldBe Mock.orgnr
}

messages
Expand Down Expand Up @@ -161,15 +166,15 @@ class NotifikasjonIT : EndToEndTest() {
Key.EVENT_NAME to EventName.MANUELL_OPPRETT_SAK_REQUESTED.toJson(),
Key.DATA to "".toJson(),
Key.UUID to transactionId.toJson(),
Key.FORESPOERSEL_SVAR to mockForespoersel().copy(fnr = Mock.FNR, orgnr = Mock.ORGNR).toJson(Forespoersel.serializer()),
Key.FORESPOERSEL_SVAR to mockForespoersel().copy(fnr = Mock.fnr.verdi, orgnr = Mock.orgnr.verdi).toJson(Forespoersel.serializer()),
)

messages
.filter(EventName.MANUELL_OPPRETT_SAK_REQUESTED)
.filter(BehovType.FULLT_NAVN)
.firstAsMap()
.also {
it[Key.IDENTITETSNUMMER]?.fromJsonToString() shouldBe Mock.FNR
it[Key.IDENTITETSNUMMER]?.fromJson(Fnr.serializer()) shouldBe Mock.fnr
it[Key.FORESPOERSEL_ID]?.fromJson(UuidSerializer) shouldBe Mock.forespoerselId
}

Expand Down Expand Up @@ -230,12 +235,11 @@ class NotifikasjonIT : EndToEndTest() {
}

private object Mock {
const val FNR = "fnr-123"
const val ORGNR = "orgnr-456"

const val SAK_ID = "sak_id_123"
const val OPPGAVE_ID = "oppgave_id_456"

val forespoerselId: UUID = UUID.randomUUID()
val fnr = Fnr.genererGyldig()
val orgnr = Orgnr.genererGyldig()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ abstract class EndToEndTest : ContainerTest() {
createInntekt(inntektClient)
createJournalfoerImRiver(dokarkivClient)
createMarkerForespoerselBesvart(mockPriProducer)
createNotifikasjonRivers(NOTIFIKASJON_LINK, selvbestemtRepo, redisStore, arbeidsgiverNotifikasjonKlient)
createNotifikasjonRivers(NOTIFIKASJON_LINK, selvbestemtRepo, redisStore, redisConnection, arbeidsgiverNotifikasjonKlient)
createPdl(pdlKlient)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,12 @@ import no.nav.helse.rapids_rivers.RapidApplication
import no.nav.helse.rapids_rivers.RapidsConnection
import no.nav.helsearbeidsgiver.arbeidsgivernotifikasjon.ArbeidsgiverNotifikasjonKlient
import no.nav.helsearbeidsgiver.felles.db.exposed.Database
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisConnection
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisPrefix
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStoreClassSpecific
import no.nav.helsearbeidsgiver.felles.rapidsrivers.registerShutdownLifecycle
import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.ServiceRiver
import no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.db.SelvbestemtRepo
import no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.river.ForespoerselLagretRiver
import no.nav.helsearbeidsgiver.inntektsmelding.notifikasjon.river.OppgaveFerdigLoeser
Expand All @@ -24,6 +28,7 @@ private val logger = "im-notifikasjon".logger()

fun main() {
val redisStore = RedisStore(Env.redisUrl)
val redisConnection = RedisConnection(Env.redisUrl)

val database = Database("NAIS_DATABASE_IM_NOTIFIKASJON_NOTIFIKASJON")

Expand All @@ -39,9 +44,11 @@ fun main() {
Env.linkUrl,
selvbestemtRepo,
redisStore,
redisConnection,
buildClient(),
).registerShutdownLifecycle {
redisStore.shutdown()
redisConnection.close()

logger.info("Stoppsignal mottatt, lukker databasetilkobling.")
database.dataSource.close()
Expand All @@ -52,6 +59,7 @@ fun RapidsConnection.createNotifikasjonRivers(
linkUrl: String,
selvbestemtRepo: SelvbestemtRepo,
redisStore: RedisStore,
redisConnection: RedisConnection,
arbeidsgiverNotifikasjonKlient: ArbeidsgiverNotifikasjonKlient,
): RapidsConnection =
also {
Expand All @@ -71,7 +79,12 @@ fun RapidsConnection.createNotifikasjonRivers(
OpprettOppgaveLoeser(this, arbeidsgiverNotifikasjonKlient, linkUrl)

logger.info("Starter ${OpprettOppgaveService::class.simpleName}...")
OpprettOppgaveService(this, redisStore)
ServiceRiver(
OpprettOppgaveService(
rapid = this,
redisStore = RedisStoreClassSpecific(redisConnection, RedisPrefix.OpprettOppgaveService),
),
).connect(this)

logger.info("Starter ${OppgaveFerdigLoeser::class.simpleName}...")
OppgaveFerdigLoeser(this, arbeidsgiverNotifikasjonKlient)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ class ForespoerselLagretRiver(
context.publish(
Key.EVENT_NAME to EventName.OPPGAVE_OPPRETT_REQUESTED.toJson(),
Key.UUID to UUID.randomUUID().toJson(),
Key.DATA to "".toJson(),
Key.FORESPOERSEL_ID to forespoerselId.toJson(),
Key.ORGNRUNDERENHET to orgnr.toJson(),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,30 +10,38 @@ import no.nav.helsearbeidsgiver.felles.json.les
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.FailKanal
import no.nav.helsearbeidsgiver.felles.rapidsrivers.LagreDataRedisRiver
import no.nav.helsearbeidsgiver.felles.rapidsrivers.LagreStartDataRedisRiver
import no.nav.helsearbeidsgiver.felles.rapidsrivers.composite.CompositeEventListener
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail
import no.nav.helsearbeidsgiver.felles.rapidsrivers.publish
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisKey
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStoreClassSpecific
import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.ServiceMed1Steg
import no.nav.helsearbeidsgiver.felles.utils.Log
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
import no.nav.helsearbeidsgiver.utils.log.sikkerLogger
import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr
import java.util.UUID

data class Steg0(
val transaksjonId: UUID,
val forespoerselId: UUID,
val orgnr: Orgnr,
)

data class Steg1(
val orgNavn: String,
)

class OpprettOppgaveService(
private val rapid: RapidsConnection,
override val redisStore: RedisStore,
) : CompositeEventListener() {
private val logger = logger()
private val sikkerLogger = sikkerLogger()
override val redisStore: RedisStoreClassSpecific,
) : ServiceMed1Steg<Steg0, Steg1>() {
override val logger = logger()
override val sikkerLogger = sikkerLogger()

override val event = EventName.OPPGAVE_OPPRETT_REQUESTED
override val eventName = EventName.OPPGAVE_OPPRETT_REQUESTED
override val startKeys =
setOf(
Key.UUID,
Expand All @@ -45,57 +53,40 @@ class OpprettOppgaveService(
Key.VIRKSOMHET,
)

init {
LagreStartDataRedisRiver(event, startKeys, rapid, redisStore, ::onPacket)
LagreDataRedisRiver(event, dataKeys, rapid, redisStore, ::onPacket)
FailKanal(event, rapid, ::onPacket)
}

override fun new(melding: Map<Key, JsonElement>) {
medTransaksjonIdOgForespoerselId(melding) { transaksjonId, forespoerselId ->
val orgnr = Key.ORGNRUNDERENHET.les(String.serializer(), melding)
override fun lesSteg0(melding: Map<Key, JsonElement>): Steg0 =
Steg0(
transaksjonId = Key.UUID.les(UuidSerializer, melding),
forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, melding),
orgnr = Key.ORGNRUNDERENHET.les(Orgnr.serializer(), melding),
)

rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.VIRKSOMHET.toJson(),
Key.UUID to transaksjonId.toJson(),
Key.FORESPOERSEL_ID to forespoerselId.toJson(),
Key.ORGNRUNDERENHET to orgnr.toJson(),
)
}
}
override fun lesSteg1(melding: Map<Key, JsonElement>): Steg1 =
Steg1(
orgNavn = Key.VIRKSOMHET.les(String.serializer(), melding),
)

override fun inProgress(melding: Map<Key, JsonElement>) {
medTransaksjonIdOgForespoerselId(melding) { _, _ ->
"Service skal aldri være \"underveis\".".also {
logger.error(it)
sikkerLogger.error(it)
}
}
override fun utfoerSteg0(steg0: Steg0) {
rapid.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.VIRKSOMHET.toJson(),
Key.UUID to steg0.transaksjonId.toJson(),
Key.FORESPOERSEL_ID to steg0.forespoerselId.toJson(),
Key.ORGNRUNDERENHET to steg0.orgnr.toJson(),
)
}

override fun finalize(melding: Map<Key, JsonElement>) {
val transaksjonId = Key.UUID.les(UuidSerializer, melding)
val forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, melding)

MdcUtils.withLogFields(
Log.klasse(this),
Log.event(EventName.OPPGAVE_OPPRETT_REQUESTED),
Log.transaksjonId(transaksjonId),
Log.forespoerselId(forespoerselId),
) {
val orgnr = Key.ORGNRUNDERENHET.les(String.serializer(), melding)
val virksomhetNavn = Key.VIRKSOMHET.les(String.serializer(), melding)

rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.OPPRETT_OPPGAVE.toJson(),
Key.UUID to transaksjonId.toJson(),
Key.FORESPOERSEL_ID to forespoerselId.toJson(),
Key.VIRKSOMHET to virksomhetNavn.toJson(),
Key.ORGNRUNDERENHET to orgnr.toJson(),
)
}
override fun utfoerSteg1(
steg0: Steg0,
steg1: Steg1,
) {
rapid.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.OPPRETT_OPPGAVE.toJson(),
Key.UUID to steg0.transaksjonId.toJson(),
Key.FORESPOERSEL_ID to steg0.forespoerselId.toJson(),
Key.ORGNRUNDERENHET to steg0.orgnr.toJson(),
Key.VIRKSOMHET to steg1.orgNavn.toJson(),
)
}

override fun onError(
Expand All @@ -104,50 +95,29 @@ class OpprettOppgaveService(
) {
MdcUtils.withLogFields(
Log.klasse(this),
Log.event(EventName.OPPGAVE_OPPRETT_REQUESTED),
Log.event(eventName),
Log.transaksjonId(fail.transaksjonId),
) {
val utloesendeBehov = Key.BEHOV.lesOrNull(BehovType.serializer(), fail.utloesendeMelding.toMap())
if (utloesendeBehov == BehovType.VIRKSOMHET) {
val defaultVirksomhetNavnJson = "Arbeidsgiver".toJson()

redisStore.set(RedisKey.of(fail.transaksjonId, Key.VIRKSOMHET), defaultVirksomhetNavnJson.toString())
redisStore.set(RedisKey.of(fail.transaksjonId, Key.VIRKSOMHET), defaultVirksomhetNavnJson)

val meldingMedDefault = mapOf(Key.VIRKSOMHET to defaultVirksomhetNavnJson).plus(melding)

return finalize(meldingMedDefault)
}

val clientId =
redisStore
.get(RedisKey.of(fail.transaksjonId, event))
?.let(UUID::fromString)

if (clientId == null) {
sikkerLogger.error("Forsøkte å terminere, men clientId mangler i Redis. forespoerselId=${fail.forespoerselId}")
return onData(meldingMedDefault)
} else {
redisStore.set(RedisKey.of(clientId), fail.feilmelding)
redisStore.set(RedisKey.of(fail.transaksjonId), fail.feilmelding.toJson())
}
}
}

private inline fun medTransaksjonIdOgForespoerselId(
melding: Map<Key, JsonElement>,
block: (UUID, UUID) -> Unit,
) {
MdcUtils.withLogFields(
Log.klasse(this),
Log.event(EventName.OPPGAVE_OPPRETT_REQUESTED),
) {
val transaksjonId = Key.UUID.les(UuidSerializer, melding)
val forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, melding)

MdcUtils.withLogFields(
Log.transaksjonId(transaksjonId),
Log.forespoerselId(forespoerselId),
) {
block(transaksjonId, forespoerselId)
}
}
}
override fun Steg0.loggfelt(): Map<String, String> =
mapOf(
Log.klasse(this@OpprettOppgaveService),
Log.event(eventName),
Log.transaksjonId(transaksjonId),
Log.forespoerselId(forespoerselId),
)
}
Loading

0 comments on commit f1a24b2

Please sign in to comment.