Skip to content

Commit

Permalink
Merge pull request #771 from navikt/testprodusent/endrePåminnelseOppgave
Browse files Browse the repository at this point in the history
Testprodusent/endre påminnelse oppgave
  • Loading branch information
anderslysne authored Oct 30, 2024
2 parents 404ddd1 + 9e0da09 commit a4009f9
Show file tree
Hide file tree
Showing 31 changed files with 3,256 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -755,6 +755,7 @@ class BrukerRepositoryImpl(
is HendelseModel.KalenderavtaleOppdatert -> oppdaterModellEtterKalenderavtaleOppdatert(hendelse)
is NesteStegSak -> oppdaterModellEtterNesteStegSak(hendelse)
is TilleggsinformasjonSak -> oppdaterModellEtterTilleggsinformasjonSak(hendelse)
is HendelseModel.OppgavePåminnelseEndret -> Unit
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,17 @@ class DataproduktModel(
setPåminnelseFelter(hendelse.påminnelse)
uuid(hendelse.notifikasjonId)
}

if (hendelse.påminnelse != null) {
opprettVarselBestilling(
notifikasjonId = hendelse.notifikasjonId,
produsentId = hendelse.produsentId,
merkelapp = hendelse.merkelapp ?: "?",
eksterneVarsler = hendelse.påminnelse.eksterneVarsler,
opprinnelse = "FristUtsatt.påminnelse",
statusUtsending = "UTSENDING_IKKE_AVGJORT",
)
}
}

is TilleggsinformasjonSak -> {
Expand Down Expand Up @@ -622,6 +633,19 @@ class DataproduktModel(
statusUtsending = "UTSENDING_BESTILT",
)
}

