Skip to content

Commit

Permalink
NAV-22361: Tar i bruk nytt endepunkt for henting av tilgangsstyrte jo…
Browse files Browse the repository at this point in the history
…urnalposter (#4787)

Favro:
[NAV-22361](https://favro.com/organization/98c34fb974ce445eac854de0/1844bbac3b6605eacc8f5543?card=NAV-22361)

### 💰 Hva skal gjøres, og hvorfor?
Per nå gjøres det ingen ingen kontroll på vår side om hvorvidt det
finnes personer med adressebeskyttelse blant dokumentene vi henter for
søker. Det finnes en tilgangskontroll for søker i `dokarkiv` som gir
feil dersom søker har adressebeskyttelse (kode 6, 7 eller 19) og
saksbehandler ikke har tilgang, men `dokarkiv` har ingen sjekk på om
barna i en søknad har adressebeskyttelse.

Denne tilgangskontrollen er nå lagt inn i `familie-integrasjoner` og
ligger bak et nytt endepunkt for henting av tilgangsstyrte
journalposter. Tar her i bruk det nye endepunktet.

Relatert PR for nytt endepunkt i `familie-integrasjoner`:
navikt/familie-integrasjoner#1017

### ✅ Checklist
- [x] Jeg har testet mine endringer i henhold til akseptansekriteriene
🕵️
- [ ] Jeg har config- eller sql-endringer.
- [ ] Jeg har skrevet tester.

---------

Co-authored-by: Hanne Olsen <[email protected]>
  • Loading branch information
bragejahren and hanneolsen authored Oct 23, 2024
1 parent fee4f48 commit 227ad0a
Show file tree
Hide file tree
Showing 10 changed files with 327 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ class FeatureToggleConfig {
// NAV-22311
const val OPPRETT_SAK_PÅ_RIKTIG_ENHET_OG_SAKSBEHANDLER = "familie-ba-ks-sak.opprett-sak-paa-riktig-enhet-og-saksbehandler"

// NAV-22361
const val BRUK_NYTT_RETUR_OBJEKT_FOR_JOURNALPOSTER = "familie-ba-ks-sak.bruk-nytt-retur-objekt-for-journalposter"

// satsendring
// Oppretter satsendring-tasker for de som ikke har fått ny task
const val SATSENDRING_ENABLET: String = "familie-ba-sak.satsendring-enablet"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import no.nav.familie.kontrakter.felles.enhet.Enhet
import no.nav.familie.kontrakter.felles.enhet.HentEnheterNavIdentHarTilgangTilRequest
import no.nav.familie.kontrakter.felles.journalpost.Journalpost
import no.nav.familie.kontrakter.felles.journalpost.JournalposterForBrukerRequest
import no.nav.familie.kontrakter.felles.journalpost.TilgangsstyrtJournalpost
import no.nav.familie.kontrakter.felles.kodeverk.KodeverkDto
import no.nav.familie.kontrakter.felles.navkontor.NavKontorEnhet
import no.nav.familie.kontrakter.felles.oppgave.FinnOppgaveRequest
Expand Down Expand Up @@ -378,6 +379,23 @@ class IntegrasjonClient(
}
}

@Retryable(
value = [Exception::class],
maxAttempts = 3,
backoff = Backoff(delayExpression = RETRY_BACKOFF_5000MS),
)
fun hentTilgangsstyrteJournalposterForBruker(journalposterForBrukerRequest: JournalposterForBrukerRequest): List<TilgangsstyrtJournalpost> {
val uri = URI.create("$integrasjonUri/journalpost/tilgangsstyrt/baks")

return kallEksternTjenesteRessurs(
tjeneste = "dokarkiv",
uri = uri,
formål = "Hent tilgangsstyrte journalposter for bruker",
) {
postForEntity(uri, journalposterForBrukerRequest)
}
}

fun hentOppgaver(finnOppgaveRequest: FinnOppgaveRequest): FinnOppgaveResponseDto {
val uri = URI.create("$integrasjonUri/oppgave/v4")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import no.nav.familie.ba.sak.ekstern.restDomene.RestFerdigstillOppgaveKnyttJourn
import no.nav.familie.ba.sak.ekstern.restDomene.RestInstitusjon
import no.nav.familie.ba.sak.ekstern.restDomene.RestJournalføring
import no.nav.familie.ba.sak.integrasjoner.familieintegrasjoner.IntegrasjonClient
import no.nav.familie.ba.sak.integrasjoner.journalføring.InnkommendeJournalføringService.Companion.NAV_NO
import no.nav.familie.ba.sak.integrasjoner.journalføring.domene.DbJournalpost
import no.nav.familie.ba.sak.integrasjoner.journalføring.domene.DbJournalpostType
import no.nav.familie.ba.sak.integrasjoner.journalføring.domene.FagsakSystem
Expand Down Expand Up @@ -36,6 +37,7 @@ import no.nav.familie.kontrakter.felles.journalpost.Journalpost
import no.nav.familie.kontrakter.felles.journalpost.JournalposterForBrukerRequest
import no.nav.familie.kontrakter.felles.journalpost.Journalstatus.FERDIGSTILT
import no.nav.familie.kontrakter.felles.journalpost.Sak
import no.nav.familie.kontrakter.felles.journalpost.TilgangsstyrtJournalpost
import org.springframework.stereotype.Service
import java.time.LocalDate

Expand All @@ -57,14 +59,15 @@ class InnkommendeJournalføringService(

fun hentJournalpost(journalpostId: String): Journalpost = integrasjonClient.hentJournalpost(journalpostId)

fun hentJournalposterForBruker(brukerId: String): List<Journalpost> =
integrasjonClient.hentJournalposterForBruker(
JournalposterForBrukerRequest(
antall = 1000,
brukerId = Bruker(id = brukerId, type = BrukerIdType.FNR),
tema = listOf(Tema.BAR),
),
)
fun hentJournalposterForBruker(brukerId: String): List<TilgangsstyrtJournalpost> =
integrasjonClient
.hentTilgangsstyrteJournalposterForBruker(
JournalposterForBrukerRequest(
antall = 1000,
brukerId = Bruker(id = brukerId, type = BrukerIdType.FNR),
tema = listOf(Tema.BAR),
),
)

private fun oppdaterLogiskeVedlegg(request: RestJournalføring) {
request.dokumenter.forEach { dokument ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ package no.nav.familie.ba.sak.integrasjoner.journalføring
import jakarta.validation.Valid
import no.nav.familie.ba.sak.common.FunksjonellFeil
import no.nav.familie.ba.sak.config.BehandlerRolle
import no.nav.familie.ba.sak.config.FeatureToggleConfig
import no.nav.familie.ba.sak.ekstern.restDomene.RestJournalføring
import no.nav.familie.ba.sak.sikkerhet.TilgangService
import no.nav.familie.kontrakter.felles.PersonIdent
import no.nav.familie.kontrakter.felles.Ressurs
import no.nav.familie.kontrakter.felles.journalpost.Journalpost
import no.nav.familie.unleash.UnleashService
import no.nav.security.token.support.core.api.ProtectedWithClaims
import org.springframework.http.MediaType
import org.springframework.http.ResponseEntity
Expand All @@ -27,6 +29,7 @@ import org.springframework.web.bind.annotation.RestController
class JournalføringController(
private val innkommendeJournalføringService: InnkommendeJournalføringService,
private val tilgangService: TilgangService,
private val unleashService: UnleashService,
) {
@GetMapping(path = ["/{journalpostId}/hent"], produces = [MediaType.APPLICATION_JSON_VALUE])
fun hentJournalpost(
Expand All @@ -36,14 +39,19 @@ class JournalføringController(
@PostMapping(path = ["/for-bruker"])
fun hentJournalposterForBruker(
@RequestBody personIdentBody: PersonIdent,
): ResponseEntity<Ressurs<List<Journalpost>>> =
ResponseEntity.ok(
Ressurs.success(
innkommendeJournalføringService.hentJournalposterForBruker(
personIdentBody.ident,
),
),
)
): ResponseEntity<Ressurs<List<Any>>> {
val tilgangsstyrteJournalposter =
innkommendeJournalføringService.hentJournalposterForBruker(
personIdentBody.ident,
)
val response =
if (unleashService.isEnabled(FeatureToggleConfig.BRUK_NYTT_RETUR_OBJEKT_FOR_JOURNALPOSTER, false)) {
tilgangsstyrteJournalposter
} else {
tilgangsstyrteJournalposter.map { it.journalpost }
}
return ResponseEntity.ok(Ressurs.success(response))
}

@GetMapping("/{journalpostId}/hent/{dokumentInfoId}")
fun hentDokument(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import no.nav.familie.kontrakter.felles.journalpost.Journalstatus
import no.nav.familie.kontrakter.felles.journalpost.LogiskVedlegg
import no.nav.familie.kontrakter.felles.journalpost.RelevantDato
import no.nav.familie.kontrakter.felles.journalpost.Sak
import no.nav.familie.kontrakter.felles.journalpost.TilgangsstyrtJournalpost
import no.nav.familie.kontrakter.felles.oppgave.Behandlingstype
import no.nav.familie.kontrakter.felles.oppgave.IdentGruppe
import no.nav.familie.kontrakter.felles.oppgave.Oppgave
Expand Down Expand Up @@ -80,6 +81,19 @@ fun lagTestJournalpost(
relevanteDatoer = listOf(RelevantDato(LocalDateTime.now(), "DATO_REGISTRERT")),
)

fun lagTilgangsstyrtJournalpost(
personIdent: String,
journalpostId: String,
harTilgang: Boolean = true,
): TilgangsstyrtJournalpost =
TilgangsstyrtJournalpost(
lagTestJournalpost(
personIdent = personIdent,
journalpostId = journalpostId,
),
harTilgang = harTilgang,
)

fun lagTestOppgave(): OpprettOppgaveRequest =
OpprettOppgaveRequest(
ident = OppgaveIdentV2(ident = "test", gruppe = IdentGruppe.AKTOERID),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,60 +1,82 @@
package no.nav.familie.ba.sak.integrasjoner.familieintegrasjoner

import io.mockk.every
import com.github.tomakehurst.wiremock.WireMockServer
import com.github.tomakehurst.wiremock.client.WireMock
import com.github.tomakehurst.wiremock.core.WireMockConfiguration
import io.mockk.mockk
import no.nav.familie.ba.sak.datagenerator.oppgave.lagEnhet
import no.nav.familie.ba.sak.kjerne.arbeidsfordeling.BarnetrygdEnhet
import no.nav.familie.kontrakter.felles.BrukerIdType
import no.nav.familie.kontrakter.felles.NavIdent
import no.nav.familie.kontrakter.felles.Ressurs
import no.nav.familie.kontrakter.felles.enhet.Enhet
import no.nav.familie.kontrakter.felles.Tema
import no.nav.familie.kontrakter.felles.journalpost.Bruker
import no.nav.familie.kontrakter.felles.journalpost.JournalposterForBrukerRequest
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.springframework.http.HttpMethod
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.boot.web.client.RestTemplateBuilder
import org.springframework.web.client.RestOperations
import org.springframework.web.client.exchange
import java.net.URI

class IntegrasjonClientTest {
private val mockedRestOperations: RestOperations = mockk()
private val restOperations: RestOperations = RestTemplateBuilder().build()
private val baseUri = URI("http://localhost:8080")
private val integrasjonClient: IntegrasjonClient =
IntegrasjonClient(
baseUri,
mockedRestOperations,
)
private lateinit var wiremockServerItem: WireMockServer
private lateinit var integrasjonClient: IntegrasjonClient

@BeforeEach
fun initClass() {
wiremockServerItem = WireMockServer(WireMockConfiguration.wireMockConfig().dynamicPort())
wiremockServerItem.start()
integrasjonClient = IntegrasjonClient(URI.create(wiremockServerItem.baseUrl()), restOperations)
}

@Test
fun `skal hente enheter som NAV-ident har tilgang til`() {
fun `hentEnheterSomNavIdentHarTilgangTil - skal hente enheter som NAV-ident har tilgang til`() {
// Arrange
val navIdent = NavIdent("1")

val enhet1 = lagEnhet(BarnetrygdEnhet.VADSØ.enhetsnummer)
val enhet2 = lagEnhet(BarnetrygdEnhet.OSLO.enhetsnummer)

every {
mockedRestOperations.exchange<Ressurs<List<Enhet>>>(
eq(URI("$baseUri/enhetstilganger")),
eq(HttpMethod.POST),
any(),
)
} returns
ResponseEntity<Ressurs<List<Enhet>>>(
Ressurs.success(
listOf(
enhet1,
enhet2,
),
),
HttpStatus.OK,
)
wiremockServerItem.stubFor(
WireMock
.post(WireMock.urlEqualTo("/enhetstilganger"))
.willReturn(WireMock.okJson(readFile("enheterNavIdentHarTilgangTilResponse.json"))),
)

// Act
val enheter = integrasjonClient.hentBehandlendeEnheterSomNavIdentHarTilgangTil(navIdent)

// Assert
assertThat(enheter).hasSize(2)
assertThat(enheter).contains(enhet1, enhet2)
assertThat(enheter).anySatisfy {
assertThat(it.enhetsnummer).isEqualTo(BarnetrygdEnhet.VADSØ.enhetsnummer)
assertThat(it.enhetsnavn).isEqualTo(BarnetrygdEnhet.VADSØ.enhetsnavn)
}
assertThat(enheter).anySatisfy {
assertThat(it.enhetsnummer).isEqualTo(BarnetrygdEnhet.OSLO.enhetsnummer)
assertThat(it.enhetsnavn).isEqualTo(BarnetrygdEnhet.OSLO.enhetsnavn)
}
}

@Test
fun `hentTilgangsstyrteJournalposterForBruker - skal hente tilgangsstyrte journalposter for bruker`() {
// Arrange
wiremockServerItem.stubFor(
WireMock
.post(WireMock.urlEqualTo("/journalpost/tilgangsstyrt/baks"))
.willReturn(WireMock.okJson(readFile("hentTilgangsstyrteJournalposterForBruker.json"))),
)

// Act
val tilgangsstyrteJournalposter = integrasjonClient.hentTilgangsstyrteJournalposterForBruker(JournalposterForBrukerRequest(brukerId = Bruker(id = "12345678910", type = BrukerIdType.FNR), antall = 100, tema = listOf(Tema.BAR)))

// Assert
assertThat(tilgangsstyrteJournalposter).hasSize(1)
val tilgangsstyrtJournalpost = tilgangsstyrteJournalposter.single()
assertThat(tilgangsstyrtJournalpost.journalpost.journalpostId).isEqualTo("453492634")
assertThat(tilgangsstyrtJournalpost.journalpost.tema).isEqualTo(Tema.BAR.name)
assertThat(tilgangsstyrtJournalpost.journalpost.kanal).isEqualTo("NAV_NO")
assertThat(tilgangsstyrtJournalpost.harTilgang).isTrue
}

private fun readFile(filnavn: String): String = this::class.java.getResource("/familieintegrasjoner/json/$filnavn").readText()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package no.nav.familie.ba.sak.integrasjoner.journalføring

import io.mockk.every
import io.mockk.mockk
import no.nav.familie.ba.sak.integrasjoner.familieintegrasjoner.IntegrasjonClient
import no.nav.familie.ba.sak.integrasjoner.journalføring.domene.JournalføringRepository
import no.nav.familie.ba.sak.integrasjoner.lagTilgangsstyrtJournalpost
import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingSøknadsinfoService
import no.nav.familie.ba.sak.kjerne.fagsak.FagsakService
import no.nav.familie.ba.sak.kjerne.logg.LoggService
import no.nav.familie.ba.sak.kjerne.steg.StegService
import no.nav.familie.kontrakter.felles.BrukerIdType
import no.nav.familie.kontrakter.felles.Tema
import no.nav.familie.kontrakter.felles.journalpost.Bruker
import no.nav.familie.kontrakter.felles.journalpost.JournalposterForBrukerRequest
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test

class InnkommendeJournalføringServiceEnhetTest {
private val mockedIntegrasjonClient: IntegrasjonClient = mockk()
private val mockedFagsakService: FagsakService = mockk()
private val mockedBehandlingHentOgPersisterService: BehandlingHentOgPersisterService = mockk()
private val mockedJournalføringRepository: JournalføringRepository = mockk()
private val mockedLoggService: LoggService = mockk()
private val mockedStegService: StegService = mockk()
private val mockedJournalføringMetrikk: JournalføringMetrikk = mockk()
private val mockedBehandlingSøknadsinfoService: BehandlingSøknadsinfoService = mockk()
private val innkommendeJournalføringService: InnkommendeJournalføringService =
InnkommendeJournalføringService(
integrasjonClient = mockedIntegrasjonClient,
fagsakService = mockedFagsakService,
behandlingHentOgPersisterService = mockedBehandlingHentOgPersisterService,
journalføringRepository = mockedJournalføringRepository,
loggService = mockedLoggService,
stegService = mockedStegService,
journalføringMetrikk = mockedJournalføringMetrikk,
behandlingSøknadsinfoService = mockedBehandlingSøknadsinfoService,
)

@Test
fun `skal hente og returnere tilgangsstyrte journalposter`() {
// Arrange
val brukerId = "12345678910"
val journalpostId = "123"
val journalposter =
listOf(
lagTilgangsstyrtJournalpost(
personIdent = brukerId,
journalpostId = journalpostId,
harTilgang = true,
),
)

every {
mockedIntegrasjonClient.hentTilgangsstyrteJournalposterForBruker(
JournalposterForBrukerRequest(
antall = 1000,
brukerId = Bruker(id = brukerId, type = BrukerIdType.FNR),
tema = listOf(Tema.BAR),
),
)
} returns journalposter

// Act
val journalposterForBruker = innkommendeJournalføringService.hentJournalposterForBruker(brukerId)

// Assert
assertThat(journalposterForBruker.first { it.journalpost.journalpostId === journalpostId }.harTilgang).isTrue
}
}
Loading

0 comments on commit 227ad0a

Please sign in to comment.