Skip to content

Commit

Permalink
♻️ Hindre tilgang til personer som skal holdes igjen
Browse files Browse the repository at this point in the history
Co-authored-by: Øydis Kind Refsum <[email protected]>
  • Loading branch information
chsko and oydisrefsum committed Oct 31, 2024
1 parent d0f9046 commit c2adfba
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import no.nav.helse.spesialist.api.graphql.schema.Person
import no.nav.helse.spesialist.api.saksbehandler.SaksbehandlerFraApi
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.util.UUID

private sealed interface Inputvalidering {
class Ok(valdselsnummer: String) : Inputvalidering
Expand All @@ -41,6 +42,11 @@ interface PersonoppslagService {
tilganger: SaksbehandlerTilganger,
): FetchPersonResult

fun personSkalHoldesIgjen(
dselsnummer: String,
saksbehandlerOid: UUID,
): Boolean

fun finnesPersonMedFødselsnummer(fødselsnummer: String): Boolean

fun fødselsnumreKnyttetTil(aktørId: String): Set<String>
Expand Down Expand Up @@ -85,6 +91,12 @@ class PersonQuery(
}
sikkerLogg.info("Personoppslag på fnr=$fødselsnummer")

// Skal ikke kunne slå opp personer som holdes igjen på grunn av replikeringsfeil
val saksbehandler = env.graphQlContext.get<SaksbehandlerFraApi>(SAKSBEHANDLER)
if (personoppslagService.personSkalHoldesIgjen(fødselsnummer, saksbehandler.oid)) {
return forbiddenError(fødselsnummer).tilGraphqlResult()
}

val tilganger = env.graphQlContext.get<SaksbehandlerTilganger>(TILGANGER)

return when (val result = personoppslagService.hentPerson(fødselsnummer, tilganger)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,22 @@ import no.nav.helse.db.MedDataSource
import no.nav.helse.db.QueryRunner
import no.nav.helse.spesialist.api.vedtaksperiode.EnhetDto
import java.time.LocalDateTime
import java.util.UUID
import javax.sql.DataSource

class PersonApiDao(dataSource: DataSource) : QueryRunner by MedDataSource(dataSource) {
fun skalHoldesIgjen(
dselsnummer: String,
saksbehandlerOid: UUID,
): Boolean {
return asSQL(
"""SELECT true FROM person_som_skal_holdes_igjen WHERE fodselsnummer = :fodselsnummer AND NOT (:oid = ANY(oider_som_kan_sla_opp))""",
"fodselsnummer" to fødselsnummer, "oid" to saksbehandlerOid,
).singleOrNull {
it.boolean(1)
} ?: false
}

fun personKlargjøres(fødselsnummer: String) {
asSQL(
"INSERT INTO person_klargjores(fødselsnummer, opprettet) VALUES(:fodselsnummer, :opprettet) ON CONFLICT DO NOTHING",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import no.nav.helse.spesialist.api.varsel.ApiVarselRepository
import no.nav.helse.spesialist.api.vergemål.VergemålApiDao
import no.nav.helse.spleis.graphql.hentsnapshot.GraphQLPerson
import org.slf4j.LoggerFactory
import java.util.UUID

private sealed interface HentSnapshotResult {
class Ok(val snapshot: Pair<Personinfo, GraphQLPerson>) : HentSnapshotResult
Expand Down Expand Up @@ -108,6 +109,15 @@ class PersonService(
return person(fødselsnummer, snapshot, tilganger, reservasjon)
}

override fun personSkalHoldesIgjen(
dselsnummer: String,
saksbehandlerOid: UUID,
): Boolean =
personApiDao.skalHoldesIgjen(
fødselsnummer,
saksbehandlerOid,
)

private fun person(
dselsnummer: String,
snapshot: Pair<Personinfo, GraphQLPerson>,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package no.nav.helse.spesialist.api.person

import kotliquery.queryOf
import kotliquery.sessionOf
import no.nav.helse.spesialist.api.DatabaseIntegrationTest
import no.nav.helse.spesialist.api.person.Adressebeskyttelse.Ugradert
import no.nav.helse.spesialist.test.lagFødselsnummer
import org.intellij.lang.annotations.Language
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import java.time.LocalDateTime
import java.util.UUID

internal class PersonApiDaoTest : DatabaseIntegrationTest() {

Expand All @@ -15,6 +21,22 @@ internal class PersonApiDaoTest : DatabaseIntegrationTest() {
assertTrue(personApiDao.personHarAdressebeskyttelse(FØDSELSNUMMER, Adressebeskyttelse.Fortrolig))
}

@Test
fun `person skal holdes igjen`() {
val fødselsnummer = lagFødselsnummer()
opprettPersonSomSkalHoldesIgjen(fødselsnummer)
assertTrue(personApiDao.skalHoldesIgjen(fødselsnummer, UUID.randomUUID()))
}

@Test
fun `person skal ikke holdes igjen hvis saksbehandler har fått tilgang eksplisitt`() {
val fødselsnummer = lagFødselsnummer()
opprettPersonSomSkalHoldesIgjen(fødselsnummer)
val saksbehandlerOid = UUID.randomUUID()
giSaksbehandlerTilgangTilPersonSomHoldesIgjen(fødselsnummer, saksbehandlerOid)
assertFalse(personApiDao.skalHoldesIgjen(fødselsnummer, saksbehandlerOid))
}

@Test
fun `person med ugradert adresse er ikke kode 7`() {
opprettPerson(adressebeskyttelse = Ugradert)
Expand Down Expand Up @@ -84,6 +106,22 @@ internal class PersonApiDaoTest : DatabaseIntegrationTest() {
assertTrue(personApiDao.klargjøringPågår(FØDSELSNUMMER))
}

private fun opprettPersonSomSkalHoldesIgjen(fødselsnummer: String) {
@Language("PostgreSQL")
val query = """INSERT INTO person_som_skal_holdes_igjen(fodselsnummer, opprettet) VALUES (:fodselsnummer, :opprettet)"""
sessionOf(dataSource).use { session ->
session.run(queryOf(query, mapOf("fodselsnummer" to fødselsnummer, "opprettet" to LocalDateTime.now())).asExecute)
}
}

private fun giSaksbehandlerTilgangTilPersonSomHoldesIgjen(fødselsnummer: String, saksbehandlerOid: UUID) {
@Language("PostgreSQL")
val query = """UPDATE person_som_skal_holdes_igjen SET oider_som_kan_sla_opp = ARRAY[:oid] WHERE fodselsnummer = :fodselsnummer"""
sessionOf(dataSource).use { session ->
session.run(queryOf(query, mapOf("fodselsnummer" to fødselsnummer, "oid" to saksbehandlerOid)).asExecute)
}
}

private fun harDataNødvendigForVisning() = personApiDao.harDataNødvendigForVisning(FØDSELSNUMMER)
private fun assertPersonenErIkkeKlar() = assertFalse(harDataNødvendigForVisning())
private fun assertPersonenErKlar() = assertTrue(harDataNødvendigForVisning())
Expand Down

0 comments on commit c2adfba

Please sign in to comment.