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

Legg til info om innlogget bruker endepunkt #334

Merged
merged 11 commits into from
Jan 17, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
import no.nav.vedtak.exception.IntegrasjonException;
import no.nav.vedtak.exception.VLException;
import no.nav.vedtak.felles.integrasjon.person.Persondata;
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
import no.nav.vedtak.sikkerhet.kontekst.KontekstHolder;

@ApplicationScoped
public class PersonTjeneste {
Expand Down Expand Up @@ -81,6 +83,14 @@ public PersonInfo hentPersonFraIdent(PersonIdent personIdent, Ytelsetype ytelseT
() -> new IllegalStateException("Finner ikke personnummer for id " + aktørIdEntitet));
}

public PersonInfo hentInnloggetPerson(Ytelsetype ytelsetype) {
if (!KontekstHolder.harKontekst() || !IdentType.EksternBruker.equals(KontekstHolder.getKontekst().getIdentType())) {
throw new IllegalStateException("Mangler innlogget bruker kontekst.");
}
var pid = KontekstHolder.getKontekst().getUid();
return hentPersonFraIdent(PersonIdent.fra(pid), ytelsetype);
}

private LocalDate mapFødselsdato(Person person) {
return person.getFoedselsdato().stream().map(Foedselsdato::getFoedselsdato).findFirst().map(LocalDate::parse).orElse(null);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;

import no.nav.familie.inntektsmelding.koder.Ytelsetype;

public record HentInnloggetBrukerRequestDto(@NotNull Ytelsetype ytelseType,
@NotNull @Pattern(regexp = "^\\d{9}$") @Valid String organisasjonsnummer) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest;

import jakarta.validation.constraints.NotNull;

public record InnloggetBrukerDto(
@NotNull String fornavn,
String mellomnavn,
@NotNull String etternavn,
String telefon,
@NotNull String organisasjonsnummer,
@NotNull String organisasjonsnavn) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester.ArbeidstakerTjeneste;
import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester.InnloggetBrukerTjeneste;
import no.nav.familie.inntektsmelding.server.auth.api.AutentisertMedTokenX;
import no.nav.familie.inntektsmelding.server.auth.api.Tilgangskontrollert;

Expand All @@ -33,16 +34,19 @@ public class RefusjonOmsorgsdagerArbeidsgiverRest {

public static final String BASE_PATH = "/refusjon-omsorgsdager-arbeidsgiver";
private static final String SLÅ_OPP_ARBEIDSTAKER = "/arbeidstaker";
private static final String INNLOGGET_BRUKER = "/innlogget-bruker";

private ArbeidstakerTjeneste arbeidstakerTjeneste;
private InnloggetBrukerTjeneste innloggetBrukerTjeneste;

RefusjonOmsorgsdagerArbeidsgiverRest() {
// CDI
}

@Inject
public RefusjonOmsorgsdagerArbeidsgiverRest(ArbeidstakerTjeneste arbeidstakerTjeneste) {
public RefusjonOmsorgsdagerArbeidsgiverRest(ArbeidstakerTjeneste arbeidstakerTjeneste, InnloggetBrukerTjeneste innloggetBrukerTjeneste) {
this.arbeidstakerTjeneste = arbeidstakerTjeneste;
this.innloggetBrukerTjeneste = innloggetBrukerTjeneste;
}

@POST
Expand All @@ -51,14 +55,30 @@ public RefusjonOmsorgsdagerArbeidsgiverRest(ArbeidstakerTjeneste arbeidstakerTje
@Operation(description = "Henter opplysninger om arbeidstaker, gitt et fødselsnummer.", tags = "imdialog")
@Tilgangskontrollert
public Response slåOppArbeidstaker(
@Parameter(description = "Datapakke som inneholder fødselsnummeret til en arbeidstaker") @NotNull @Valid SlåOppArbeidstakerDto slåOppArbeidstakerDto) {
@Parameter(description = "Datapakke som inneholder fødselsnummeret til en arbeidstaker")
@NotNull @Valid
SlåOppArbeidstakerRequestDto slåOppArbeidstakerRequestDto
) {

LOG.info("Slår opp arbeidstaker med fødselsnummer {}", slåOppArbeidstakerDto.fødselsnummer());
LOG.info("Slår opp arbeidstaker med fødselsnummer {}", slåOppArbeidstakerRequestDto.fødselsnummer());

var dto = arbeidstakerTjeneste.slåOppArbeidstaker(slåOppArbeidstakerDto.fødselsnummer(), slåOppArbeidstakerDto.ytelseType());
var dto = arbeidstakerTjeneste.slåOppArbeidstaker(slåOppArbeidstakerRequestDto.fødselsnummer(), slåOppArbeidstakerRequestDto.ytelseType());
if (dto == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
return Response.ok(dto).build();
}

@POST
@Path(INNLOGGET_BRUKER)
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
@Operation(description = "Henter opplysninger om innlogget bruker.", tags = "imdialog")
@Tilgangskontrollert
public Response hentInnloggetBruker(
@Parameter(description = "Datapakke som inneholder ytelsestypen og organisasjonsnummeret til den innloggede brukeren")
@NotNull @Valid HentInnloggetBrukerRequestDto hentInnloggetBrukerRequestDto
) {
var dto = innloggetBrukerTjeneste.hentInnloggetBruker(hentInnloggetBrukerRequestDto.ytelseType(), hentInnloggetBrukerRequestDto.organisasjonsnummer());
return Response.ok(dto).build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
import no.nav.familie.inntektsmelding.integrasjoner.person.PersonIdent;
import no.nav.familie.inntektsmelding.koder.Ytelsetype;

public record SlåOppArbeidstakerDto(@Valid @NotNull PersonIdent fødselsnummer, @Valid @NotNull Ytelsetype ytelseType) {
public record SlåOppArbeidstakerRequestDto(@Valid @NotNull PersonIdent fødselsnummer, @Valid @NotNull Ytelsetype ytelseType) {
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import no.nav.familie.inntektsmelding.integrasjoner.organisasjon.OrganisasjonTjeneste;
import no.nav.familie.inntektsmelding.integrasjoner.person.PersonTjeneste;
import no.nav.familie.inntektsmelding.koder.Ytelsetype;
import no.nav.familie.inntektsmelding.pip.AltinnTilgangTjeneste;
import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest.InnloggetBrukerDto;
import no.nav.vedtak.exception.ManglerTilgangException;

@ApplicationScoped
public class InnloggetBrukerTjeneste {
private PersonTjeneste personTjeneste;
private AltinnTilgangTjeneste altinnTilgangTjeneste;
private OrganisasjonTjeneste organisasjonTjeneste;
private static final Logger LOG = LoggerFactory.getLogger(InnloggetBrukerTjeneste.class);

selbekk marked this conversation as resolved.
Show resolved Hide resolved
public InnloggetBrukerTjeneste() {
// CDI
}

@Inject
public InnloggetBrukerTjeneste(PersonTjeneste personTjeneste, AltinnTilgangTjeneste altinnTilgangTjeneste, OrganisasjonTjeneste organisasjonTjeneste) {
this.personTjeneste = personTjeneste;
this.altinnTilgangTjeneste = altinnTilgangTjeneste;
this.organisasjonTjeneste = organisasjonTjeneste;
}

public InnloggetBrukerDto hentInnloggetBruker(Ytelsetype ytelseType, String organisasjonsnummer) {
LOG.info("Henter informasjon om innlogget bruker for ytelseType {} og orgnummer {}", ytelseType, organisasjonsnummer);
Fixed Show fixed Hide fixed
Fixed Show fixed Hide fixed
var innloggetBruker = personTjeneste.hentInnloggetPerson(ytelseType);
if (innloggetBruker == null) {
throw new IllegalStateException("Fant ikke innlogget bruker i PDL.");
}

var organisasjon = organisasjonTjeneste.finnOrganisasjon(organisasjonsnummer);
if (organisasjon == null) {
throw new IllegalArgumentException("Fant ikke organisasjon med orgnummer " + organisasjonsnummer);
}

if (altinnTilgangTjeneste.manglerTilgangTilBedriften(organisasjonsnummer)) {
throw new ManglerTilgangException("MANGLER_TILGANG_FEIL", "Innlogget bruker har ikke tilgang til organisasjonsnummer " + organisasjonsnummer);
}

return new InnloggetBrukerDto(
innloggetBruker.fornavn(),
innloggetBruker.mellomnavn(),
innloggetBruker.etternavn(),
innloggetBruker.telefonnummer(),
organisasjon.orgnr(),
organisasjon.navn()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public void filter(ContainerRequestContext req) {
void assertValidRequest(ContainerRequestContext req) {
var method = getResourceinfo().getResourceMethod();
LOG.trace("{} i klasse {}", method.getName(), method.getDeclaringClass());
fjernKontektsHvisFinnes();
fjernKontekstHvisFinnes();
AuthenticationFilterDelegate.validerSettKontekst(getResourceinfo(), req);
assertValidAnnotation(method, req);
}
Expand Down Expand Up @@ -104,7 +104,7 @@ private void assertValidAnnotation(Annotation annotering, ContainerRequestContex
private void validerIkkeAutentisertKontekst() {
var kontekst = KontekstHolder.getKontekst();
if (!kontekst.harKontekst() || kontekst.getIdentType() != null) {
throw new WebApplicationException("Kan ikke kjøre uten autentisering med autentisert kontekts", Response.Status.UNAUTHORIZED);
throw new WebApplicationException("Kan ikke kjøre uten autentisering med autentisert kontekst", Response.Status.UNAUTHORIZED);
}
}

Expand All @@ -122,7 +122,7 @@ private void validerBorgerKontekst() {
}
}

private void fjernKontektsHvisFinnes() {
private void fjernKontekstHvisFinnes() {
if (KontekstHolder.harKontekst()) {
LOG.info("Kall til {} hadde kontekst {}", getResourceinfo().getResourceMethod().getName(), KontekstHolder.getKontekst().getKompaktUid());
KontekstHolder.fjernKontekst();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package no.nav.familie.inntektsmelding.integrasjoner.person;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;

import java.util.HashSet;
import java.util.List;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.jupiter.MockitoExtension;

import no.nav.familie.inntektsmelding.koder.Ytelsetype;
import no.nav.pdl.Foedselsdato;
import no.nav.pdl.Navn;
import no.nav.pdl.Person;
import no.nav.pdl.Telefonnummer;
import no.nav.vedtak.sikkerhet.kontekst.IdentType;
import no.nav.vedtak.sikkerhet.kontekst.KontekstHolder;
import no.nav.vedtak.sikkerhet.kontekst.RequestKontekst;

@ExtendWith(MockitoExtension.class)
class PersonTjenesteTest {
@Mock
private PdlKlient pdlKlientMock;

private MockedStatic<KontekstHolder> kontekstHolderMock;

private PersonTjeneste personTjeneste;

@BeforeEach
void setUp() {
personTjeneste = new PersonTjeneste(pdlKlientMock);
kontekstHolderMock = mockStatic(KontekstHolder.class);
}

@AfterEach
void tearDown() {
kontekstHolderMock.close();
}

@Test
void hentInnloggetPerson_skal_returnere_innlogget_person() {
var ytelseType = Ytelsetype.OMSORGSPENGER;
var pdlPerson = new Person();
var pdlNavn = new Navn();
pdlNavn.setFornavn("fornavn");
pdlNavn.setMellomnavn("mellomnavn");
pdlNavn.setEtternavn("etternavn");
var pdlTelefonnummer = new Telefonnummer();
pdlTelefonnummer.setLandskode("47");
pdlTelefonnummer.setNummer("81549300");
var pdlFødselsdato = new Foedselsdato();
pdlFødselsdato.setFoedselsdato("1997-11-23");

pdlPerson.setNavn(List.of(pdlNavn));
pdlPerson.setTelefonnummer(List.of(pdlTelefonnummer));
pdlPerson.setFoedselsdato(List.of(pdlFødselsdato));

var kontekst = RequestKontekst.forRequest("11839798115", null, IdentType.EksternBruker, null, null, new HashSet<>());
when(KontekstHolder.harKontekst()).thenReturn(true);
when(KontekstHolder.getKontekst()).thenReturn(kontekst);
when(pdlKlientMock.hentPerson(any(), any(), any())).thenReturn(pdlPerson);

var person = personTjeneste.hentInnloggetPerson(ytelseType);

assertEquals("fornavn", person.fornavn());
assertEquals("mellomnavn", person.mellomnavn());
assertEquals("etternavn", person.etternavn());
assertEquals("4781549300", person.telefonnummer());
}

@Test
void hentInnloggetPerson_skal_kaste_exception_om_man_ikke_har_kontekst() {
var ytelseType = Ytelsetype.OMSORGSPENGER;

when(KontekstHolder.harKontekst()).thenReturn(false);

assertThrows(IllegalStateException.class, () -> personTjeneste.hentInnloggetPerson(ytelseType));
}

@Test
void hentInnloggetPerson_skal_kaste_exception_om_identtypen_ikke_er_ekstern() {
var ytelseType = Ytelsetype.OMSORGSPENGER;

when(KontekstHolder.harKontekst()).thenReturn(true);
var kontekst = RequestKontekst.forRequest("11839798115", null, IdentType.InternBruker, null, null, new HashSet<>());
when(KontekstHolder.getKontekst()).thenReturn(kontekst);

assertThrows(IllegalStateException.class, () -> personTjeneste.hentInnloggetPerson(ytelseType));
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.rest;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

Expand All @@ -15,28 +16,32 @@
import no.nav.familie.inntektsmelding.integrasjoner.person.PersonIdent;
import no.nav.familie.inntektsmelding.koder.Ytelsetype;
import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester.ArbeidstakerTjeneste;
import no.nav.familie.inntektsmelding.refusjonomsorgsdagerarbeidsgiver.tjenester.InnloggetBrukerTjeneste;

@ExtendWith(MockitoExtension.class)
class RefusjonOmsorgsdagerArbeidsgiverRestTest {
@Mock
private ArbeidstakerTjeneste arbeidstakerTjenesteMock;

@Mock
private InnloggetBrukerTjeneste innloggetBrukerTjenesteMock;

private RefusjonOmsorgsdagerArbeidsgiverRest rest;

@BeforeEach
void setUp() {
rest = new RefusjonOmsorgsdagerArbeidsgiverRest(arbeidstakerTjenesteMock);
rest = new RefusjonOmsorgsdagerArbeidsgiverRest(arbeidstakerTjenesteMock, innloggetBrukerTjenesteMock);
}

@Test
void slå_opp_arbeidstaker_skal_returnere_ok_response_når_arbeidstaker_finnes() {
var fnr = PersonIdent.fra("12345678910");
var dto = new SlåOppArbeidstakerDto(fnr, Ytelsetype.OMSORGSPENGER);
var dto = new SlåOppArbeidstakerRequestDto(fnr, Ytelsetype.OMSORGSPENGER);
var arbeidstakerInfo = new SlåOppArbeidstakerResponseDto("fornavn", "mellomnavn", "etternavn", null);

when(arbeidstakerTjenesteMock.slåOppArbeidstaker(fnr, Ytelsetype.OMSORGSPENGER)).thenReturn(arbeidstakerInfo);

Response response = rest.slåOppArbeidstaker(dto);
var response = rest.slåOppArbeidstaker(dto);

assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
assertEquals(arbeidstakerInfo, response.getEntity());
Expand All @@ -46,13 +51,23 @@ void setUp() {
@Test
void slå_opp_arbeidstaker_skal_returnere_not_found_når_arbeidstaker_ikke_finnes() {
var fnr = PersonIdent.fra("12345678910");
var dto = new SlåOppArbeidstakerDto(fnr, Ytelsetype.OMSORGSPENGER);
var dto = new SlåOppArbeidstakerRequestDto(fnr, Ytelsetype.OMSORGSPENGER);

when(arbeidstakerTjenesteMock.slåOppArbeidstaker(fnr, Ytelsetype.OMSORGSPENGER)).thenReturn(null);

Response response = rest.slåOppArbeidstaker(dto);
var response = rest.slåOppArbeidstaker(dto);

assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus());
verify(arbeidstakerTjenesteMock).slåOppArbeidstaker(fnr, Ytelsetype.OMSORGSPENGER);
}

@Test
void hent_innlogget_bruker_returnerer_ok() {
var innloggetBruker = new InnloggetBrukerDto("fornavn", "mellomnavn", "etternavn", "81549300", "123456789", "organisasjonsnavn");

when(innloggetBrukerTjenesteMock.hentInnloggetBruker(any(), any())).thenReturn(innloggetBruker);

var response = rest.hentInnloggetBruker(new HentInnloggetBrukerRequestDto(Ytelsetype.OMSORGSPENGER, "123456789"));
assertEquals(response.getEntity(), innloggetBruker);
}
}
Loading
Loading