Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bruk tilstandsfunksjoner i servicer #388

Merged
merged 3 commits into from
Jan 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import no.nav.helsearbeidsgiver.felles.json.toJson
import no.nav.helsearbeidsgiver.felles.rapidsrivers.StatefullDataKanal
import no.nav.helsearbeidsgiver.felles.rapidsrivers.StatefullEventListener
import no.nav.helsearbeidsgiver.felles.rapidsrivers.composite.CompositeEventListener
import no.nav.helsearbeidsgiver.felles.rapidsrivers.composite.Transaction
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail
import no.nav.helsearbeidsgiver.felles.rapidsrivers.publish
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisKey
Expand All @@ -39,120 +38,98 @@ import java.util.UUID
class AktiveOrgnrService(
private val rapid: RapidsConnection,
override val redisStore: RedisStore
) : CompositeEventListener(redisStore) {
) : CompositeEventListener() {

private val sikkerLogger = sikkerLogger()
private val logger = logger()
override val event: EventName = EventName.AKTIVE_ORGNR_REQUESTED

override val event = EventName.AKTIVE_ORGNR_REQUESTED
override val startKeys = listOf(
Key.FNR,
Key.ARBEIDSGIVER_FNR
)
override val dataKeys = listOf(
Key.ARBEIDSFORHOLD,
Key.ORG_RETTIGHETER,
Key.ARBEIDSTAKER_INFORMASJON,
Key.VIRKSOMHETER
)

init {
withEventListener {
StatefullEventListener(
redisStore = redisStore,
event = event,
dataFelter = arrayOf(Key.FNR, Key.ARBEIDSGIVER_FNR),
mainListener = it,
rapidsConnection = rapid
StatefullEventListener(rapid, event, redisStore, startKeys, ::onPacket)
StatefullDataKanal(rapid, event, redisStore, dataKeys, ::onPacket)
}

override fun new(message: JsonMessage) {
val json = message.toJsonMap()
val transaksjonId = Key.UUID.les(UuidSerializer, json)

val innloggetFnr = json[Key.ARBEIDSGIVER_FNR]?.fromJson(String.serializer())
val sykemeldtFnr = json[Key.FNR]?.fromJson(String.serializer())
if (innloggetFnr != null && sykemeldtFnr != null) {
rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.ARBEIDSGIVERE.toJson(),
Key.IDENTITETSNUMMER to innloggetFnr.toJson(),
Key.UUID to transaksjonId.toJson()
)
}
withDataKanal {
StatefullDataKanal(
dataFelter = arrayOf(
Key.ARBEIDSFORHOLD,
Key.ORG_RETTIGHETER,
Key.ARBEIDSTAKER_INFORMASJON,
Key.VIRKSOMHETER
),
eventName = event,
mainListener = it,
rapidsConnection = rapid,
redisStore = redisStore
rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.ARBEIDSFORHOLD.toJson(),
Key.IDENTITETSNUMMER to sykemeldtFnr.toJson(),
Key.UUID to transaksjonId.toJson()
)
rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.FULLT_NAVN.toJson(),
Key.IDENTITETSNUMMER to sykemeldtFnr.toJson(),
Key.UUID to transaksjonId.toJson()
)
} else {
MdcUtils.withLogFields(
Log.klasse(this),
Log.event(event),
Log.transaksjonId(transaksjonId)
) {
"Mangler arbeidsgiverFnr eller arbeidstakerFnr."
.also {
sikkerLogger.error(it)
logger.error(it)
}

onError(message, message.createFail("Ukjent feil oppstod", transaksjonId))
}
}
}

override fun dispatchBehov(message: JsonMessage, transaction: Transaction) {
override fun inProgress(message: JsonMessage) {
val json = message.toJsonMap()
val transaksjonId = Key.UUID.les(UuidSerializer, json)

when (transaction) {
Transaction.NEW -> {
val innloggetFnr = json[Key.ARBEIDSGIVER_FNR]?.fromJson(String.serializer())
val sykemeldtFnr = json[Key.FNR]?.fromJson(String.serializer())
if (innloggetFnr != null && sykemeldtFnr != null) {
rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.ARBEIDSGIVERE.toJson(),
Key.IDENTITETSNUMMER to innloggetFnr.toJson(),
Key.UUID to transaksjonId.toJson()
)
rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.ARBEIDSFORHOLD.toJson(),
Key.IDENTITETSNUMMER to sykemeldtFnr.toJson(),
Key.UUID to transaksjonId.toJson()
)
rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.FULLT_NAVN.toJson(),
Key.IDENTITETSNUMMER to sykemeldtFnr.toJson(),
Key.UUID to transaksjonId.toJson()
)
} else {
MdcUtils.withLogFields(
Log.klasse(this),
Log.event(event),
Log.transaksjonId(transaksjonId)
) {
"Mangler arbeidsgiverFnr eller arbeidstakerFnr."
.also {
sikkerLogger.error(it)
logger.error(it)
}

terminate(message.createFail("Ukjent feil oppstod", transaksjonId))
}
}
if (isDataCollected(step1data(transaksjonId))) {
val arbeidsforholdListe = RedisKey.of(transaksjonId, Key.ARBEIDSFORHOLD).read()?.fromJson(Arbeidsforhold.serializer().list())
val orgrettigheter = RedisKey.of(transaksjonId, Key.ORG_RETTIGHETER).read()?.fromJson(String.serializer().set())
val result = trekkUtArbeidsforhold(arbeidsforholdListe, orgrettigheter)
result.onSuccess { arbeidsgivere ->
rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.VIRKSOMHET.toJson(),
Key.UUID to transaksjonId.toJson(),
Key.ORGNRUNDERENHETER to arbeidsgivere.toJson(String.serializer())
)
}

Transaction.IN_PROGRESS -> {
if (isDataCollected(*step1data(transaksjonId))) {
val arbeidsforholdListe = RedisKey.of(transaksjonId, Key.ARBEIDSFORHOLD).read()?.fromJson(Arbeidsforhold.serializer().list())
val orgrettigheter = RedisKey.of(transaksjonId, Key.ORG_RETTIGHETER).read()?.fromJson(String.serializer().set())
val result = trekkUtArbeidsforhold(arbeidsforholdListe, orgrettigheter)
result.onSuccess { arbeidsgivere ->
rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.VIRKSOMHET.toJson(),
Key.UUID to transaksjonId.toJson(),
Key.ORGNRUNDERENHETER to arbeidsgivere.toJson(String.serializer())
)
}
result.onFailure {
val feilmelding = it.message ?: "Ukjent feil oppstod"
MdcUtils.withLogFields(
Log.klasse(this),
Log.event(event),
Log.transaksjonId(transaksjonId)
) {
sikkerLogger.error(feilmelding)
logger.error(feilmelding)
}
terminate(message.createFail(feilmelding, transaksjonId))
}
result.onFailure {
val feilmelding = it.message ?: "Ukjent feil oppstod"
MdcUtils.withLogFields(
Log.klasse(this),
Log.event(event),
Log.transaksjonId(transaksjonId)
) {
sikkerLogger.error(feilmelding)
logger.error(feilmelding)
}
onError(message, message.createFail(feilmelding, transaksjonId))
}

else -> {
logger.info("Transaksjon $transaction er ikke støttet.")
}
}

MdcUtils.withLogFields(
Log.klasse(this),
Log.event(event),
Log.transaksjonId(transaksjonId)
) {
sikkerLogger.info("Prosesserer transaksjon $transaction.")
}
}

Expand Down Expand Up @@ -207,11 +184,11 @@ class AktiveOrgnrService(
}
}
}
terminate(message.createFail("Ukjent feil oppstod", transaksjonId))
onError(message, message.createFail("Ukjent feil oppstod", transaksjonId))
}
}

