Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP forslag til workaround #800

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1024,7 +1024,18 @@ class BrukerRepositoryImpl(
insert into sak_status(
id, sak_id, status, overstyrt_statustekst, mottatt_tidspunkt, oppgitt_tidspunkt
)
values (?, ?, ?, ?, ?, ?)
select ?, ?, ?, ?, ?, ?
where exists (
-- ved en partial replay kan det hende at vi spiller av fra etter opprettelse
-- dersom aggregatet er soft deleted så finnes ikke sak'en og det feiler
-- enten kan vi holde styr på hva som er softdeleted, på samme måte som hard delete og aligne disse
-- eller så kan vi droppe statusoppdatering dersom sak'en ikke finnes.
-- vi vet ikke her at saken ikke finnes pga softdelete, så det kan være en litt risky løsning
-- soft og hard delete bør ikke oppføre seg forskjellig, med unntak av at hard delete faktisk sletter data fra kafka via tombstones
-- vi bør også vurdere om vi faktisk trenger både soft og hard delete, det skaper i praksis forvirring både internt og ut mot produsenter
-- TODO: når soft delete og hard delete er alignet kan denne sjekken fjernes
select 1 from sak where sak.id = ?
)
on conflict (id) do update
set
status = excluded.status,
Expand All @@ -1039,6 +1050,7 @@ class BrukerRepositoryImpl(
nullableText(nyStatusSak.overstyrStatustekstMed)
timestamp_with_timezone(nyStatusSak.mottattTidspunkt)
nullableTimestamptz(nyStatusSak.oppgittTidspunkt)
uuid(nyStatusSak.sakId)
}

executeUpdate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,45 @@ class BrukerModelIdempotensTests : DescribeSpec({


}

describe("soft delete på sak kan partially replayes") {
val database = testDatabase(Bruker.databaseConfig)
val brukerRepository = BrukerRepositoryImpl(database)
val merkelapp = "idempotenstest"
val grupperingsid = "gr-42"
val sakId = uuid("42")

val hendelsesforløp = listOf(
brukerRepository.sakOpprettet(
sakId = sakId,
virksomhetsnummer = TEST_VIRKSOMHET_1,
merkelapp = merkelapp,
grupperingsid = grupperingsid,
mottakere = listOf(TEST_MOTTAKER_1, TEST_MOTTAKER_2),
),
brukerRepository.nyStatusSak(
sakId = sakId,
virksomhetsnummer = TEST_VIRKSOMHET_1,
),
HendelseModel.SoftDelete(
hendelseId = UUID.randomUUID(),
virksomhetsnummer = TEST_VIRKSOMHET_1,
aggregateId = sakId,
produsentId = "",
kildeAppNavn = "",
deletedAt = OffsetDateTime.now(),
grupperingsid = grupperingsid,
merkelapp = merkelapp,
).also {
brukerRepository.oppdaterModellEtterHendelse(it)
}
)

// replay events after create
hendelsesforløp.drop(1).forEach {
brukerRepository.oppdaterModellEtterHendelse(it)
}
}
})

