diff --git a/Los.png b/Los.png new file mode 100644 index 000000000..fc541a7ce Binary files /dev/null and b/Los.png differ diff --git a/README.md b/README.md index 7c4cd1ff4..a1bf44491 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,5 @@ Start k9-verdikjede. Er avhengig av vtp, postgresql og nav-auth-mock. Start klassen `no.nav.k9.K9LosDev` med parameter `-Djavax.net.ssl.trustStore=/Users/.../.modig/trustStore.jks -Djavax.net.ssl.keyStore=/Users/.../.modig/keyStore.jks -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.keyStorePassword=devillokeystore1234'` + +![logo](Los.png) \ No newline at end of file diff --git a/nais/dev-fss.yml b/nais/dev-fss.yml index eec56eaf5..0364fb32b 100644 --- a/nais/dev-fss.yml +++ b/nais/dev-fss.yml @@ -82,6 +82,8 @@ spec: value: b27apvl00045.preprod.local:8443,b27apvl00046.preprod.local:8443,b27apvl00047.preprod.local:8443 - name: KAFKA_AKSJONSPUNKTHENDELSE_TOPIC value: privat-k9-aksjonspunkthendelse + - name: KAFKA_PUNSJAKSJONSPUNKTHENDELSE_TOPIC + value: privat-k9punsj-aksjonspunkthendelse - name: KAFKA_AKSJONSPUNKTHENDELSE_TILBAKE_TOPIC value: privat-tilbakekreving-k9loshendelse-v1 - name: KAFKA_SAKOGBEHANDLING_TOPIC @@ -94,7 +96,6 @@ spec: # ABAC - name: ABAC_PDP_ENDPOINT_URL value: https://abac-k9.nais.preprod.local/application/authorize - # https://wasapp-q1.adeo.no/asm-pdp/authorize - name: APPDYNAMICS_CONTROLLER_HOST_NAME value: appdynamics.adeo.no diff --git a/nais/prod-fss.yml b/nais/prod-fss.yml index 073c5eec9..ea98d7701 100644 --- a/nais/prod-fss.yml +++ b/nais/prod-fss.yml @@ -72,17 +72,19 @@ spec: - name: COOKIE_NAME value: selvbetjening-idtoken - - name: APP_K9SAK_URL - value: https://k9-sak.nais.adeo.no/k9/sak/api - - name: PDL_URL value: https://pdl-api.nais.adeo.no/graphql + + - name: APP_K9SAK_URL + value: https://k9-sak.nais.adeo.no/k9/sak/api # Kafka - name: BOOTSTRAP_SERVERS value: a01apvl00145.adeo.no:8443,a01apvl00146.adeo.no:8443,a01apvl00147.adeo.no:8443,a01apvl00148.adeo.no:8443,a01apvl00149.adeo.no:8443,a01apvl00150.adeo.no:8443 - name: KAFKA_AKSJONSPUNKTHENDELSE_TOPIC value: privat-k9-aksjonspunkthendelse + - name: KAFKA_PUNSJAKSJONSPUNKTHENDELSE_TOPIC + value: privat-k9punsj-aksjonspunkthendelse - name: KAFKA_AKSJONSPUNKTHENDELSE_TILBAKE_TOPIC value: privat-tilbakekreving-k9loshendelse-v1 - name: KAFKA_SAKOGBEHANDLING_TOPIC @@ -103,10 +105,9 @@ spec: - name: APPDYNAMICS_CONTROLLER_SSL_ENABLED value: "true" - name: APPDYNAMICS_AGENT_ACCOUNT_NAME - value: PROD - + value: PROD - # Audit logging + # Audit logging - name: AUDITLOGGER_ENABLED value: "true" - name: AUDITLOGGER_VENDOR diff --git a/src/main/kotlin/no/nav/k9/Configuration.kt b/src/main/kotlin/no/nav/k9/Configuration.kt index 4a1872bc8..655614881 100644 --- a/src/main/kotlin/no/nav/k9/Configuration.kt +++ b/src/main/kotlin/no/nav/k9/Configuration.kt @@ -44,6 +44,11 @@ data class Configuration(private val config: ApplicationConfig) { ?: "privat-k9-aksjonspunkthendelse" } + internal fun getAksjonspunkthendelsePunsjTopic(): String { + return config.getOptionalString("nav.kafka.punsjAksjonshendelseTopic", secret = false) + ?: "private-k9punsj-aksjonspunkthendelse-v1" + } + internal fun getAksjonspunkthendelseTilbakeTopic(): String { return config.getOptionalString("nav.kafka.tilbakekrevingaksjonshendelseTopic", secret = false) ?: "privat-tilbakekreving-k9loshendelse-v1" diff --git a/src/main/kotlin/no/nav/k9/KoinProfiles.kt b/src/main/kotlin/no/nav/k9/KoinProfiles.kt index 93383f768..719712ac5 100644 --- a/src/main/kotlin/no/nav/k9/KoinProfiles.kt +++ b/src/main/kotlin/no/nav/k9/KoinProfiles.kt @@ -6,6 +6,7 @@ import kotlinx.coroutines.channels.Channel import no.nav.helse.dusseldorf.ktor.health.HealthService import no.nav.k9.KoinProfile.* import no.nav.k9.aksjonspunktbehandling.K9TilbakeEventHandler +import no.nav.k9.aksjonspunktbehandling.K9punsjEventHandler import no.nav.k9.aksjonspunktbehandling.K9sakEventHandler import no.nav.k9.db.hikariConfig import no.nav.k9.domene.lager.oppgave.Oppgave @@ -90,7 +91,7 @@ fun common(app: Application, config: Configuration) = module { pepClient = get() ) } - + single { SaksbehandlerRepository( dataSource = get(), @@ -117,11 +118,15 @@ fun common(app: Application, config: Configuration) = module { single { BehandlingProsessEventK9Repository(get()) } + + single { + PunsjEventK9Repository(get()) + } single { BehandlingProsessEventTilbakeRepository(get()) } - + single { StatistikkRepository(get()) } @@ -138,7 +143,7 @@ fun common(app: Application, config: Configuration) = module { clients = config.clients() ) } - + single { StatistikkProducer( kafkaConfig = config.getKafkaConfig(), @@ -178,13 +183,25 @@ fun common(app: Application, config: Configuration) = module { saksbehhandlerRepository = get() ) } - + + single { + K9punsjEventHandler( + oppgaveRepository = get(), + punsjEventK9Repository = get(), + oppgaverSomSkalInnPåKøer = get(named("oppgaveChannel")), + statistikkRepository = get(), + saksbehhandlerRepository = get() + ) + } + + single { AsynkronProsesseringV1Service( kafkaConfig = config.getKafkaConfig(), configuration = config, k9sakEventHandler = get(), - k9TilbakeEventHandler = get() + k9TilbakeEventHandler = get(), + punsjEventHandler = get() ) } @@ -198,7 +215,7 @@ fun common(app: Application, config: Configuration) = module { configuration = config, pepClient = get(), azureGraphService = get(), - statistikkRepository = get(), + statistikkRepository = get(), oppgaverSomSkalInnPåKøer = get(named("oppgaveChannel")) ) } @@ -263,7 +280,10 @@ fun preprodConfig(app: Application, config: Configuration) = module { PepClient(azureGraphService = get(), auditlogger = Auditlogger(config), config = config) as IPepClient } single { - K9SakService(configuration = get(), accessTokenClient =get().naisSts()) as IK9SakService + K9SakService( + configuration = get(), + accessTokenClient = get().naisSts() + ) as IK9SakService } single { RequestContextService() as IRequestContextService } @@ -288,7 +308,10 @@ fun prodConfig(app: Application, config: Configuration) = module { PepClient(azureGraphService = get(), auditlogger = Auditlogger(config), config = config) as IPepClient } single { - K9SakService(configuration = get(), accessTokenClient =get().naisSts()) as IK9SakService + K9SakService( + configuration = get(), + accessTokenClient = get().naisSts() + ) as IK9SakService } single { RequestContextService() as IRequestContextService } diff --git a/src/main/kotlin/no/nav/k9/aksjonspunktbehandling/AksjonspunktPunsjStream.kt b/src/main/kotlin/no/nav/k9/aksjonspunktbehandling/AksjonspunktPunsjStream.kt new file mode 100644 index 000000000..f769fe278 --- /dev/null +++ b/src/main/kotlin/no/nav/k9/aksjonspunktbehandling/AksjonspunktPunsjStream.kt @@ -0,0 +1,66 @@ +package no.nav.k9.aksjonspunktbehandling + +import io.ktor.util.* +import no.nav.helse.kafka.ManagedKafkaStreams +import no.nav.helse.kafka.ManagedStreamHealthy +import no.nav.helse.kafka.ManagedStreamReady +import no.nav.k9.Configuration +import no.nav.k9.integrasjon.kafka.KafkaConfig +import org.apache.kafka.streams.StreamsBuilder +import org.apache.kafka.streams.Topology +import org.apache.kafka.streams.kstream.Consumed +import org.slf4j.LoggerFactory + +internal class AksjonspunktPunsjStream @KtorExperimentalAPI constructor( + kafkaConfig: KafkaConfig, + configuration: Configuration, + K9punsjEventHandler: K9punsjEventHandler +) { + + @KtorExperimentalAPI + private val stream = ManagedKafkaStreams( + name = NAME, + properties = kafkaConfig.stream(NAME), + topology = topology( + configuration = configuration, + K9punsjEventHandler = K9punsjEventHandler + ), + unreadyAfterStreamStoppedIn = kafkaConfig.unreadyAfterStreamStoppedIn + ) + + @KtorExperimentalAPI + internal val ready = ManagedStreamReady(stream) + @KtorExperimentalAPI + internal val healthy = ManagedStreamHealthy(stream) + + private companion object { + private const val NAME = "AksjonspunktLagetPunsjV1" + private val log = LoggerFactory.getLogger("no.nav.$NAME.topology") + + @KtorExperimentalAPI + private fun topology( + configuration: Configuration, + K9punsjEventHandler: K9punsjEventHandler + ): Topology { + val builder = StreamsBuilder() + val fromTopic = Topic( + name = configuration.getAksjonspunkthendelsePunsjTopic(), + serDes = AksjonspunktPunsjLaget() + ) + builder + .stream( + fromTopic.name, + Consumed.with(fromTopic.keySerde, fromTopic.valueSerde) + ) + .foreach { _, entry -> + if (entry != null) { + K9punsjEventHandler.prosesser(entry) + } + } + return builder.build() + } + } + + @KtorExperimentalAPI + internal fun stop() = stream.stop(becauseOfError = false) +} \ No newline at end of file diff --git a/src/main/kotlin/no/nav/k9/aksjonspunktbehandling/K9punsjEventHandler.kt b/src/main/kotlin/no/nav/k9/aksjonspunktbehandling/K9punsjEventHandler.kt new file mode 100644 index 000000000..80f8b1c8c --- /dev/null +++ b/src/main/kotlin/no/nav/k9/aksjonspunktbehandling/K9punsjEventHandler.kt @@ -0,0 +1,34 @@ +package no.nav.k9.aksjonspunktbehandling + +import io.ktor.util.* +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.channels.sendBlocking +import no.nav.k9.Configuration +import no.nav.k9.domene.lager.oppgave.Oppgave +import no.nav.k9.domene.repository.* +import no.nav.k9.integrasjon.datavarehus.StatistikkProducer +import no.nav.k9.integrasjon.kafka.dto.PunsjEventDto +import no.nav.k9.integrasjon.sakogbehandling.SakOgBehandlingProducer +import org.slf4j.LoggerFactory + + +class K9punsjEventHandler @KtorExperimentalAPI constructor( + val oppgaveRepository: OppgaveRepository, + val punsjEventK9Repository: PunsjEventK9Repository, + val oppgaverSomSkalInnPåKøer: Channel, + val statistikkRepository: StatistikkRepository, + val saksbehhandlerRepository: SaksbehandlerRepository +) { + private val log = LoggerFactory.getLogger(K9punsjEventHandler::class.java) + + @KtorExperimentalAPI + fun prosesser( + event: PunsjEventDto + ) { + val modell = punsjEventK9Repository.lagre(event = event) + val oppgave = modell.oppgave() + oppgaveRepository.lagre(oppgave.eksternId){oppgave} + oppgaverSomSkalInnPåKøer.sendBlocking(oppgave) + } + +} diff --git a/src/main/kotlin/no/nav/k9/aksjonspunktbehandling/Topics.kt b/src/main/kotlin/no/nav/k9/aksjonspunktbehandling/Topics.kt index 0dbbb1859..e6563185b 100644 --- a/src/main/kotlin/no/nav/k9/aksjonspunktbehandling/Topics.kt +++ b/src/main/kotlin/no/nav/k9/aksjonspunktbehandling/Topics.kt @@ -8,6 +8,7 @@ import com.fasterxml.jackson.module.kotlin.readValue import no.nav.helse.dusseldorf.ktor.jackson.dusseldorfConfigured import no.nav.k9.integrasjon.kafka.dto.BehandlingProsessEventDto import no.nav.k9.integrasjon.kafka.dto.BehandlingProsessEventTilbakeDto +import no.nav.k9.integrasjon.kafka.dto.PunsjEventDto import org.apache.kafka.common.serialization.Deserializer import org.apache.kafka.common.serialization.Serdes import org.apache.kafka.common.serialization.Serializer @@ -61,6 +62,20 @@ internal class AksjonspunktLaget : SerDes() { } } +internal class AksjonspunktPunsjLaget : SerDes() { + override fun deserialize(topic: String?, data: ByteArray?): PunsjEventDto? { + return data?.let { + return try { + objectMapper.readValue(it) + } catch (e: Exception) { + log.warn("", e) + log.warn(String(it)) + throw e + } + } + } +} + internal class AksjonspunktLagetTilbake : SerDes() { override fun deserialize(topic: String?, data: ByteArray?): BehandlingProsessEventTilbakeDto? { return data?.let { diff --git a/src/main/kotlin/no/nav/k9/domene/modell/K9punsjModell.kt b/src/main/kotlin/no/nav/k9/domene/modell/K9punsjModell.kt new file mode 100644 index 000000000..e289a6645 --- /dev/null +++ b/src/main/kotlin/no/nav/k9/domene/modell/K9punsjModell.kt @@ -0,0 +1,76 @@ +package no.nav.k9.domene.modell + +import no.nav.k9.domene.lager.oppgave.Oppgave +import no.nav.k9.domene.repository.ReservasjonRepository +import no.nav.k9.domene.repository.SaksbehandlerRepository +import no.nav.k9.integrasjon.kafka.dto.PunsjEventDto +import no.nav.k9.statistikk.kontrakter.Behandling +import no.nav.k9.statistikk.kontrakter.Sak + +class K9punsjModell( + val eventer: List +) : IModell { + + override fun starterSak(): Boolean { + TODO("Not yet implemented") + } + + override fun erTom(): Boolean { + TODO("Not yet implemented") + } + + override fun dvhSak(): Sak { + TODO("Not yet implemented") + } + + override fun dvhBehandling( + saksbehandlerRepository: SaksbehandlerRepository, + reservasjonRepository: ReservasjonRepository + ): Behandling { + TODO("Not yet implemented") + } + + override fun sisteSaksNummer(): String { + TODO("Not yet implemented") + } + + fun oppgave(): Oppgave { + + val sisteEvent = eventer.last() + val førsteEvent = eventer.first() + return Oppgave( + behandlingId = null, + fagsakSaksnummer = "", + aktorId = "", + behandlendeEnhet = "", + behandlingsfrist =førsteEvent.eventTid.toLocalDate().plusDays(21).atStartOfDay(), + behandlingOpprettet =førsteEvent.eventTid, + forsteStonadsdag =førsteEvent.eventTid.toLocalDate(), + behandlingStatus =BehandlingStatus.OPPRETTET, + behandlingType =BehandlingType.PUNSJ, + fagsakYtelseType =FagsakYtelseType.PPN, + eventTid =sisteEvent.eventTid, + aktiv = false, + system = FagsakYtelseType.PUNSJ.kode, + oppgaveAvsluttet = null, + utfortFraAdmin = false, + eksternId =sisteEvent.eksternId, + oppgaveEgenskap = listOf(), + aksjonspunkter = Aksjonspunkter(liste = mapOf()), + tilBeslutter = false, + utbetalingTilBruker = false, + selvstendigFrilans = false, + kombinert = false, + søktGradering = false, + registrerPapir = false, + årskvantum = false, + avklarMedlemskap = false, + kode6 = false, + skjermet = false, + utenlands = false, + vurderopptjeningsvilkåret = false, + ansvarligSaksbehandlerForTotrinn = null, + ansvarligSaksbehandlerIdent = null + ) + } +} \ No newline at end of file diff --git "a/src/main/kotlin/no/nav/k9/domene/modell/OppgaveK\303\270.kt" "b/src/main/kotlin/no/nav/k9/domene/modell/OppgaveK\303\270.kt" index 45ec4b7a8..09e9ea2e4 100644 --- "a/src/main/kotlin/no/nav/k9/domene/modell/OppgaveK\303\270.kt" +++ "b/src/main/kotlin/no/nav/k9/domene/modell/OppgaveK\303\270.kt" @@ -273,7 +273,8 @@ enum class FagsakYtelseType constructor(override val kode: String, override val OMSORGSPENGER("OMP", "Omsorgspenger"), FRISINN("FRISINN", "Frisinn"), PPN("PPN", "PPN"), - OLP("OLP", "OLP"); + OLP("OLP", "OLP"), + PUNSJ("PUNSJ", "PUNSJ"); override val kodeverk = "FAGSAK_YTELSE_TYPE" @@ -308,6 +309,7 @@ enum class BehandlingType(override val kode: String, override val navn: String, REVURDERING("BT-004", "Revurdering", "ae0028"), INNSYN("BT-006", "Innsyn", "ae0042"), TILBAKE("BT-007", "Tilbakekreving", ""), + PUNSJ("BT-009", "Punsj", ""), ANKE("BT-008", "Anke", "ae0046"); companion object { diff --git a/src/main/kotlin/no/nav/k9/domene/repository/PunsjEventK9Repository.kt b/src/main/kotlin/no/nav/k9/domene/repository/PunsjEventK9Repository.kt new file mode 100644 index 000000000..b8a126602 --- /dev/null +++ b/src/main/kotlin/no/nav/k9/domene/repository/PunsjEventK9Repository.kt @@ -0,0 +1,129 @@ +package no.nav.k9.domene.repository + +import com.fasterxml.jackson.module.kotlin.readValue +import kotliquery.queryOf +import kotliquery.sessionOf +import kotliquery.using +import no.nav.k9.aksjonspunktbehandling.objectMapper +import no.nav.k9.domene.modell.K9SakModell +import no.nav.k9.domene.modell.K9punsjModell +import no.nav.k9.integrasjon.kafka.dto.PunsjEventDto +import no.nav.k9.tjenester.innsikt.Databasekall +import no.nav.k9.tjenester.innsikt.Mapping +import java.util.* +import java.util.concurrent.atomic.LongAdder +import javax.sql.DataSource + + +class PunsjEventK9Repository(private val dataSource: DataSource) { + + fun hent(uuid: UUID): K9SakModell { + val json: String? = using(sessionOf(dataSource)) { + it.run( + queryOf( + "select data from behandling_prosess_events_k9 where id = :id", + mapOf("id" to uuid.toString()) + ) + .map { row -> + row.string("data") + }.asSingle + ) + } + Databasekall.map.computeIfAbsent(object{}.javaClass.name + object{}.javaClass.enclosingMethod.name){LongAdder()}.increment() + if (json.isNullOrEmpty()) { + return K9SakModell(emptyList()) + } + val modell = objectMapper().readValue(json, K9SakModell::class.java) + + return K9SakModell( modell.eventer.sortedBy { it.eventTid }) + } + + fun lagre( + event: PunsjEventDto + ): K9punsjModell { + val json = objectMapper().writeValueAsString(event) + + val id = event.eksternId.toString() + val out = using(sessionOf(dataSource)) { + it.transaction { tx -> + tx.run( + queryOf( + """ + insert into behandling_prosess_events_k9_punsj as k (id, data) + values (:id, :dataInitial :: jsonb) + on conflict (id) do update + set data = jsonb_set(k.data, '{eventer,999999}', :data :: jsonb, true) + """, mapOf("id" to id, "dataInitial" to "{\"eventer\": [$json]}", "data" to json) + ).asUpdate + ) + tx.run( + queryOf( + "select data from behandling_prosess_events_k9_punsj where id = :id", + mapOf("id" to id) + ) + .map { row -> + row.string("data") + }.asSingle + ) + } + + } + Databasekall.map.computeIfAbsent(object{}.javaClass.name + object{}.javaClass.enclosingMethod.name){LongAdder()}.increment() + return objectMapper().readValue(out!!) + + } + + fun hentAlleEventerIder( + ): List { + + val ider = using(sessionOf(dataSource)) { + it.transaction { tx -> + tx.run( + queryOf( + "select id from behandling_prosess_events_k9", + mapOf() + ) + .map { row -> + row.string("id") + }.asList + ) + } + + } + return ider + + } + + fun eldsteEventTid(): String { + val json: String? = using(sessionOf(dataSource)) { + //language=PostgreSQL + it.run( + queryOf( + """select sort_array(data->'eventer', 'eventTid') -> 0 ->'eventTid' as data from behandling_prosess_events_k9 order by (sort_array(data->'eventer', 'eventTid') -> 0 ->'eventTid') limit 1;""", + mapOf() + ) + .map { row -> + row.string("data") + }.asSingle + ) + } + Databasekall.map.computeIfAbsent(object{}.javaClass.name + object{}.javaClass.enclosingMethod.name){LongAdder()}.increment() + return json!! + } + + fun mapMellomeksternIdOgBehandlingsid(): List { + Databasekall.map.computeIfAbsent(object{}.javaClass.name + object{}.javaClass.enclosingMethod.name){LongAdder()}.increment() + return using(sessionOf(dataSource)) { + //language=PostgreSQL + it.run( + queryOf( + """select id, (data-> 'eventer' -> -1 ->'behandlingId' ) as behandlingid from behandling_prosess_events_k9""", + mapOf() + ) + .map { row -> + Mapping(id = row.string("behandlingid"), uuid = row.string("id")) + }.asList + ) + } + } +} diff --git a/src/main/kotlin/no/nav/k9/integrasjon/kafka/AsynkronProsesseringV1Service.kt b/src/main/kotlin/no/nav/k9/integrasjon/kafka/AsynkronProsesseringV1Service.kt index 4b9aba605..54012532f 100644 --- a/src/main/kotlin/no/nav/k9/integrasjon/kafka/AsynkronProsesseringV1Service.kt +++ b/src/main/kotlin/no/nav/k9/integrasjon/kafka/AsynkronProsesseringV1Service.kt @@ -2,16 +2,15 @@ package no.nav.k9.integrasjon.kafka import io.ktor.util.* import no.nav.k9.Configuration -import no.nav.k9.aksjonspunktbehandling.AksjonspunktStreamK9 -import no.nav.k9.aksjonspunktbehandling.K9TilbakeEventHandler -import no.nav.k9.aksjonspunktbehandling.K9sakEventHandler +import no.nav.k9.aksjonspunktbehandling.* import org.slf4j.LoggerFactory internal class AsynkronProsesseringV1Service @KtorExperimentalAPI constructor( kafkaConfig: KafkaConfig, configuration: Configuration, k9sakEventHandler: K9sakEventHandler, - k9TilbakeEventHandler: K9TilbakeEventHandler + k9TilbakeEventHandler: K9TilbakeEventHandler, + punsjEventHandler: K9punsjEventHandler ) { private companion object { @@ -26,30 +25,40 @@ internal class AsynkronProsesseringV1Service @KtorExperimentalAPI constructor( k9sakEventHandler = k9sakEventHandler ) -// @KtorExperimentalAPI -// private val aksjonspunkTilbaketStream = AksjonspunktTilbakeStream( -// kafkaConfig = kafkaConfig, -// configuration = configuration, -// k9TilbakeEventHandler = k9TilbakeEventHandler -// ) + @KtorExperimentalAPI + private val aksjonspunkTilbaketStream = AksjonspunktTilbakeStream( + kafkaConfig = kafkaConfig, + configuration = configuration, + k9TilbakeEventHandler = k9TilbakeEventHandler + ) + + @KtorExperimentalAPI + private val aksjonspunkPunsjStream = AksjonspunktPunsjStream( + kafkaConfig = kafkaConfig, + configuration = configuration, + K9punsjEventHandler = punsjEventHandler + ) @KtorExperimentalAPI private val healthChecks = setOf( aksjonspunktStream.healthy, -// aksjonspunkTilbaketStream.healthy + aksjonspunkTilbaketStream.healthy, + aksjonspunkPunsjStream.healthy ) @KtorExperimentalAPI private val isReadyChecks = setOf( aksjonspunktStream.ready, -// aksjonspunkTilbaketStream.ready + aksjonspunkTilbaketStream.ready, + aksjonspunkPunsjStream.ready ) @KtorExperimentalAPI internal fun stop() { logger.info("Stopper streams.") aksjonspunktStream.stop() -// aksjonspunkTilbaketStream.stop() + aksjonspunkTilbaketStream.stop() + aksjonspunkPunsjStream.stop() logger.info("Alle streams stoppet.") } diff --git a/src/main/kotlin/no/nav/k9/integrasjon/kafka/dto/PunsjEventDto.kt b/src/main/kotlin/no/nav/k9/integrasjon/kafka/dto/PunsjEventDto.kt new file mode 100644 index 000000000..cf8de5130 --- /dev/null +++ b/src/main/kotlin/no/nav/k9/integrasjon/kafka/dto/PunsjEventDto.kt @@ -0,0 +1,13 @@ +package no.nav.k9.integrasjon.kafka.dto + +import no.nav.k9.sak.typer.JournalpostId +import java.time.LocalDateTime +import java.util.* + +typealias PunsjId = UUID + +data class PunsjEventDto( + val eksternId: PunsjId, + val journalpostId: JournalpostId, + val eventTid: LocalDateTime +) \ No newline at end of file diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf index 163262c58..7bf30ce61 100644 --- a/src/main/resources/application.conf +++ b/src/main/resources/application.conf @@ -50,10 +50,15 @@ nav { username = ${?SYSTEMBRUKER_USERNAME} password = "" password = ${?SYSTEMBRUKER_PASSWORD} + aksjonshendelseTopic = "" aksjonshendelseTopic = ${?KAFKA_AKSJONSPUNKTHENDELSE_TOPIC} + tilbakekrevingaksjonshendelseTopic = "" tilbakekrevingaksjonshendelseTopic = ${?KAFKA_AKSJONSPUNKTHENDELSE_TILBAKE_TOPIC} + sakOgBehandlingTopic = "" sakOgBehandlingTopic = ${?KAFKA_SAKOGBEHANDLING_TOPIC} + statistikkSakTopic = "" statistikkSakTopic = ${?KAFKA_STATISTIKK_SAK_TOPIC} + statistikkBehandlingTopic = "" statistikkBehandlingTopic = ${?KAFKA_STATISTIKK_BEHANDLING_TOPIC} unready_after_stream_stopped_in { amount = "1000" diff --git a/src/test/kotlin/no/nav/k9/domene/repository/StatistikkRepositoryTest.kt b/src/test/kotlin/no/nav/k9/domene/repository/StatistikkRepositoryTest.kt index f7bdb760b..1bef82047 100644 --- a/src/test/kotlin/no/nav/k9/domene/repository/StatistikkRepositoryTest.kt +++ b/src/test/kotlin/no/nav/k9/domene/repository/StatistikkRepositoryTest.kt @@ -17,6 +17,7 @@ import org.koin.test.get import java.time.LocalDate import java.time.LocalDateTime import java.util.* +import kotlin.test.assertSame class StatistikkRepositoryTest : KoinTest { @KtorExperimentalAPI @@ -33,8 +34,8 @@ class StatistikkRepositoryTest : KoinTest { val hentFerdigstilte = statistikkRepository.hentFerdigstilteOgNyeHistorikkMedYtelsetypeSiste8Uker() - val omsorgspenger = hentFerdigstilte.take(25).filter { it.fagsakYtelseType == FagsakYtelseType.OMSORGSPENGER } - assert(omsorgspenger.size == 5) + val omsorgspenger = hentFerdigstilte.take(30).filter { it.fagsakYtelseType == FagsakYtelseType.OMSORGSPENGER } + assertSame(5, omsorgspenger.size) stopKoin() } @@ -80,9 +81,8 @@ class StatistikkRepositoryTest : KoinTest { it } val hentFerdigstilte = statistikkRepository.hentFerdigstilteOgNyeHistorikkMedYtelsetypeSiste8Uker() - val omsorgspenger = hentFerdigstilte.reversed().take(30).filter { it.fagsakYtelseType == FagsakYtelseType.OMSORGSPENGER } - assert(omsorgspenger.size == 6) - assert(omsorgspenger.find { it.behandlingType == BehandlingType.FORSTEGANGSSOKNAD }?.nye?.size == 1) + val omsorgspenger = hentFerdigstilte.reversed().filter { it.fagsakYtelseType == FagsakYtelseType.OMSORGSPENGER } + assertSame(1, omsorgspenger.find { it.behandlingType == BehandlingType.FORSTEGANGSSOKNAD }?.nye?.size ) } }