Skip to content

Commit

Permalink
Bruk service med steg i SpinnService (#602)
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga authored Jul 15, 2024
1 parent 0859bad commit 569d9b5
Show file tree
Hide file tree
Showing 2 changed files with 187 additions and 58 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,38 @@ import no.nav.helsearbeidsgiver.felles.EksternInntektsmelding
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.toJson
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail
import no.nav.helsearbeidsgiver.felles.rapidsrivers.publish
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStoreClassSpecific
import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.Service
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.json.toPretty
import no.nav.helsearbeidsgiver.utils.log.MdcUtils
import no.nav.helsearbeidsgiver.utils.log.logger
import no.nav.helsearbeidsgiver.utils.log.sikkerLogger
import java.util.UUID

private const val AVSENDER_NAV_NO = "NAV_NO"

class Steg0(
val transaksjonId: UUID,
val forespoerselId: UUID,
val spinnImId: UUID,
)

class Steg1(
val eksternInntektsmelding: EksternInntektsmelding,
)

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

override val eventName = EventName.EKSTERN_INNTEKTSMELDING_REQUESTED
override val startKeys =
Expand All @@ -41,66 +51,69 @@ class SpinnService(
Key.EKSTERN_INNTEKTSMELDING,
)

override fun onData(melding: Map<Key, JsonElement>) {
val transaksjonId = Key.UUID.les(UuidSerializer, melding)
val forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, melding)
override fun lesSteg0(melding: Map<Key, JsonElement>): Steg0 =
Steg0(
transaksjonId = Key.UUID.les(UuidSerializer, melding),
forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, melding),
spinnImId = Key.SPINN_INNTEKTSMELDING_ID.les(UuidSerializer, melding),
)

