From 0b66d243321e88e7cd315b3b31fa26e80777d045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rnar=20Askevold?= <43171873+baskevold@users.noreply.github.com> Date: Thu, 1 Aug 2024 15:46:02 +0200 Subject: [PATCH] =?UTF-8?q?Setter=20skjerming=20ved=20lagring=20av=20oppga?= =?UTF-8?q?vek=C3=B8er=20(#2263)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Setter skjerming ved lagring av oppgavekøer for å redusere risiko ved fremtidig utrulling av funksjonalitet * Migreringskollisjon * Default not null * Migreringskollisjon --- .../los/nyoppgavestyring/ko/OppgaveKoApis.kt | 3 +- .../nyoppgavestyring/ko/OppgaveKoTjeneste.kt | 4 +- .../ko/db/OppgaveKoRepository.kt | 54 +++++++++++-------- .../V1.0_0066__oppgaveko_skjermet.sql | 1 + .../k9saktillosadapter/K9SakTilLosIT.kt | 2 +- .../K9TilbakeTilLosIT.kt | 2 +- .../los/nyoppgavestyring/ko/OppgaveKoTest.kt | 8 +-- 7 files changed, 42 insertions(+), 32 deletions(-) create mode 100644 src/main/resources/migreringer/V1.0_0066__oppgaveko_skjermet.sql diff --git a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoApis.kt b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoApis.kt index 13a828660..da00c2d21 100644 --- a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoApis.kt +++ b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoApis.kt @@ -65,7 +65,8 @@ fun Route.OppgaveKoApis() { if (!pepClient.erOppgaveStyrer()) { call.respond(HttpStatusCode.Forbidden) } - call.respond(oppgaveKoRepository.leggTil(opprettOppgaveKoDto.tittel)) + val harSkjermetTilgang = pepClient.harTilgangTilKode6() + call.respond(oppgaveKoRepository.leggTil(opprettOppgaveKoDto.tittel, skjermet = harSkjermetTilgang)) } } diff --git a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoTjeneste.kt b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoTjeneste.kt index 76455f09b..875fdbd4d 100644 --- a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoTjeneste.kt +++ b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoTjeneste.kt @@ -47,8 +47,8 @@ class OppgaveKoTjeneste( ) { private val log = LoggerFactory.getLogger(OppgaveKoTjeneste::class.java) - fun hentOppgavekøer(): List { - return oppgaveKoRepository.hentListe() + fun hentOppgavekøer(skjermet: Boolean = false): List { + return oppgaveKoRepository.hentListe(skjermet) } suspend fun hentOppgaverFraKø( diff --git a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/db/OppgaveKoRepository.kt b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/db/OppgaveKoRepository.kt index 98519d944..2a7411483 100644 --- a/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/db/OppgaveKoRepository.kt +++ b/src/main/kotlin/no/nav/k9/los/nyoppgavestyring/ko/db/OppgaveKoRepository.kt @@ -1,7 +1,6 @@ package no.nav.k9.los.nyoppgavestyring.ko.db import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import kotliquery.* import no.nav.k9.los.nyoppgavestyring.ko.dto.OppgaveKo import no.nav.k9.los.nyoppgavestyring.query.dto.query.* @@ -24,16 +23,18 @@ class OppgaveKoRepository(val datasource: DataSource) { objectMapper.writeValueAsString(standardOppgaveQuery) } - fun hentListe(): List { + fun hentListe(medSkjermet: Boolean = false): List { return using(sessionOf(datasource)) { - it.transaction { tx -> hentListe(tx) } + it.transaction { tx -> hentListe(tx, medSkjermet) } } } - fun hentListe(tx: TransactionalSession): List { + fun hentListe(tx: TransactionalSession, skjermet: Boolean = false): List { return tx.run( queryOf( - "SELECT id, versjon, tittel, beskrivelse, query, fritt_valg_av_oppgave, endret_tidspunkt FROM OPPGAVEKO_V3" + """SELECT id, versjon, tittel, beskrivelse, query, fritt_valg_av_oppgave, endret_tidspunkt, skjermet + FROM OPPGAVEKO_V3 WHERE skjermet = :medSkjermet""", + mapOf("medSkjermet" to skjermet) ).map { row -> row.tilOppgaveKo(objectMapper, tx) }.asList ) @@ -41,18 +42,21 @@ class OppgaveKoRepository(val datasource: DataSource) { fun hent(oppgaveKoId: Long): OppgaveKo { return using(sessionOf(datasource)) { - it.transaction { tx -> hent(tx, oppgaveKoId) } + it.transaction { tx -> hent(tx, oppgaveKoId).first } } } - fun hent(tx: TransactionalSession, oppgaveKoId: Long): OppgaveKo { + fun hent(tx: TransactionalSession, oppgaveKoId: Long, skjermet: Boolean = false): Pair { return tx.run( queryOf( - "SELECT id, versjon, tittel, beskrivelse, query, fritt_valg_av_oppgave, endret_tidspunkt FROM OPPGAVEKO_V3 WHERE id = :id", + """SELECT id, versjon, tittel, beskrivelse, query, fritt_valg_av_oppgave, endret_tidspunkt, skjermet + FROM OPPGAVEKO_V3 + WHERE id = :id AND skjermet = :skjermet""", mapOf( - "id" to oppgaveKoId + "id" to oppgaveKoId, + "skjermet" to skjermet ) - ).map { it.tilOppgaveKo(objectMapper, tx) }.asSingle + ).map { it.tilOppgaveKo(objectMapper, tx) to it.boolean("skjermet")}.asSingle ) ?: throw IllegalStateException("Feil ved henting av oppgavekø: $oppgaveKoId") } @@ -69,26 +73,27 @@ class OppgaveKoRepository(val datasource: DataSource) { ) } - fun leggTil(tittel: String): OppgaveKo { + fun leggTil(tittel: String, skjermet: Boolean): OppgaveKo { return using(sessionOf(datasource)) { it -> - it.transaction { tx -> leggTil(tx, tittel) } + it.transaction { tx -> leggTil(tx, tittel, skjermet) } } } - fun leggTil(tx: TransactionalSession, tittel: String): OppgaveKo { + fun leggTil(tx: TransactionalSession, tittel: String, skjermet: Boolean): OppgaveKo { val oppgaveKoId = tx.run( queryOf( """ - INSERT INTO OPPGAVEKO_V3 (versjon, tittel, beskrivelse, query, fritt_valg_av_oppgave, endret_tidspunkt) - VALUES (0, :tittel, '', :query, false, :endret_tidspunkt) RETURNING ID""", + INSERT INTO OPPGAVEKO_V3 (versjon, tittel, beskrivelse, query, fritt_valg_av_oppgave, endret_tidspunkt, skjermet) + VALUES (0, :tittel, '', :query, false, :endret_tidspunkt, :skjermet) RETURNING ID""", mapOf( "tittel" to tittel, "query" to standardOppgaveString, - "endret_tidspunkt" to LocalDateTime.now() + "endret_tidspunkt" to LocalDateTime.now(), + "skjermet" to skjermet ) ).map { row -> row.long(1) }.asSingle ) ?: throw IllegalStateException("Feil ved opprettelse av ny oppgavekø.") - return hent(tx, oppgaveKoId); + return hent(tx, oppgaveKoId).first } fun endre(oppgaveKo: OppgaveKo): OppgaveKo { @@ -133,26 +138,29 @@ class OppgaveKoRepository(val datasource: DataSource) { lagreKoSaksbehandlere(tx, oppgaveKo) - return hent(tx, oppgaveKo.id) + return hent(tx, oppgaveKo.id).first } fun hentKoerMedOppgittSaksbehandler( tx: TransactionalSession, - saksbehandler_epost: String + saksbehandler_epost: String, + skjermet: Boolean = false ): List { return tx.run( queryOf( """ select id, versjon, tittel, beskrivelse, query, fritt_valg_av_oppgave, endret_tidspunkt from OPPGAVEKO_V3 ko - where exists ( + where skjermet = :skjermet AND + exists ( select * from oppgaveko_saksbehandler s where s.oppgaveko_v3_id = ko.id and s.saksbehandler_epost = lower(:saksbehandler_epost) )""", mapOf( - "saksbehandler_epost" to saksbehandler_epost + "saksbehandler_epost" to saksbehandler_epost, + "skjermet" to skjermet ) ).map { row -> OppgaveKo( @@ -237,8 +245,8 @@ class OppgaveKoRepository(val datasource: DataSource) { taMedQuery: Boolean, taMedSaksbehandlere: Boolean ): OppgaveKo { - val gammelOppgaveKo = hent(tx, kopierFraOppgaveId) - val nyOppgaveKo = leggTil(tx, tittel) + val (gammelOppgaveKo, skjermet) = hent(tx, kopierFraOppgaveId) + val nyOppgaveKo = leggTil(tx, tittel, skjermet) val oppdatertNyOppgaveko = nyOppgaveKo.copy( oppgaveQuery = if (taMedQuery) gammelOppgaveKo.oppgaveQuery else nyOppgaveKo.oppgaveQuery, diff --git a/src/main/resources/migreringer/V1.0_0066__oppgaveko_skjermet.sql b/src/main/resources/migreringer/V1.0_0066__oppgaveko_skjermet.sql new file mode 100644 index 000000000..e55d74ce0 --- /dev/null +++ b/src/main/resources/migreringer/V1.0_0066__oppgaveko_skjermet.sql @@ -0,0 +1 @@ +ALTER TABLE OPPGAVEKO_V3 ADD COLUMN skjermet BOOLEAN not null default false \ No newline at end of file diff --git a/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/k9saktillos/k9saktillosadapter/K9SakTilLosIT.kt b/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/k9saktillos/k9saktillosadapter/K9SakTilLosIT.kt index 30b581d01..89c2f06f2 100644 --- a/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/k9saktillos/k9saktillosadapter/K9SakTilLosIT.kt +++ b/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/k9saktillos/k9saktillosadapter/K9SakTilLosIT.kt @@ -481,7 +481,7 @@ class K9SakTilLosIT : AbstractK9LosIntegrationTest() { private fun opprettKøFor(saksbehandler: Saksbehandler, oppgaveQuery: OppgaveQuery): OppgaveKo { val oppgaveKoRepository = get() - val nyKø = oppgaveKoRepository.leggTil("Test").copy( + val nyKø = oppgaveKoRepository.leggTil("Test", skjermet = false).copy( saksbehandlere = listOf(saksbehandler.epost), oppgaveQuery = oppgaveQuery ) diff --git a/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/k9tilbaketillos/k9tilbaketillosadapter/K9TilbakeTilLosIT.kt b/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/k9tilbaketillos/k9tilbaketillosadapter/K9TilbakeTilLosIT.kt index 4db41ec07..ebfc172fe 100644 --- a/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/k9tilbaketillos/k9tilbaketillosadapter/K9TilbakeTilLosIT.kt +++ b/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/domeneadaptere/k9/k9tilbaketillos/k9tilbaketillosadapter/K9TilbakeTilLosIT.kt @@ -341,7 +341,7 @@ class K9TilbakeTilLosIT : AbstractK9LosIntegrationTest() { private fun opprettKøFor(saksbehandler: Saksbehandler, oppgaveQuery: OppgaveQuery): OppgaveKo { val oppgaveKoRepository = get() - val nyKø = oppgaveKoRepository.leggTil("Test").copy( + val nyKø = oppgaveKoRepository.leggTil("Test", skjermet = false).copy( saksbehandlere = listOf(saksbehandler.epost), oppgaveQuery = oppgaveQuery ) diff --git a/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoTest.kt b/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoTest.kt index 233a21a77..4acaf68cd 100644 --- a/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoTest.kt +++ b/src/test/kotlin/no/nav/k9/los/nyoppgavestyring/ko/OppgaveKoTest.kt @@ -22,7 +22,7 @@ class OppgaveKoTest : AbstractK9LosIntegrationTest() { fun `sjekker at oppgavekø kan opprettes og slettes`() { val oppgaveKoRepository = OppgaveKoRepository(dataSource) - val oppgaveKo = oppgaveKoRepository.leggTil("Testkø") + val oppgaveKo = oppgaveKoRepository.leggTil("Testkø", skjermet = false) assertThat(oppgaveKo.tittel).isEqualTo("Testkø") val oppgaveKoFraDb = oppgaveKoRepository.hent(oppgaveKo.id) @@ -39,7 +39,7 @@ class OppgaveKoTest : AbstractK9LosIntegrationTest() { val oppgaveKoRepository = OppgaveKoRepository(dataSource) val tittel = "Testkø" - val oppgaveKo = oppgaveKoRepository.leggTil(tittel) + val oppgaveKo = oppgaveKoRepository.leggTil(tittel, skjermet = false) assertThat(oppgaveKo.tittel).isEqualTo(tittel) val beskrivelse = "En god beskrivelse" @@ -54,7 +54,7 @@ class OppgaveKoTest : AbstractK9LosIntegrationTest() { val oppgaveKoRepository = OppgaveKoRepository(dataSource) val tittel = "Testkø" - val oppgaveKo = oppgaveKoRepository.leggTil(tittel) + val oppgaveKo = oppgaveKoRepository.leggTil(tittel, skjermet = false) assertThat(oppgaveKo.tittel).isEqualTo(tittel) val saksbehandlerepost = "a@b" @@ -79,7 +79,7 @@ class OppgaveKoTest : AbstractK9LosIntegrationTest() { val tittel = "Testkø" val saksbehandlerepost = "a@b" - val oppgaveKo = oppgaveKoRepository.leggTil(tittel) + val oppgaveKo = oppgaveKoRepository.leggTil(tittel, skjermet = false) mockLeggTilSaksbehandler(saksbehandlerepost) val gammelOppgaveko = oppgaveKoRepository.endre(oppgaveKo.copy(saksbehandlere = listOf(saksbehandlerepost)))