is HendelseModel.OppgavePåminnelseEndret -> {
if (hendelse.påminnelse != null) {
opprettVarselBestilling(
notifikasjonId = hendelse.notifikasjonId,
produsentId = hendelse.produsentId,
merkelapp = hendelse.merkelapp ?: "?", // bakoverkompabilitet, glemte å legge til merkelapp før hendelser ble registrert i dev
eksterneVarsler = hendelse.påminnelse.eksterneVarsler,
opprinnelse = "OppgavePåminnelseEndret.påminnelse",
statusUtsending = "UTSENDING_IKKE_AVGJORT",
)
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ class EksternVarslingRepository(
is NesteStegSak -> Unit
is TilleggsinformasjonSak -> Unit
is FristUtsatt -> Unit
is HendelseModel.OppgavePåminnelseEndret -> Unit
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,7 @@ object HendelseModel {
override val produsentId: String,
override val kildeAppNavn: String,
val notifikasjonId: UUID,
val merkelapp: String?,
val fristEndretTidspunkt: Instant,
val frist: LocalDate,
valminnelse: Påminnelse?,
Expand Down Expand Up @@ -607,6 +608,23 @@ object HendelseModel {
override val aggregateId: UUID = notifikasjonId
}

@JsonTypeName("OppgavePaaminnelseEndret")
data class OppgavePåminnelseEndret(
override val virksomhetsnummer: String,
override val hendelseId: UUID,
override val produsentId: String,
override val kildeAppNavn: String,
val notifikasjonId: UUID,
val merkelapp: String?,
val frist: LocalDate?,
val oppgaveOpprettetTidspunkt: Instant,
valminnelse: Påminnelse?,
val idempotenceKey: String?,
) : Hendelse(){
@JsonIgnore
override val aggregateId: UUID = notifikasjonId
}

@JsonTypeName("SoftDelete")
data class SoftDelete(
override val virksomhetsnummer: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package no.nav.arbeidsgiver.notifikasjon.infrastruktur.kafka

import com.fasterxml.jackson.core.JsonParseException
import com.fasterxml.jackson.core.JsonProcessingException
import com.fasterxml.jackson.databind.JsonMappingException
import io.micrometer.core.instrument.Counter
import io.micrometer.core.instrument.Tag
import io.micrometer.core.instrument.Tags
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package no.nav.arbeidsgiver.notifikasjon.kafka_reaper

import com.typesafe.config.ConfigException.Null
import no.nav.arbeidsgiver.notifikasjon.hendelse.HendelseModel
import no.nav.arbeidsgiver.notifikasjon.hendelse.HendelseModel.BeskjedOpprettet
import no.nav.arbeidsgiver.notifikasjon.hendelse.HendelseModel.BrukerKlikket
Expand Down Expand Up @@ -166,4 +165,5 @@ val Hendelse.typeNavn: String
is KalenderavtaleOppdatert -> "KalenderavtaleOppdatert"
is NesteStegSak -> "NesteStegSak"
is TilleggsinformasjonSak -> "TillegsinformasjonSak"
is HendelseModel.OppgavePåminnelseEndret -> "OppgavePåminnelseEndret"
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class KafkaReaperServiceImpl(
is FristUtsatt,
is EksterntVarselFeilet,
is EksterntVarselKansellert,
is HendelseModel.OppgavePåminnelseEndret,
is EksterntVarselVellykket -> {
if (kafkaReaperModel.erSlettet(hendelse.aggregateId)) {
kafkaProducer.tombstone(
Expand All @@ -70,6 +71,7 @@ class KafkaReaperServiceImpl(
kafkaReaperModel.fjernRelasjon(hendelse.hendelseId)
} else Unit
}

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ class ManueltVedlikeholdService(
is HendelseModel.FristUtsatt,
is HendelseModel.NesteStegSak,
is HendelseModel.TilleggsinformasjonSak,
is HendelseModel.OppgavePåminnelseEndret,
is HendelseModel.SoftDelete -> Unit

}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ class ProdusentRepositoryImpl(
is KalenderavtaleOppdatert -> oppdaterModellEtterKalenderavtaleOppdatert(hendelse)
is NesteStegSak -> oppdaterModellEtterNesteStegSak(hendelse)
is HendelseModel.TilleggsinformasjonSak -> oppdaterModellEtterTillegsinformasjonSak(hendelse)
is HendelseModel.OppgavePåminnelseEndret -> oppdaterModellEtterOppgavePåminnelseEndret(hendelse)
}
}

Expand Down Expand Up @@ -1023,4 +1024,21 @@ class ProdusentRepositoryImpl(
}
}
}
private suspend fun oppdaterModellEtterOppgavePåminnelseEndret(hendelse: HendelseModel.OppgavePåminnelseEndret) {
database.transaction {
if (hendelse.idempotenceKey != null) {
executeUpdate(
"""
insert into notifikasjon_oppdatering(
hendelse_id, notifikasjon_id, idempotence_key
) values (?, ?, ?) on conflict(hendelse_id) do nothing;
"""
) {
uuid(hendelse.hendelseId)
uuid(hendelse.notifikasjonId)
text(hendelse.idempotenceKey)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ internal sealed class Error {
MutationNyStatusSak.NyStatusSakResultat,
MutationNesteStegSak.NesteStegSakResultat,
MutationKalenderavtale.OppdaterKalenderavtaleResultat,
MutationTilleggsinformasjonSak.TilleggsinformasjonSakResultat
MutationTilleggsinformasjonSak.TilleggsinformasjonSakResultat,
MutationOppgavePåminnelse.OppgaveEndrePaaminnelseResultat


@JsonTypeName("UkjentProdusent")
Expand All @@ -59,7 +60,8 @@ internal sealed class Error {
MutationNyStatusSak.NyStatusSakResultat,
MutationNesteStegSak.NesteStegSakResultat,
MutationKalenderavtale.OppdaterKalenderavtaleResultat,
MutationTilleggsinformasjonSak.TilleggsinformasjonSakResultat
MutationTilleggsinformasjonSak.TilleggsinformasjonSakResultat,
MutationOppgavePåminnelse.OppgaveEndrePaaminnelseResultat

@JsonTypeName("UgyldigMottaker")
data class UgyldigMottaker(
Expand Down Expand Up @@ -112,7 +114,8 @@ internal sealed class Error {
MutationSoftDeleteNotifikasjon.SoftDeleteNotifikasjonResultat,
MutationHardDeleteNotifikasjon.HardDeleteNotifikasjonResultat,
QueryNotifikasjoner.HentNotifikasjonResultat,
MutationKalenderavtale.OppdaterKalenderavtaleResultat
MutationKalenderavtale.OppdaterKalenderavtaleResultat,
MutationOppgavePåminnelse.OppgaveEndrePaaminnelseResultat

@JsonTypeName("UkjentRolle")
data class UkjentRolle(
Expand All @@ -128,7 +131,8 @@ internal sealed class Error {
) :
Error(),
MutationNyOppgave.NyOppgaveResultat,
MutationOppgaveUtsettFrist.OppgaveUtsettFristResultat
MutationOppgaveUtsettFrist.OppgaveUtsettFristResultat,
MutationOppgavePåminnelse.OppgaveEndrePaaminnelseResultat

@JsonTypeName("SakFinnesIkke")
data class SakFinnesIkke(
Expand All @@ -146,7 +150,8 @@ internal sealed class Error {
data class OppgavenErAlleredeUtfoert(
override val feilmelding: String,
): Error(),
MutationOppgaveUtgaatt.OppgaveUtgaattResultat
MutationOppgaveUtgaatt.OppgaveUtgaattResultat,
MutationOppgavePåminnelse.OppgaveEndrePaaminnelseResultat

@JsonTypeName("UgyldigKalenderavtale")
data class UgyldigKalenderavtale(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package no.nav.arbeidsgiver.notifikasjon.produsent.api

import com.fasterxml.jackson.annotation.JsonTypeInfo
import com.fasterxml.jackson.annotation.JsonTypeName
import graphql.schema.idl.RuntimeWiring
import no.nav.arbeidsgiver.notifikasjon.hendelse.HendelseModel
import no.nav.arbeidsgiver.notifikasjon.infrastruktur.graphql.*
import no.nav.arbeidsgiver.notifikasjon.produsent.ProdusentModel
import no.nav.arbeidsgiver.notifikasjon.produsent.ProdusentRepository
import java.time.OffsetDateTime
import java.util.*

internal class MutationOppgavePåminnelse(
private val hendelseDispatcher: HendelseDispatcher,
private val produsentRepository: ProdusentRepository,
) {

fun wire(runtime: RuntimeWiring.Builder) {
runtime.resolveSubtypes<OppgaveEndrePaaminnelseResultat>()

runtime.wire("Mutation") {
coDataFetcher("oppgaveEndrePaaminnelse") { env ->
oppgaveEndrePaaminnelse(
context = env.notifikasjonContext(),
idempotenceKey = env.getTypedArgumentOrNull<String>("idempotencyKey"),
notifikasjon = hentNotifikasjon(
produsentRepository,
id = env.getTypedArgument<UUID>("id")
) { error -> return@coDataFetcher error },
paaminnelse = env.getTypedArgumentOrNull<PaaminnelseInput>("paaminnelse"),
)
}
coDataFetcher("oppgaveEndrePaaminnelseByEksternId") { env ->
oppgaveEndrePaaminnelse(
context = env.notifikasjonContext(),
idempotenceKey = env.getTypedArgumentOrNull<String>("idempotencyKey"),
notifikasjon = hentNotifikasjon(
produsentRepository,
eksternId = env.getTypedArgument<String>("eksternId"),
merkelapp = env.getTypedArgument<String>("merkelapp")
) { error -> return@coDataFetcher error },
paaminnelse = env.getTypedArgumentOrNull<PaaminnelseInput>("paaminnelse"),
)
}
}
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "__typename")
sealed interface OppgaveEndrePaaminnelseResultat

@JsonTypeName("OppgaveEndrePaaminnelseVellykket")
data class OppgaveEndrePaaminnelseVellykket(
val id: UUID
) : OppgaveEndrePaaminnelseResultat

private suspend fun oppgaveEndrePaaminnelse(
context: ProdusentAPI.Context,
idempotenceKey: String?,
notifikasjon: ProdusentModel.Notifikasjon,
paaminnelse: PaaminnelseInput?,
) : OppgaveEndrePaaminnelseResultat {
if (notifikasjon !is ProdusentModel.Oppgave) {
return Error.NotifikasjonFinnesIkke("Notifikasjonen (id ${notifikasjon.id}) er ikke en oppgave")
}

val produsent = hentProdusent(context) { error -> return error }

tilgangsstyrMerkelapp(produsent, notifikasjon.merkelapp) { error -> return error }

idempotenceKey?.let {
if (produsentRepository.notifikasjonOppdateringFinnes(notifikasjon.id, it)) {
return OppgaveEndrePaaminnelseVellykket(notifikasjon.id)
}
}

try {
hendelseDispatcher.send(
HendelseModel.OppgavePåminnelseEndret(
hendelseId = UUID.randomUUID(),
notifikasjonId = notifikasjon.id,
merkelapp = notifikasjon.merkelapp,
virksomhetsnummer = notifikasjon.virksomhetsnummer,
produsentId = produsent.id,
kildeAppNavn = context.appName,
påminnelse = paaminnelse?.tilDomene(
opprettetTidspunkt = OffsetDateTime.now(),
frist = notifikasjon.frist,
startTidspunkt = null,
virksomhetsnummer = notifikasjon.virksomhetsnummer,
),
frist = notifikasjon.frist,
oppgaveOpprettetTidspunkt = notifikasjon.opprettetTidspunkt.toInstant(),
idempotenceKey = idempotenceKey
)
)
} catch (e: UgyldigPåminnelseTidspunktException) {
return Error.UgyldigPåminnelseTidspunkt(e.message!!)
}

return OppgaveEndrePaaminnelseVellykket(notifikasjon.id)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ internal class MutationOppgaveUtsettFrist(
FristUtsatt(
hendelseId = UUID.randomUUID(),
notifikasjonId = notifikasjon.id,
merkelapp = notifikasjon.merkelapp,
virksomhetsnummer = notifikasjon.virksomhetsnummer,
produsentId = produsent.id,
kildeAppNavn = context.appName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ object ProdusentAPI {
MutationKalenderavtale(hendelseDispatcher, produsentRepository).wire(this)
MutationNesteStegSak(hendelseDispatcher, produsentRepository).wire(this)
MutationTilleggsinformasjonSak(hendelseDispatcher, produsentRepository).wire(this)
MutationOppgavePåminnelse(hendelseDispatcher, produsentRepository).wire(this)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,9 @@ class ReplayValidatorService(
is HendelseModel.SoftDelete,
is HendelseModel.NesteStegSak,
is HendelseModel.TilleggsinformasjonSak,
is HendelseModel.OppgavePåminnelseEndret,
is HendelseModel.NyStatusSak -> Unit

}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,9 @@ class SkedulertHardDeleteRepositoryImpl(
is HendelseModel.BrukerKlikket,
is HendelseModel.PåminnelseOpprettet,
is HendelseModel.FristUtsatt,
is HendelseModel.OppgavePåminnelseEndret,
is HendelseModel.SoftDelete -> Unit

}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,34 @@ class SkedulertPåminnelseRepository : AutoCloseable {
)
}
}

is HendelseModel.OppgavePåminnelseEndret -> database.useTransaction {
markerPåminnelserLukket(notifikasjonId = hendelse.notifikasjonId)
when(hentOppgavetilstand(hendelse.notifikasjonId)){
NOTIFIKASJON_AKTIV -> {
bestillPåminnelse(
hendelse = hendelse,
påminnelse = hendelse.påminnelse,
frist = hendelse.frist,
startTidspunkt = null,
/**
* I mangel av at vi ikke har noen god måte å vite når eksisterende frist ble opprettet, i tillegg til
* at feltet fristOpprettetTidspunkt ikke ser ut til å blir brukt noe sted, har vi valgt å sette dette feltet til tidspunktet når oppgaven ble opprettet.
* Dersom man ønsker å sette dette korrekt, vil en løsning være å persistere fristOpprettetTidspunkt i produsent apiet, og populere det gjennom OppgavePåminnelseEndret hendelsen.
*/
fristOpprettetTidspunkt = hendelse.oppgaveOpprettetTidspunkt,
)
}

OPPGAVE_UTFØRT,
KALENDERAVTALE_AVLYST,
NOTIFIKASJON_SLETTET,
null -> {
/* noop */
}
}
}

is HendelseModel.NesteStegSak,
is HendelseModel.TilleggsinformasjonSak,
is HendelseModel.BeskjedOpprettet,
Expand All @@ -263,6 +291,7 @@ class SkedulertPåminnelseRepository : AutoCloseable {
is HendelseModel.EksterntVarselFeilet,
is HendelseModel.EksterntVarselKansellert,
is HendelseModel.EksterntVarselVellykket -> Unit

}
}

Expand Down
Loading

0 comments on commit a4009f9

Please sign in to comment.