MdcUtils.withLogFields(
Log.klasse(this),
Log.event(eventName),
Log.transaksjonId(transaksjonId),
Log.forespoerselId(forespoerselId),
) {
if (isFinished(melding)) {
val eksternInntektsmelding = Key.EKSTERN_INNTEKTSMELDING.lesOrNull(EksternInntektsmelding.serializer(), melding)
if (
eksternInntektsmelding != null &&
eksternInntektsmelding.avsenderSystemNavn != AVSENDER_NAV_NO
) {
rapid
.publish(
Key.EVENT_NAME to EventName.EKSTERN_INNTEKTSMELDING_MOTTATT.toJson(),
Key.BEHOV to BehovType.LAGRE_EKSTERN_INNTEKTSMELDING.toJson(),
Key.UUID to transaksjonId.toJson(),
Key.FORESPOERSEL_ID to forespoerselId.toJson(),
Key.EKSTERN_INNTEKTSMELDING to eksternInntektsmelding.toJson(EksternInntektsmelding.serializer()),
).also {
MdcUtils.withLogFields(
Log.event(EventName.EKSTERN_INNTEKTSMELDING_MOTTATT),
Log.behov(BehovType.LAGRE_EKSTERN_INNTEKTSMELDING),
) {
logger.info("Publiserte melding om ${BehovType.LAGRE_EKSTERN_INNTEKTSMELDING.name}.")
sikkerLogger.info("Publiserte melding:\n${it.toPretty()}")
}
}
}
override fun lesSteg1(melding: Map<Key, JsonElement>): Steg1 =
Steg1(
eksternInntektsmelding = Key.EKSTERN_INNTEKTSMELDING.les(EksternInntektsmelding.serializer(), melding),
)

sikkerLogger.info("$eventName fullført.")
} else {
val spinnImId = Key.SPINN_INNTEKTSMELDING_ID.les(UuidSerializer, melding)
override fun utfoerSteg0(steg0: Steg0) {
withLogFields(steg0) {
val publisert =
rapid.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.HENT_EKSTERN_INNTEKTSMELDING.toJson(),
Key.UUID to steg0.transaksjonId.toJson(),
Key.DATA to
mapOf(
Key.FORESPOERSEL_ID to steg0.forespoerselId.toJson(),
Key.SPINN_INNTEKTSMELDING_ID to steg0.spinnImId.toJson(),
).toJson(),
)

rapid
.publish(
Key.EVENT_NAME to eventName.toJson(),
Key.BEHOV to BehovType.HENT_EKSTERN_INNTEKTSMELDING.toJson(),
Key.UUID to transaksjonId.toJson(),
Key.DATA to
mapOf(
Key.FORESPOERSEL_ID to forespoerselId.toJson(),
Key.SPINN_INNTEKTSMELDING_ID to spinnImId.toJson(),
).toJson(),
).also {
MdcUtils.withLogFields(
Log.behov(BehovType.HENT_EKSTERN_INNTEKTSMELDING),
) {
logger.info("Publiserte melding om ${BehovType.HENT_EKSTERN_INNTEKTSMELDING.name}.")
sikkerLogger.info("Publiserte melding:\n${it.toPretty()}.")
}
}
MdcUtils.withLogFields(
Log.behov(BehovType.HENT_EKSTERN_INNTEKTSMELDING),
) {
logger.info("Publiserte melding om ${BehovType.HENT_EKSTERN_INNTEKTSMELDING}.")
sikkerLogger.info("Publiserte melding:\n${publisert.toPretty()}.")
}
}
}

override fun utfoerSteg1(
steg0: Steg0,
steg1: Steg1,
) {
withLogFields(steg0) {
if (steg1.eksternInntektsmelding.avsenderSystemNavn != AVSENDER_NAV_NO) {
val publisert =
rapid.publish(
Key.EVENT_NAME to EventName.EKSTERN_INNTEKTSMELDING_MOTTATT.toJson(),
Key.BEHOV to BehovType.LAGRE_EKSTERN_INNTEKTSMELDING.toJson(),
Key.UUID to steg0.transaksjonId.toJson(),
Key.FORESPOERSEL_ID to steg0.forespoerselId.toJson(),
Key.EKSTERN_INNTEKTSMELDING to steg1.eksternInntektsmelding.toJson(EksternInntektsmelding.serializer()),
)

MdcUtils.withLogFields(
Log.event(EventName.EKSTERN_INNTEKTSMELDING_MOTTATT),
Log.behov(BehovType.LAGRE_EKSTERN_INNTEKTSMELDING),
) {
logger.info("Publiserte melding om ${BehovType.LAGRE_EKSTERN_INNTEKTSMELDING}.")
sikkerLogger.info("Publiserte melding:\n${publisert.toPretty()}")
}
}

sikkerLogger.info("$eventName fullført.")
}
}

override fun onError(
melding: Map<Key, JsonElement>,
fail: Fail,
Expand All @@ -113,4 +126,18 @@ class SpinnService(
sikkerLogger.error("$eventName terminert.")
}
}

private fun withLogFields(
steg0: Steg0,
block: () -> Unit,
) {
MdcUtils.withLogFields(
Log.klasse(this),
Log.event(eventName),
Log.transaksjonId(steg0.transaksjonId),
Log.forespoerselId(steg0.forespoerselId),
) {
block()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@ import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStoreClassSpecific
import org.slf4j.Logger

// TODO kan bli sealed når alle servicer bruker steg-abstraksjon
abstract class Service {
abstract val redisStore: RedisStoreClassSpecific
abstract val eventName: EventName
abstract val startKeys: Set<Key>
abstract val dataKeys: Set<Key>

// TODO kan bli internal når alle servicer bruker steg-abstraksjon
abstract fun onData(melding: Map<Key, JsonElement>)

abstract fun onError(
Expand All @@ -23,3 +26,102 @@ abstract class Service {

internal fun isInactive(redisData: Map<Key, JsonElement>): Boolean = !startKeys.all(redisData::containsKey)
}

// TODO lese påkrevde felt som transaksjonId her?
abstract class ServiceMed1Steg<S0, S1> : Service() {
abstract val logger: Logger
abstract val sikkerLogger: Logger

abstract fun lesSteg0(melding: Map<Key, JsonElement>): S0

abstract fun lesSteg1(melding: Map<Key, JsonElement>): S1

abstract fun utfoerSteg0(steg0: S0)

abstract fun utfoerSteg1(
steg0: S0,
steg1: S1,
)

override fun onData(melding: Map<Key, JsonElement>) {
runCatching {
Pair(
first = lesSteg0(melding),
second = lesSteg1(melding),
)
}.onSuccess {
utfoerSteg1(it.first, it.second)
}.onFailure {
lesOgUtfoerSteg0(melding)
}
}

private fun lesOgUtfoerSteg0(melding: Map<Key, JsonElement>) {
runCatching { lesSteg0(melding) }
.onSuccess {
utfoerSteg0(it)
}.onFailure {
"Klarte ikke lese startdata for service.".also {
logger.error(it)
sikkerLogger.error(it)
}
}
}
}

abstract class ServiceMed2Steg<S0, S1, S2> : ServiceMed1Steg<S0, S1>() {
abstract fun lesSteg2(melding: Map<Key, JsonElement>): S2

abstract fun utfoerSteg2(
steg0: S0,
steg1: S1,
steg2: S2,
)

override fun onData(melding: Map<Key, JsonElement>) {
runCatching {
Triple(
first = lesSteg0(melding),
second = lesSteg1(melding),
third = lesSteg2(melding),
)
}.onSuccess {
utfoerSteg2(it.first, it.second, it.third)
}.onFailure {
super.onData(melding)
}
}
}

abstract class ServiceMed3Steg<S0, S1, S2, S3> : ServiceMed2Steg<S0, S1, S2>() {
abstract fun lesSteg3(melding: Map<Key, JsonElement>): S3

abstract fun utfoerSteg3(
steg0: S0,
steg1: S1,
steg2: S2,
steg3: S3,
)

override fun onData(melding: Map<Key, JsonElement>) {
runCatching {
Quadruple(
first = lesSteg0(melding),
second = lesSteg1(melding),
third = lesSteg2(melding),
fourth = lesSteg3(melding),
)
}.onSuccess {
utfoerSteg3(it.first, it.second, it.third, it.fourth)
}.onFailure {
super.onData(melding)
}
}
}

private class Quadruple<S0, S1, S2, S3>(
val first: S0,
val second: S1,
val third: S2,
val fourth: S3,
)

0 comments on commit 569d9b5

Please sign in to comment.