private suspend fun DescribeSpecContainerScope.assertDeleted(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ private suspend fun BrukerRepositoryImpl.insertSak(id: String, tekst: String) {
mottattTidspunkt = OffsetDateTime.now(),
)
nyStatusSak(
sak = sak,
virksomhetsnummer = "1",
sakId = sak.sakId,
virksomhetsnummer = sak.virksomhetsnummer,
status = HendelseModel.SakStatus.MOTTATT,
overstyrStatustekstMed = null,
mottattTidspunkt = OffsetDateTime.now(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import no.nav.arbeidsgiver.notifikasjon.hendelse.HendelseModel.OppgaveUtgått
import no.nav.arbeidsgiver.notifikasjon.hendelse.HendelseModel.Påminnelse
import no.nav.arbeidsgiver.notifikasjon.hendelse.HendelseModel.SakStatus
import no.nav.arbeidsgiver.notifikasjon.infrastruktur.altinn.AltinnTilgang
import no.nav.arbeidsgiver.notifikasjon.produsent.api.IdempotenceKey
import java.time.Instant
import java.time.LocalDate
import java.time.LocalDateTime
Expand Down Expand Up @@ -416,7 +417,7 @@ suspend fun BrukerRepository.nyStatusSak(
idempotensKey: String,
hardDelete: HardDeleteUpdate? = null,
nyLenkeTilSak: String? = null,
) = NyStatusSak(
) = nyStatusSak(
hendelseId = hendelseId,
virksomhetsnummer = virksomhetsnummer,
produsentId = produsentId,
Expand All @@ -433,6 +434,36 @@ suspend fun BrukerRepository.nyStatusSak(
oppdaterModellEtterHendelse(it)
}

suspend fun BrukerRepository.nyStatusSak(
sakId: UUID,
virksomhetsnummer: String,
hendelseId: UUID = UUID.randomUUID(),
produsentId: String = randomProdusentId(),
kildeAppNavn: String = randomKildeAppNavn(),
status: SakStatus = randomSakStatus(),
overstyrStatustekstMed: String? = null,
oppgittTidspunkt: OffsetDateTime? = null,
mottattTidspunkt: OffsetDateTime = OffsetDateTime.now(),
idempotensKey: String = IdempotenceKey.initial(),
hardDelete: HardDeleteUpdate? = null,
nyLenkeTilSak: String? = null,
) = NyStatusSak(
hendelseId = hendelseId,
virksomhetsnummer = virksomhetsnummer,
produsentId = produsentId,
kildeAppNavn = kildeAppNavn,
sakId = sakId,
status = status,
overstyrStatustekstMed = overstyrStatustekstMed,
oppgittTidspunkt = oppgittTidspunkt,
mottattTidspunkt = mottattTidspunkt,
idempotensKey = idempotensKey,
hardDelete = hardDelete,
nyLenkeTilSak = nyLenkeTilSak,
).also {
oppdaterModellEtterHendelse(it)
}

suspend fun BrukerRepository.nesteStegSak(
sak: HendelseModel.SakOpprettet,
hendelseId: UUID = UUID.randomUUID(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,10 +110,10 @@ class HardDeleteTests : DescribeSpec({
virksomhetsnummer = mottaker.virksomhetsnummer,
)
suspend fun opprettStatusEvent(sak: HendelseModel.SakOpprettet) = brukerRepository.nyStatusSak(
sak,
virksomhetsnummer = mottaker.virksomhetsnummer,
idempotensKey = IdempotenceKey.initial(),
sakId = sak.sakId,
virksomhetsnummer = sak.virksomhetsnummer,
status = HendelseModel.SakStatus.MOTTATT,
idempotensKey = IdempotenceKey.initial(),
)

val hardDeleteEvent = HardDelete(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ class NyLenkeTilSakTests : DescribeSpec({
)

brukerRepository.nyStatusSak(
sak = sakOpprettet,
sakId = sakOpprettet.sakId,
virksomhetsnummer = sakOpprettet.virksomhetsnummer,
idempotensKey = IdempotenceKey.initial(),
)

Expand All @@ -51,7 +52,8 @@ class NyLenkeTilSakTests : DescribeSpec({
}

brukerRepository.nyStatusSak(
sak = sakOpprettet,
sakId = sakOpprettet.sakId,
virksomhetsnummer = sakOpprettet.virksomhetsnummer,
idempotensKey = IdempotenceKey.userSupplied("20202021"),
nyLenkeTilSak = "#bar",
oppgittTidspunkt = OffsetDateTime.parse("2020-01-01T12:00:00Z"),
Expand All @@ -66,7 +68,8 @@ class NyLenkeTilSakTests : DescribeSpec({
}

brukerRepository.nyStatusSak(
sak = sakOpprettet,
sakId = sakOpprettet.sakId,
virksomhetsnummer = sakOpprettet.virksomhetsnummer,
idempotensKey = IdempotenceKey.userSupplied("123"),
nyLenkeTilSak = null,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,16 +141,16 @@ private suspend fun BrukerRepository.opprettSak(
tilleggsinformasjon = null
)
nyStatusSak(
sak = sak,
hendelseId = UUID.randomUUID(),
sakId = sak.sakId,
virksomhetsnummer = sak.virksomhetsnummer,
hendelseId = UUID.randomUUID(),
produsentId = sak.produsentId,
kildeAppNavn = sak.kildeAppNavn,
status = MOTTATT,
overstyrStatustekstMed = "noe",
oppgittTidspunkt = null,
mottattTidspunkt = oppgittTidspunkt,
idempotensKey = IdempotenceKey.initial(),
oppgittTidspunkt = null,
hardDelete = null,
nyLenkeTilSak = null,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,9 +249,9 @@ private suspend fun BrukerRepository.opprettSak(
tilleggsinformasjon = null
)
nyStatusSak(
sak = sakOpprettet,
hendelseId = UUID.randomUUID(),
sakId = sakOpprettet.sakId,
virksomhetsnummer = sakOpprettet.virksomhetsnummer,
hendelseId = UUID.randomUUID(),
produsentId = sakOpprettet.produsentId,
kildeAppNavn = sakOpprettet.kildeAppNavn,
status = MOTTATT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,9 @@ private suspend fun BrukerRepository.opprettSak(
hardDelete = null,
).let { sakOpprettet ->
nyStatusSak(
sakOpprettet,
sakOpprettet.sakId,
sakOpprettet.virksomhetsnummer,
hendelseId = UUID.randomUUID(),
virksomhetsnummer = "1",
produsentId = "1",
kildeAppNavn = "1",
status = HendelseModel.SakStatus.MOTTATT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,9 @@ private suspend fun BrukerRepository.opprettOppgave(
)

private suspend fun BrukerRepository.opprettStatus(sak: HendelseModel.SakOpprettet) = nyStatusSak(
sak = sak,
sakId = sak.sakId,
virksomhetsnummer = sak.virksomhetsnummer,
hendelseId = UUID.randomUUID(),
virksomhetsnummer = "1",
produsentId = "1",
kildeAppNavn = "1",
status = HendelseModel.SakStatus.MOTTATT,
Expand Down
Loading