Skip to content

Commit

Permalink
Bruk service med steg i AktiveOrgnrService (#616)
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga authored Jul 19, 2024
1 parent 95d4207 commit f282532
Showing 1 changed file with 134 additions and 92 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import no.nav.helsearbeidsgiver.felles.Arbeidsforhold
import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.Person
import no.nav.helsearbeidsgiver.felles.ResultJson
import no.nav.helsearbeidsgiver.felles.json.les
import no.nav.helsearbeidsgiver.felles.json.personMapSerializer
Expand All @@ -17,24 +18,43 @@ 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.RedisStoreClassSpecific
import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.Service
import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.ServiceMed2Steg
import no.nav.helsearbeidsgiver.felles.utils.Log
import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer
import no.nav.helsearbeidsgiver.utils.json.serializer.list
import no.nav.helsearbeidsgiver.utils.json.serializer.set
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.Fnr
import java.util.UUID

data class Steg0(
val transaksjonId: UUID,
val sykmeldtFnr: Fnr,
val avsenderFnr: Fnr,
)

sealed class Steg1 {
data class Komplett(
val arbeidsforhold: List<Arbeidsforhold>,
val orgrettigheter: Set<String>,
val personer: Map<Fnr, Person>,
) : Steg1()

data object Delvis : Steg1()
}

data class Steg2(
val virksomheter: Map<String, String>,
)

class AktiveOrgnrService(
private val rapid: RapidsConnection,
override val redisStore: RedisStoreClassSpecific,
) : Service() {
private val sikkerLogger = sikkerLogger()
private val logger = logger()
) : ServiceMed2Steg<Steg0, Steg1, Steg2>() {
override val logger = logger()
override val sikkerLogger = sikkerLogger()

override val eventName = EventName.AKTIVE_ORGNR_REQUESTED
override val startKeys =
Expand All @@ -50,34 +70,101 @@ class AktiveOrgnrService(
Key.VIRKSOMHETER,
)

private val step1Keys =
setOf(
Key.ORG_RETTIGHETER,
Key.ARBEIDSFORHOLD,
Key.PERSONER,
override fun lesSteg0(melding: Map<Key, JsonElement>): Steg0 =
Steg0(
transaksjonId = Key.UUID.les(UuidSerializer, melding),
sykmeldtFnr = Key.FNR.les(Fnr.serializer(), melding),
avsenderFnr = Key.ARBEIDSGIVER_FNR.les(Fnr.serializer(), melding),
)
private val step2Keys =
setOf(
Key.VIRKSOMHETER,

override fun lesSteg1(melding: Map<Key, JsonElement>): Steg1 {
val arbeidsforhold = runCatching { Key.ARBEIDSFORHOLD.les(Arbeidsforhold.serializer().list(), melding) }
val orgrettigheter = runCatching { Key.ORG_RETTIGHETER.les(String.serializer().set(), melding) }
val personer = runCatching { Key.PERSONER.les(personMapSerializer, melding) }

val results = listOf(arbeidsforhold, orgrettigheter, personer)

return if (results.all { it.isSuccess }) {
Steg1.Komplett(
arbeidsforhold = arbeidsforhold.getOrThrow(),
orgrettigheter = orgrettigheter.getOrThrow(),
personer = personer.getOrThrow(),
)
} else if (results.any { it.isSuccess }) {
Steg1.Delvis
} else {
throw results.firstNotNullOf { it.exceptionOrNull() }
}
}

override fun lesSteg2(melding: Map<Key, JsonElement>): Steg2 =
Steg2(
virksomheter = Key.VIRKSOMHETER.les(MapSerializer(String.serializer(), String.serializer()), melding),
)

override fun utfoerSteg0(steg0: Steg0) {
rapid.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.ARBEIDSGIVERE.toJson(),
Key.UUID to steg0.transaksjonId.toJson(),
Key.DATA to
mapOf(
Key.ARBEIDSGIVER_FNR to steg0.avsenderFnr.toJson(),
).toJson(),
)

rapid.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.ARBEIDSFORHOLD.toJson(),
Key.UUID to steg0.transaksjonId.toJson(),
Key.IDENTITETSNUMMER to steg0.sykmeldtFnr.toJson(),
)

override fun onData(melding: Map<Key, JsonElement>) {
val transaksjonId = Key.UUID.les(UuidSerializer, melding)
val sykmeldtFnr = Key.FNR.les(Fnr.serializer(), melding)
val innloggetFnr = Key.ARBEIDSGIVER_FNR.les(Fnr.serializer(), melding)
rapid.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.HENT_PERSONER.toJson(),
Key.UUID to steg0.transaksjonId.toJson(),
Key.FNR_LISTE to
listOf(
steg0.sykmeldtFnr,
steg0.avsenderFnr,
).toJson(Fnr.serializer()),
)
}

if (isFinished(melding)) {
val virksomheter =
Key.VIRKSOMHETER.les(
MapSerializer(String.serializer(), String.serializer()),
melding,
override fun utfoerSteg1(
steg0: Steg0,
steg1: Steg1,
) {
if (steg1 is Steg1.Komplett) {
val arbeidsgivere = trekkUtArbeidsforhold(steg1.arbeidsforhold, steg1.orgrettigheter)

if (steg1.orgrettigheter.isEmpty()) {
onError(steg0.transaksjonId, "Må ha orgrettigheter for å kunne hente virksomheter.")
} else if (arbeidsgivere.isEmpty()) {
utfoerSteg2(steg0, steg1, Steg2(emptyMap()))
} else {
rapid.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.VIRKSOMHET.toJson(),
Key.UUID to steg0.transaksjonId.toJson(),
Key.ORGNRUNDERENHETER to arbeidsgivere.toJson(String.serializer()),
)
val personer = Key.PERSONER.les(personMapSerializer, melding)
val sykmeldtNavn = personer[sykmeldtFnr]?.navn.orEmpty()
val avsenderNavn = personer[innloggetFnr]?.navn.orEmpty()
}
}
}

override fun utfoerSteg2(
steg0: Steg0,
steg1: Steg1,
steg2: Steg2,
) {
if (steg1 is Steg1.Komplett) {
val sykmeldtNavn = steg1.personer[steg0.sykmeldtFnr]?.navn.orEmpty()
val avsenderNavn = steg1.personer[steg0.avsenderFnr]?.navn.orEmpty()

val gyldigeUnderenheter =
virksomheter.map {
steg2.virksomheter.map {
AktiveArbeidsgivere.Arbeidsgiver(
orgnrUnderenhet = it.key,
virksomhetsnavn = it.value,
Expand All @@ -94,87 +181,42 @@ class AktiveOrgnrService(
).toJson(AktiveArbeidsgivere.serializer()),
).toJson(ResultJson.serializer())

redisStore.set(RedisKey.of(transaksjonId), gyldigResponse)
} else if (step1Keys.all(melding::containsKey) && step2Keys.none(melding::containsKey)) {
val arbeidsforholdListe = Key.ARBEIDSFORHOLD.les(Arbeidsforhold.serializer().list(), melding)
val orgrettigheter = Key.ORG_RETTIGHETER.les(String.serializer().set(), melding)

val arbeidsgivere = trekkUtArbeidsforhold(arbeidsforholdListe, orgrettigheter)

MdcUtils.withLogFields(
Log.klasse(this),
Log.event(eventName),
Log.transaksjonId(transaksjonId),
) {
if (orgrettigheter.isEmpty()) {
val feilmelding = "Må ha orgrettigheter for å kunne hente virksomheter."
onError(melding, melding.createFail(feilmelding, transaksjonId))
} else if (arbeidsgivere.isEmpty()) {
val meldingMedDefault = melding.plus(Key.VIRKSOMHETER to emptyMap<String, String>().toJson())
onData(meldingMedDefault)
} else {
rapid.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.VIRKSOMHET.toJson(),
Key.UUID to transaksjonId.toJson(),
Key.ORGNRUNDERENHETER to arbeidsgivere.toJson(String.serializer()),
)
}
redisStore.set(RedisKey.of(steg0.transaksjonId), gyldigResponse)
} else {
"Steg 1 er ikke komplett under utførelse av steg 2.".also {
logger.error(it)
sikkerLogger.error(it)
}
} else if (dataKeys.none(melding::containsKey)) {
rapid.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.ARBEIDSGIVERE.toJson(),
Key.UUID to transaksjonId.toJson(),
Key.DATA to
mapOf(
Key.ARBEIDSGIVER_FNR to innloggetFnr.toJson(),
).toJson(),
)
rapid.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.ARBEIDSFORHOLD.toJson(),
Key.UUID to transaksjonId.toJson(),
Key.IDENTITETSNUMMER to sykmeldtFnr.toJson(),
)
rapid.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.HENT_PERSONER.toJson(),
Key.UUID to transaksjonId.toJson(),
Key.FNR_LISTE to
listOf(
sykmeldtFnr,
innloggetFnr,
).toJson(Fnr.serializer()),
)
}
}

override fun onError(
melding: Map<Key, JsonElement>,
fail: Fail,
) {
logger.error(fail.feilmelding)
sikkerLogger.error(fail.feilmelding)
onError(fail.transaksjonId, fail.feilmelding)
}

private fun onError(
transaksjonId: UUID,
feilmelding: String,
) {
logger.error(feilmelding)
sikkerLogger.error(feilmelding)

val feilResponse =
ResultJson(
failure = fail.feilmelding.toJson(),
failure = feilmelding.toJson(),
).toJson(ResultJson.serializer())

redisStore.set(RedisKey.of(fail.transaksjonId), feilResponse)
redisStore.set(RedisKey.of(transaksjonId), feilResponse)
}

private fun Map<Key, JsonElement>.createFail(
feilmelding: String,
transaksjonId: UUID,
): Fail =
Fail(
feilmelding = feilmelding,
event = eventName,
transaksjonId = transaksjonId,
forespoerselId = null,
utloesendeMelding = toJson(),
override fun Steg0.loggfelt(): Map<String, String> =
mapOf(
Log.klasse(this@AktiveOrgnrService),
Log.event(eventName),
Log.transaksjonId(transaksjonId),
)

private fun trekkUtArbeidsforhold(
Expand Down

0 comments on commit f282532

Please sign in to comment.