Skip to content

Commit

Permalink
Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
jacob-meidell committed Sep 20, 2023
1 parent 91d03f5 commit c4768fe
Show file tree
Hide file tree
Showing 15 changed files with 213 additions and 262 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,42 @@ import java.time.temporal.ChronoUnit
import java.util.UUID


data class Barnetrygdmottaker(
val id: UUID? = null,
var opprettet: Instant? = null,
var ident: String,
var år: Int? = null,
var correlationId: CorrelationId,
val statushistorikk: List<Status> = listOf(Status.Klar()),
val innlesingId: InnlesingId
) {
constructor(
ident: String,
correlationId: CorrelationId,
innlesingId: InnlesingId
) : this(
id = null,
opprettet = null,
år = null,
ident = ident,
correlationId = correlationId,
innlesingId = innlesingId
)

val status: Status get() = statushistorikk.last()
fun ferdig(): Barnetrygdmottaker {
return copy(statushistorikk = statushistorikk + status.ferdig())
sealed class Barnetrygdmottaker {
abstract val id: UUID?
abstract val opprettet: Instant?
abstract val ident: String
abstract val correlationId: CorrelationId
abstract val statushistorikk: List<Status>
abstract val innlesingId: InnlesingId
data class Transient(
override val ident: String,
override val correlationId: CorrelationId,
override val innlesingId: InnlesingId,
) : Barnetrygdmottaker() {
override val id = null
override val opprettet = null
override val statushistorikk: List<Status> = listOf(Status.Klar())
val status: Status get() = statushistorikk.last()
}

fun retry(melding: String): Barnetrygdmottaker {
return copy(statushistorikk = statushistorikk + status.retry(melding))
data class Mottatt(
override val id: UUID,
override val opprettet: Instant,
override val ident: String,
override val correlationId: CorrelationId,
override val innlesingId: InnlesingId,
override val statushistorikk: List<Status> = listOf(Status.Klar()),
val år: Int
) : Barnetrygdmottaker() {
val status: Status get() = statushistorikk.last()

fun ferdig(): Mottatt {
return copy(statushistorikk = statushistorikk + status.ferdig())
}

fun retry(melding: String): Mottatt {
return copy(statushistorikk = statushistorikk + status.retry(melding))
}
}

@JsonTypeInfo(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ class BarnetrygdmottakerMessageHandler(
log.info("Mottatt melding om barnetrygdmottaker")
mottaData().also {
barnetrygdmottakerRepository.insert(
toBarnetrygdmottaker(
personident = melding.personIdent,
Barnetrygdmottaker.Transient(
ident = melding.personIdent,
correlationId = melding.correlationId,
innlesingId = melding.innlesingId
)
Expand All @@ -75,18 +75,6 @@ class BarnetrygdmottakerMessageHandler(
throw BarnetrygdInnlesingException.UgyldigTistand(this.id.toString(), melding::class.java.simpleName)
}
}

private fun toBarnetrygdmottaker(
personident: String,
correlationId: CorrelationId,
innlesingId: InnlesingId,
): Barnetrygdmottaker {
return Barnetrygdmottaker(
ident = personident,
correlationId = correlationId,
innlesingId = innlesingId
)
}
}

sealed class BarnetrygdInnlesingException : RuntimeException() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,47 +6,67 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.kafka.messages.
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.serialize
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.Mdc
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.barnetrygd.external.BarnetrygdClient
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.barnetrygd.external.BestillBarnetrygdmottakereResponse
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.barnetrygd.external.HentBarnetrygdResponse
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.barnetrygd.repository.BarnetrygdInnlesingRepository
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.barnetrygd.repository.BarnetrygdmottakerRepository
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.hjelpestønad.HjelpestønadRepo
import no.nav.pensjon.opptjening.omsorgsopptjening.start.innlesning.hjelpestønad.HjelpestønadService
import org.apache.kafka.clients.producer.ProducerRecord
import org.slf4j.LoggerFactory
import org.springframework.kafka.core.KafkaTemplate
import org.springframework.stereotype.Service
import org.springframework.transaction.support.TransactionTemplate
import java.time.Instant

@Service
class BarnetrygdmottakerService(
private val client: BarnetrygdClient,
private val repo: BarnetrygdmottakerRepository,
private val barnetrygdmottakerRepository: BarnetrygdmottakerRepository,
private val kafkaProducer: KafkaTemplate<String, String>,
private val transactionTemplate: TransactionTemplate,
private val hjelpestønadRepo: HjelpestønadRepo,
private val hjelpestønadService: HjelpestønadService,
private val barnetrygdInnlesingRepository: BarnetrygdInnlesingRepository,
) {
companion object {
private val log = LoggerFactory.getLogger(this::class.java)
}

fun bestillPersonerMedBarnetrygd(ar: Int): BestillBarnetrygdmottakereResponse {
return client.bestillBarnetrygdmottakere(ar)
fun bestillPersonerMedBarnetrygd(ar: Int): BarnetrygdInnlesing.Bestilt {
return client.bestillBarnetrygdmottakere(ar).let { response ->
BarnetrygdInnlesing.Bestilt(
id = response.innlesingId,
år = response.år,
forespurtTidspunkt = Instant.now()
).also {
barnetrygdInnlesingRepository.bestilt(it)
}
}
}

fun process(): Barnetrygdmottaker? {
return transactionTemplate.execute {
repo.finnNesteUprosesserte()?.let { barnetrygdmottaker ->
barnetrygdmottakerRepository.finnNesteUprosesserte()?.let { barnetrygdmottaker ->
Mdc.scopedMdc(barnetrygdmottaker.correlationId) {
Mdc.scopedMdc(barnetrygdmottaker.innlesingId) {
try {
transactionTemplate.execute {
log.info("Prosesserer barnetrygdmottaker med id:${barnetrygdmottaker.id}")

log.info("Henter detaljer")
client.hentBarnetrygd(
ident = barnetrygdmottaker.ident,
ar = barnetrygdmottaker.år!!,
).let {
barnetrygdmottaker.handle(it)
barnetrygdmottaker.ferdig().also { barnetrygdmottaker ->
barnetrygdmottakerRepository.updateStatus(barnetrygdmottaker)
val barnetrygd = client.hentBarnetrygd(
ident = barnetrygdmottaker.ident,
ar = barnetrygdmottaker.år,
)
val barnetrygdOgHjelpestønad = barnetrygd.barnetrygdsaker.flatMap { sak ->
hjelpestønadService.hentForOmsorgsmottakere(sak.hentOmsorgsmottakere())
.map { sak.leggTilVedtaksperiode(it) }
}
kafkaProducer.send(
createKafkaMessage(
barnetrygdmottaker = barnetrygdmottaker,
saker = barnetrygdOgHjelpestønad,
rådataFraKilde = barnetrygd.rådataFraKilde, //TODO legg til hjelpestønad i rådata
)
).get()
log.info("Prosessering fullført")
}
}
} catch (ex: Throwable) {
Expand All @@ -55,7 +75,7 @@ class BarnetrygdmottakerService(
if (it.status is Barnetrygdmottaker.Status.Feilet) {
log.error("Gir opp videre prosessering av melding")
}
repo.updateStatus(it)
barnetrygdmottakerRepository.updateStatus(it)
}
}
throw ex
Expand All @@ -66,35 +86,6 @@ class BarnetrygdmottakerService(
}
}

private fun Barnetrygdmottaker.handle(response: HentBarnetrygdResponse): Barnetrygdmottaker {
return when (response) {
is HentBarnetrygdResponse.Feil -> {
"""Feil ved henting av detaljer om barnetrygd, httpStatus: ${response.status}, body: ${response.body}""".let { melding ->
log.warn(melding)
retry(melding)
.also { repo.updateStatus(it) }
}
}

is HentBarnetrygdResponse.Ok -> {
log.info("Publiserer detaljer til topic:${Topics.Omsorgsopptjening.NAME}")
ferdig()
.also {
repo.updateStatus(it)
kafkaProducer.send(
createKafkaMessage(
barnetrygdmottaker = it,
saker = hjelpestønadRepo.leggTilEventuellHjelpestønad(response.barnetrygdsaker),
rådataFraKilde = response.rådataFraKilde, //TODO legg til hjelpestønad i rådata
)
).get()
log.info("Prosessering fullført")
}

}
}
}

private fun createKafkaMessage(
barnetrygdmottaker: Barnetrygdmottaker,
saker: List<OmsorgsgrunnlagMelding.Sak>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,8 @@ class BarnetrygdClient(
.retrieve()
.onStatus(not202()) { Mono.empty() }
.toEntity<String>()
.block()?.let { BestillBarnetrygdResponseHandler.handle(it, ar) } ?: BestillBarnetrygdmottakereResponse.Feil(
null,
"Response var null"
)
.block()?.let { BestillBarnetrygdResponseHandler.handle(it, ar) }
?: throw BestillBarnetrygdMottakereException("Response var null")
}

/**
Expand Down Expand Up @@ -89,10 +87,8 @@ class BarnetrygdClient(
.retrieve()
.onStatus(not200()) { Mono.empty() }
.toEntity<String>()
.block()?.let { HentBarnetrygdResponseHandler.handle(it) } ?: HentBarnetrygdResponse.Feil(
null,
"Response var null"
)
.block()?.let { HentBarnetrygdResponseHandler.handle(it) }
?: throw HentBarnetrygdException("Response var null")
}

data class HentBarnetrygdRequest(val ident: String, val fraDato: String)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,22 @@ object BestillBarnetrygdResponseHandler {
fun handle(response: ResponseEntity<String>, år: Int): BestillBarnetrygdmottakereResponse {
return when (response.statusCode) {
HttpStatus.ACCEPTED -> {
BestillBarnetrygdmottakereResponse.Ok(
BestillBarnetrygdmottakereResponse(
innlesingId = InnlesingId.fromString(response.body.toString()),
år = år
)
}

else -> {
BestillBarnetrygdmottakereResponse.Feil(
status = response.statusCode.value(),
melding = response.body.toString()
)
throw BestillBarnetrygdMottakereException("Ukjent feil, status: ${response.statusCode.value()}, body: ${response.body.toString()}")
}
}
}
}

sealed class BestillBarnetrygdmottakereResponse {
data class Ok(val innlesingId: InnlesingId, val år: Int) : BestillBarnetrygdmottakereResponse()
data class Feil(val status: Int?, val melding: String?) : BestillBarnetrygdmottakereResponse()
}
data class BestillBarnetrygdmottakereResponse(
val innlesingId: InnlesingId,
val år: Int
)

data class BestillBarnetrygdMottakereException(val msg: String) : RuntimeException(msg)
Original file line number Diff line number Diff line change
Expand Up @@ -19,31 +19,22 @@ object HentBarnetrygdResponseHandler {
HttpStatus.OK -> {
when {
response.body == null -> {
HentBarnetrygdResponse.Feil(
status = response.statusCode.value(),
body = null
)
throw HentBarnetrygdException("Liste med barnetrygdsaker er null")
}

else -> {
deserialize<FagsakListeWrapper>(response.body!!).let { wrapper ->
when {
wrapper.fagsaker.isEmpty() -> {
HentBarnetrygdResponse.Feil(
status = status.value(),
body = "Liste med barnetrygdsaker er tom"
)
throw HentBarnetrygdException("Liste med barnetrygdsaker er tom")
}

wrapper.fagsaker.any { it.barnetrygdPerioder.isEmpty() } -> {
HentBarnetrygdResponse.Feil(
status = status.value(),
body = "En eller flere av barnetrygdsakene mangler perioder"
)
throw HentBarnetrygdException("En eller flere av barnetrygdsakene mangler perioder")
}

else -> {
HentBarnetrygdResponse.Ok(
HentBarnetrygdResponse(
barnetrygdsaker = HentBarnetrygdDomainMapper.map(wrapper.fagsaker),
rådataFraKilde = RådataFraKilde(response.body!!)
)
Expand All @@ -55,26 +46,18 @@ object HentBarnetrygdResponseHandler {
}

else -> {
HentBarnetrygdResponse.Feil(
status = response.statusCode.value(),
body = response.body.toString()
)
throw HentBarnetrygdException("Ukjent feil, status: $status, body:${response.body.toString()}")
}
}
}
}

sealed class HentBarnetrygdResponse {
data class Ok(
val barnetrygdsaker: List<OmsorgsgrunnlagMelding.Sak>,
valdataFraKilde: RådataFraKilde
) : HentBarnetrygdResponse()
data class HentBarnetrygdResponse(
val barnetrygdsaker: List<OmsorgsgrunnlagMelding.Sak>,
valdataFraKilde: RådataFraKilde
)

data class Feil(
val status: Int?,
val body: String?
) : HentBarnetrygdResponse()
}
data class HentBarnetrygdException(val msg: String) : RuntimeException(msg)


private data class FagsakListeWrapper(
Expand Down
Loading

0 comments on commit c4768fe

Please sign in to comment.