From 1dd7a7c9571506fc144b25bd9b77d65c18626e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20P=C3=B8hner?= Date: Wed, 31 Jul 2024 15:35:16 +0200 Subject: [PATCH] =?UTF-8?q?Legger=20p=C3=A5=20ansettelsessted=20fra=20ldap?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../organisasjon/ansatt/AnsattTjeneste.java | 19 +++++++++----- .../ansatt/AzureBrukerKlient.java | 2 +- .../los/organisasjon/ansatt/BrukerProfil.java | 2 +- .../ansatt/LdapBrukeroppslag.java | 25 +++++++++++++------ .../felles/dto/SaksbehandlerDto.java | 2 +- .../felles/dto/SaksbehandlerDtoTjeneste.java | 4 +-- ...ngslederSaksbehandlerRestTjenesteTest.java | 2 +- 7 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AnsattTjeneste.java b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AnsattTjeneste.java index 99ac92453..a60103956 100644 --- a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AnsattTjeneste.java +++ b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AnsattTjeneste.java @@ -1,7 +1,9 @@ package no.nav.foreldrepenger.los.organisasjon.ansatt; import java.time.Duration; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; @@ -26,6 +28,9 @@ public class AnsattTjeneste { private OrganisasjonRepository organisasjonRepository; private List aktuelleEnhetIder; + private final Map kodeAvdelingsnavnMap = new HashMap<>(); + + AnsattTjeneste() { // for CDI proxy } @@ -35,6 +40,7 @@ public AnsattTjeneste(EnhetstilgangTjeneste enhetstilgangTjeneste, OrganisasjonRepository organisasjonRepository) { this.enhetstilgangTjeneste = enhetstilgangTjeneste; this.organisasjonRepository = organisasjonRepository; + organisasjonRepository.hentAktiveAvdelinger().forEach(a -> kodeAvdelingsnavnMap.put(a.getAvdelingEnhet(), a.getNavn())); } public BrukerProfil hentBrukerProfil(String ident) { @@ -42,13 +48,14 @@ public BrukerProfil hentBrukerProfil(String ident) { //TODO: Her bør vi egentlig tenke om NOM er ikke riktigere å bruke - bør være raskere å slå opp navn og epost. // Jeg har sjekket med NOM (01.07.2024) og de støtter en så lenge ikke Z-identer i dev. Men prod brukere er tilgjengelig. var før = System.nanoTime(); - var brukerProfil = new LdapBrukeroppslag().hentBrukerProfil(ident); + var ldapRespons = new LdapBrukeroppslag().hentBrukerProfil(ident); LOG.info("LDAP bruker profil oppslag: {}ms. ", Duration.ofNanos(System.nanoTime() - før).toMillis()); - if (brukerProfil == null) { - LOG.warn("Kunne ikke hente Bruker profil fra LDAP for {}", ident); - } else { - sammenlignMedAzureGraphFailSoft(ident, brukerProfil); + var ansattEnhet = kodeAvdelingsnavnMap.get(ldapRespons.ansattEnhet()); + if (ansattEnhet == null) { + LOG.info("PROFIL LDAP: brukers enhet {} ikke blant saksbehandlingsenhetene", ldapRespons.ansattEnhet()); } + var brukerProfil = new BrukerProfil(ldapRespons.ident(), ldapRespons.navn(), ldapRespons.epostAdresse(), ansattEnhet); + sammenlignMedAzureGraphFailSoft(ident, brukerProfil); ANSATT_PROFIL.put(ident, brukerProfil); } return ANSATT_PROFIL.get(ident); @@ -71,7 +78,7 @@ private static void sammenlignMedAzureGraphFailSoft(String ident, BrukerProfil l } private static BrukerProfil mapTilDomene(AzureBrukerKlient.BrukerProfilResponse klientResponse) { - return new BrukerProfil(klientResponse.ident(), klientResponse.navn(), klientResponse.epost()); + return new BrukerProfil(klientResponse.ident(), klientResponse.fornavnEtternavn(), klientResponse.epost(), klientResponse.ansattVedEnhetId()); } public List hentAvdelingerNavnForAnsatt(String ident) { diff --git a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AzureBrukerKlient.java b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AzureBrukerKlient.java index 2c776f90b..8901f8763 100644 --- a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AzureBrukerKlient.java +++ b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/AzureBrukerKlient.java @@ -32,5 +32,5 @@ public BrukerProfilResponse brukerProfil(String ident) { record BrukerProfilRequest(@NotNull String ident) {} - public record BrukerProfilResponse(String ident, String navn, String epost) {} + public record BrukerProfilResponse(String ident, String fornavnEtternavn, String epost, String ansattVedEnhetId) {} } diff --git a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/BrukerProfil.java b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/BrukerProfil.java index 3b4bb080d..5ce25e6b6 100644 --- a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/BrukerProfil.java +++ b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/BrukerProfil.java @@ -1,4 +1,4 @@ package no.nav.foreldrepenger.los.organisasjon.ansatt; -public record BrukerProfil(String ident, String navn, String epostAdresse) { +public record BrukerProfil(String ident, String navn, String epostAdresse, String ansattAvdeling) { } diff --git a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/LdapBrukeroppslag.java b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/LdapBrukeroppslag.java index b37adb549..2463ee3aa 100644 --- a/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/LdapBrukeroppslag.java +++ b/src/main/java/no/nav/foreldrepenger/los/organisasjon/ansatt/LdapBrukeroppslag.java @@ -22,11 +22,13 @@ public class LdapBrukeroppslag { private static final Logger LOG = LoggerFactory.getLogger(LdapBrukeroppslag.class); private static final Pattern IDENT_PATTERN = Pattern.compile("^\\p{LD}+$"); - private static final String DISPLAY_NAME_ATTR = "displayName"; - private static final String USER_PRINCIPAL_NAME_ATTR = "userPrincipalName"; private final LdapContext context; private final LdapName searchBase; + private static final String GIVEN_NAME = "givenName"; + private static final String SURNAME = "sn"; + private static final String USER_PRINCIPAL_NAME = "userPrincipalName"; + private static final String STREET_ADDRESS = "streetAddress"; public LdapBrukeroppslag() { this(LdapInnlogging.lagLdapContext(), lagLdapSearchBase()); @@ -37,17 +39,22 @@ public LdapBrukeroppslag() { this.searchBase = searcBase; } - public BrukerProfil hentBrukerProfil(String ident) { + public BrukerProfilRespons hentBrukerProfil(String ident) { var result = ldapSearch(ident.trim()); - var displayName = find(result, DISPLAY_NAME_ATTR); - var upn = find(result, USER_PRINCIPAL_NAME_ATTR); + var givenName = find(result, GIVEN_NAME); + var surname = find(result, SURNAME); + var upn = find(result, USER_PRINCIPAL_NAME); + var addressCode = find(result, STREET_ADDRESS); try { - var navn = displayName.get().toString(); + var fornavn = givenName.get().toString(); + var etternavn = surname.get().toString(); + var navn = fornavn + " " + etternavn; var epostAdresse = upn.get().toString(); + var ansattKontornummer = addressCode.get().toString(); if (!epostAdresse.contains("@nav.no")) { LOG.info("LDAP: fant ikke gyldig epostadresse for bruker {}", ident); } - return new BrukerProfil(ident, navn, epostAdresse); + return new BrukerProfilRespons(ident, navn, epostAdresse, ansattKontornummer); } catch (NamingException e) { throw new TekniskException("F-314006", String.format("Kunne ikke hente ut attributtverdi for ident %s", ident), e); } @@ -65,7 +72,7 @@ private SearchResult ldapSearch(String ident) { var controls = new SearchControls(); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); controls.setCountLimit(1); - controls.setReturningAttributes(new String[]{DISPLAY_NAME_ATTR, USER_PRINCIPAL_NAME_ATTR}); + controls.setReturningAttributes(new String[]{GIVEN_NAME, SURNAME, USER_PRINCIPAL_NAME, STREET_ADDRESS}); var søkestreng = String.format("(cn=%s)", ident); try { var result = context.search(searchBase, søkestreng, controls); // NOSONAR @@ -98,4 +105,6 @@ private static LdapName lagLdapSearchBase() { } } + public record BrukerProfilRespons(String ident, String navn, String epostAdresse, String ansattEnhet) { } + } diff --git a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDto.java b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDto.java index 840576a63..e3aa8c785 100644 --- a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDto.java +++ b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDto.java @@ -1,6 +1,6 @@ package no.nav.foreldrepenger.los.tjenester.felles.dto; -public record SaksbehandlerDto(SaksbehandlerBrukerIdentDto brukerIdent, String navn, String epostAdresse) { +public record SaksbehandlerDto(SaksbehandlerBrukerIdentDto brukerIdent, String navn, String epostAdresse, String ansattAvdeling) { @Override public String toString() { diff --git a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDtoTjeneste.java b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDtoTjeneste.java index 81e972ac2..5be038abb 100644 --- a/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDtoTjeneste.java +++ b/src/main/java/no/nav/foreldrepenger/los/tjenester/felles/dto/SaksbehandlerDtoTjeneste.java @@ -74,7 +74,7 @@ public SaksbehandlerMedAvdelingerDto lagKjentOgUkjentSaksbehandlerMedAvdelingerD var avdelinger = ansattTjeneste.hentAvdelingerNavnForAnsatt(ident); return new SaksbehandlerMedAvdelingerDto(saksbehandlerDto.get(), avdelinger); } - var ukjent = new SaksbehandlerDto(new SaksbehandlerBrukerIdentDto(ident), "Ukjent saksbehandler " + ident, null); + var ukjent = new SaksbehandlerDto(new SaksbehandlerBrukerIdentDto(ident), "Ukjent saksbehandler " + ident, null, null); return new SaksbehandlerMedAvdelingerDto(ukjent, Collections.emptyList()); } @@ -85,7 +85,7 @@ public Optional tilSaksbehandlerDto(Saksbehandler saksbehandle private Optional tilSaksbehandlerDto(String ident) { var identDto = new SaksbehandlerBrukerIdentDto(ident); - return hentBrukerProfil(ident).map(bp -> new SaksbehandlerDto(identDto, bp.navn(), bp.epostAdresse())); + return hentBrukerProfil(ident).map(bp -> new SaksbehandlerDto(identDto, bp.navn(), bp.epostAdresse(), bp.ansattAvdeling())); } public Optional hentBrukerProfil(String ident) { diff --git a/src/test/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java b/src/test/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java index 78078add9..30eeb8554 100644 --- a/src/test/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java +++ b/src/test/java/no/nav/foreldrepenger/los/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java @@ -42,7 +42,7 @@ class AvdelingslederSaksbehandlerRestTjenesteTest { private static final AvdelingEnhetDto avdelingDto = new AvdelingEnhetDto("4817"); private static final SaksbehandlerBrukerIdentDto brukerIdentDto = new SaksbehandlerBrukerIdentDto("Z999999"); - private static final SaksbehandlerDto saksbehandlerDto = new SaksbehandlerDto(brukerIdentDto, "Navn Navnesen", "navn@navnesen.no"); + private static final SaksbehandlerDto saksbehandlerDto = new SaksbehandlerDto(brukerIdentDto, "Navn Navnesen", "navn@navnesen.no", "NAV Drammen"); private AvdelingslederSaksbehandlerTjeneste avdelingslederSaksbehandlerTjeneste; @Mock private SaksbehandlerDtoTjeneste saksbehandlerDtoTjeneste;