override fun terminate(fail: Fail) {
override fun onError(message: JsonMessage, fail: Fail) {
val transaksjonId = fail.transaksjonId

val clientId = RedisKey.of(transaksjonId, event)
Expand Down Expand Up @@ -262,7 +239,7 @@ class AktiveOrgnrService(
}
}

private fun step1data(uuid: UUID): Array<RedisKey> = arrayOf(
private fun step1data(uuid: UUID): List<RedisKey> = listOf(
RedisKey.of(uuid, Key.ARBEIDSFORHOLD),
RedisKey.of(uuid, Key.ORG_RETTIGHETER)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,10 @@ 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.toJson
import no.nav.helsearbeidsgiver.felles.rapidsrivers.DelegatingFailKanal
import no.nav.helsearbeidsgiver.felles.rapidsrivers.FailKanal
import no.nav.helsearbeidsgiver.felles.rapidsrivers.StatefullDataKanal
import no.nav.helsearbeidsgiver.felles.rapidsrivers.StatefullEventListener
import no.nav.helsearbeidsgiver.felles.rapidsrivers.composite.CompositeEventListener
import no.nav.helsearbeidsgiver.felles.rapidsrivers.composite.Transaction
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail
import no.nav.helsearbeidsgiver.felles.rapidsrivers.publish
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisKey
Expand All @@ -34,30 +33,27 @@ private const val AVSENDER_NAV_NO = "NAV_NO"
class SpinnService(
private val rapid: RapidsConnection,
override val redisStore: RedisStore
) : CompositeEventListener(redisStore) {
) : CompositeEventListener() {

private val logger = logger()
private val sikkerLogger = sikkerLogger()

override val event: EventName = EventName.EKSTERN_INNTEKTSMELDING_REQUESTED
override val event = EventName.EKSTERN_INNTEKTSMELDING_REQUESTED
override val startKeys = listOf(
Key.FORESPOERSEL_ID,
Key.SPINN_INNTEKTSMELDING_ID
)
override val dataKeys = listOf(
Key.EKSTERN_INNTEKTSMELDING
)

init {
withFailKanal { DelegatingFailKanal(event, it, rapid) }
withDataKanal {
StatefullDataKanal(
dataFelter = arrayOf(
Key.EKSTERN_INNTEKTSMELDING
),
eventName = event,
mainListener = it,
rapidsConnection = rapid,
redisStore = redisStore
)
}
withEventListener { StatefullEventListener(redisStore, event, arrayOf(Key.FORESPOERSEL_ID, Key.SPINN_INNTEKTSMELDING_ID), it, rapid) }
StatefullEventListener(rapid, event, redisStore, startKeys, ::onPacket)
StatefullDataKanal(rapid, event, redisStore, dataKeys, ::onPacket)
FailKanal(rapid, event, ::onPacket)
}

override fun dispatchBehov(message: JsonMessage, transaction: Transaction) {
override fun new(message: JsonMessage) {
val json = message.toJsonMap()

val transaksjonId = Key.UUID.les(UuidSerializer, json)
Expand All @@ -78,20 +74,24 @@ class SpinnService(
Log.event(event),
Log.forespoerselId(forespoerselId)
) {
sikkerLogger.info("Prosesserer transaksjon $transaction.")
if (transaction == Transaction.NEW) {
rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.HENT_EKSTERN_INNTEKTSMELDING.toJson(),
Key.FORESPOERSEL_ID to forespoerselId.toJson(),
Key.SPINN_INNTEKTSMELDING_ID to spinnImId.toJson(),
Key.UUID to transaksjonId.toJson()
)
.also {
logger.info("Publiserte melding om ${BehovType.HENT_EKSTERN_INNTEKTSMELDING.name} for transaksjonId $transaksjonId.")
sikkerLogger.info("Publiserte melding:\n${it.toPretty()}.")
}
}
rapid.publish(
Key.EVENT_NAME to event.toJson(),
Key.BEHOV to BehovType.HENT_EKSTERN_INNTEKTSMELDING.toJson(),
Key.FORESPOERSEL_ID to forespoerselId.toJson(),
Key.SPINN_INNTEKTSMELDING_ID to spinnImId.toJson(),
Key.UUID to transaksjonId.toJson()
)
.also {
logger.info("Publiserte melding om ${BehovType.HENT_EKSTERN_INNTEKTSMELDING.name} for transaksjonId $transaksjonId.")
sikkerLogger.info("Publiserte melding:\n${it.toPretty()}.")
}
}
}

override fun inProgress(message: JsonMessage) {
"Service skal aldri være \"underveis\".".also {
logger.error(it)
sikkerLogger.error(it)
}
}

Expand Down Expand Up @@ -132,7 +132,7 @@ class SpinnService(
}
}

override fun terminate(fail: Fail) {
override fun onError(message: JsonMessage, fail: Fail) {
MdcUtils.withLogFields(
Log.transaksjonId(fail.transaksjonId)
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,9 @@ class MockRedis {
private val mockStorage = mutableMapOf<RedisKey, String>()

private val redisKey = slot<RedisKey>()
private val redisKeys = slot<List<RedisKey>>()
private val newValue = slot<String>()

// Fungerer som en capture slot for vararg
private val keysToCheck = mutableListOf<RedisKey>()

init {
setup()
}
Expand All @@ -32,14 +30,8 @@ class MockRedis {
mockStorage[redisKey.captured]
}

every { store.exist(*varargAll { keysToCheck.add(it) }) } answers {
val allKeys = mockStorage.keys.toSet()

val keysExist = keysToCheck.intersect(allKeys).size.toLong()

keysToCheck.clear()

keysExist
every { store.exist(capture(redisKeys)) } answers {
mockStorage.keys.intersect(redisKeys.captured.toSet()).size.toLong()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.utils.log.logger
import no.nav.helsearbeidsgiver.utils.log.sikkerLogger

abstract class DataKanal(val rapidsConnection: RapidsConnection) : River.PacketListener {
abstract val eventName: EventName
abstract class DataKanal(val rapid: RapidsConnection) : River.PacketListener {
abstract val event: EventName

private val logger = logger()
private val sikkerLogger = sikkerLogger()
init {
configure(
River(rapidsConnection).apply {
River(rapid).apply {
validate(accept())
}
).register(this)
Expand All @@ -26,7 +26,7 @@ abstract class DataKanal(val rapidsConnection: RapidsConnection) : River.PacketL

private fun configure(river: River): River {
return river.validate {
it.demandValue(Key.EVENT_NAME.str, eventName.name)
it.demandValue(Key.EVENT_NAME.str, event.name)
it.demandKey(Key.DATA.str)
it.rejectKey(Key.BEHOV.str)
it.requireKey(Key.UUID.str)
Expand Down
Loading