diff --git a/README.md b/README.md index e6446b1e70..574d4981c8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ ![](https://github.com/navikt/veilarbportefolje/workflows/Build,%20push%20and%20deploy/badge.svg) -# Beskrivelse +# veilarbportefolje + +## Beskrivelse Tjeneste som aggregerer data fra andre baksystemer og håndterer oppdatering av søkeindeks brukt i modia oversikten. @@ -16,6 +18,10 @@ Følgende data aggregeres: * Informasjon om delt cv fra arbeidsplassen via Kafka * Informasjon om endring av mål fra `veilarboppfolging` via Kafka +### Swagger-dokumentasjon + +Endepunktene er dokumentert vha. Swagger/OpenAPI. Dokumentasjonen er tilgjengelig på egen sti, som i skrivende stund (08.05.24) er `https://veilarbportefoljeflate.intern.dev.nav.no/veilarbportefolje/internal/swagger-ui/index.html`. + ## Hvordan bygge Kjør `mvn clean install` diff --git a/pom.xml b/pom.xml index 835cc36fe6..862771c457 100644 --- a/pom.xml +++ b/pom.xml @@ -196,6 +196,10 @@ org.slf4j slf4j-log4j12 + + io.swagger.core.v3 + swagger-annotations + @@ -351,6 +355,13 @@ 1.12.2 + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.5.0 + + org.junit.vintage diff --git a/src/main/java/no/nav/pto/veilarbportefolje/admin/v1/AdminController.java b/src/main/java/no/nav/pto/veilarbportefolje/admin/v1/AdminController.java index 472e21d610..b46618b550 100644 --- a/src/main/java/no/nav/pto/veilarbportefolje/admin/v1/AdminController.java +++ b/src/main/java/no/nav/pto/veilarbportefolje/admin/v1/AdminController.java @@ -1,5 +1,7 @@ package no.nav.pto.veilarbportefolje.admin.v1; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.common.auth.context.AuthContextHolder; @@ -33,6 +35,7 @@ @RestController @RequestMapping("/api/admin") @RequiredArgsConstructor +@Tag(name = "Admin", description = "Admin-funksjonalitet som ikke er tilgjengelig for vanlige brukere. Funksjonaliteten er kun tilgjengelig for medlemmer av applikasjonens forvaltningsteam.") public class AdminController { private final String PTO_ADMIN = new DownstreamApi(EnvironmentUtils.isProduction().orElse(false) ? "prod-fss" : "dev-fss", "pto", "pto-admin").toString(); @@ -48,6 +51,7 @@ public class AdminController { private final PdlService pdlService; @DeleteMapping("/oppfolgingsbruker") + @Operation(summary = "Fjern bruker", description = "Sletter en bruker og fjerner tilhørende informasjon om brukeren. Brukeren vil ikke lenger eksistere i porteføljene.") public String slettOppfolgingsbruker(@RequestBody String aktoerId) { sjekkTilgangTilAdmin(); oppfolgingAvsluttetService.avsluttOppfolging(AktorId.of(aktoerId)); @@ -55,6 +59,7 @@ public String slettOppfolgingsbruker(@RequestBody String aktoerId) { } @PostMapping("/lastInnOppfolging") + @Operation(summary = "Oppdater data for alle brukere", description = "Går gjennom alle brukere i løsningen og oppdaterer oppfølgingsdata om brukere under oppfølging. Brukere som eventuelt ikke er under oppfølging slettes.") public String lastInnOppfolgingsData() { sjekkTilgangTilAdmin(); oppfolgingService.lastInnDataPaNytt(); @@ -62,6 +67,7 @@ public String lastInnOppfolgingsData() { } @PostMapping("/lastInnOppfolgingForBruker") + @Operation(summary = "Oppdater data for bruker", description = "Oppdaterer oppfølgingsdata for en gitt bruker. Dersom brukeren eventuelt ikke er under oppfølging slettes den.") public String lastInnOppfolgingsDataForBruker(@RequestBody String fnr) { sjekkTilgangTilAdmin(); String aktorId = aktorClient.hentAktorId(Fnr.ofValidFnr(fnr)).get(); @@ -87,6 +93,7 @@ public String indeksAktoerId(@RequestParam String aktorId) { } @PostMapping("/indeks/AlleBrukere") + @Operation(summary = "Indekser alle brukere", description = "Går gjennom alle brukere i løsningen og oppdaterer data om disse i søkemotoren (OpenSearch).") public String indekserAlleBrukere() { sjekkTilgangTilAdmin(); return JobRunner.runAsync("Admin_hovedindeksering", () -> { @@ -97,6 +104,7 @@ public String indekserAlleBrukere() { } @PostMapping("/indeks/AlleBrukereNyIndex") + @Operation(summary = "Indekser alle brukere på ny index", description = "Går gjennom alle brukere i løsningen og oppdaterer data om disse i søkemotoren (OpenSearch) på en ny indeks.") public String indekserAlleBrukereNyIndex() { sjekkTilgangTilAdmin(); return JobRunner.runAsync("Admin_hovedindeksering_ny_index", () -> { @@ -107,6 +115,7 @@ public String indekserAlleBrukereNyIndex() { } @PutMapping("/ytelser/allUsers") + @Operation(summary = "Oppdater ytelser for alle brukere", description = "Går gjennom alle brukere i løsningen og oppdaterer data om ytelser for disse.") public String syncYtelserForAlle() { sjekkTilgangTilAdmin(); List brukereUnderOppfolging = oppfolgingRepositoryV2.hentAlleGyldigeBrukereUnderOppfolging(); @@ -115,6 +124,7 @@ public String syncYtelserForAlle() { } @PutMapping("/ytelser/idag") + @Operation(summary = "Oppdater ytelser for alle brukere som har ytelser som starter i dag", description = "Går gjennom alle brukere i løsningen og oppdaterer data om ytelser for disse som starter i dag.") public String syncYtelserForIDag() { sjekkTilgangTilAdmin(); ytelsesService.oppdaterBrukereMedYtelserSomStarterIDag(); @@ -122,6 +132,7 @@ public String syncYtelserForIDag() { } @PostMapping("/opensearch/createIndex") + @Operation(summary = "Opprett ny indeks", description = "Oppretter en ny indeks i søkemotoren (OpenSearch).") public String createIndex() { sjekkTilgangTilAdmin(); String indexName = opensearchAdminService.opprettNyIndeks(); @@ -130,12 +141,14 @@ public String createIndex() { } @GetMapping("/opensearch/getAliases") + @Operation(summary = "Hent alle aliaser", description = "Henter alle aliaser som eksisterer i søkemotoren (OpenSearch).") public String getAliases() { sjekkTilgangTilAdmin(); return opensearchAdminService.hentAliaser(); } @PostMapping("/opensearch/deleteIndex") + @Operation(summary = "Slett indeks", description = "Sletter en indeks i søkemotoren (OpenSearch).") public boolean deleteIndex(@RequestParam String indexName) { sjekkTilgangTilAdmin(); log.info("Sletter index: {}", indexName); @@ -143,6 +156,7 @@ public boolean deleteIndex(@RequestParam String indexName) { } @PostMapping("/opensearch/assignAliasToIndex") + @Operation(summary = "Tildel alias til indeks", description = "Tildeler et alias til en indeks i søkemotoren (OpenSearch).") public String assignAliasToIndex(@RequestParam String indexName) { sjekkTilgangTilAdmin(); opensearchAdminService.opprettAliasForIndeks(indexName); @@ -150,6 +164,7 @@ public String assignAliasToIndex(@RequestParam String indexName) { } @PostMapping("/opensearch/getSettings") + @Operation(summary = "Hent innstillinger for indeks", description = "Henter innstillinger for en indeks i søkemotoren (OpenSearch).") public String getSettings(@RequestParam String indexName) { sjekkTilgangTilAdmin(); validerIndexName(indexName); @@ -157,18 +172,21 @@ public String getSettings(@RequestParam String indexName) { } @PostMapping("/opensearch/fixReadOnlyMode") + @Operation(summary = "Fjern read only mode", description = "Fjerner read only mode på en indeks i søkemotoren (OpenSearch).") public String fixReadOnlyMode() { sjekkTilgangTilAdmin(); return opensearchAdminService.updateFromReadOnlyMode(); } @PostMapping("/opensearch/forceShardAssignment") + @Operation(summary = "Tving shard assignment", description = "Tvinger shard assignment på en indeks i søkemotoren (OpenSearch).") public String forceShardAssignment() { sjekkTilgangTilAdmin(); return opensearchAdminService.forceShardAssignment(); } @PostMapping("/pdl/lastInnDataFraPdl") + @Operation(summary = "Last inn PDL-data", description = "Henter og lagrer data fra PDL (identer, personalia og foreldreansvar) for alle brukere i løsningen.") public String lastInnPDLBrukerData() { sjekkTilgangTilAdmin(); AtomicInteger antall = new AtomicInteger(0); @@ -203,6 +221,7 @@ public String lastInnPDLBrukerData(@RequestParam String fnr) { @PostMapping("/test/postgresIndeksering") + @Operation(summary = "Test indeksering av brukere", description = "Går gjennom alle brukere i løsningen og gjør en dry-run av mapping til datamodell som benyttes av søkemotoren (OpenSearch).") public void testHentUnderOppfolging() { sjekkTilgangTilAdmin(); List brukereUnderOppfolging = oppfolgingRepositoryV2.hentAlleGyldigeBrukereUnderOppfolging(); diff --git a/src/main/java/no/nav/pto/veilarbportefolje/admin/v2/AdminV2Controller.java b/src/main/java/no/nav/pto/veilarbportefolje/admin/v2/AdminV2Controller.java index 41cfaa4cad..71cf57b7ef 100644 --- a/src/main/java/no/nav/pto/veilarbportefolje/admin/v2/AdminV2Controller.java +++ b/src/main/java/no/nav/pto/veilarbportefolje/admin/v2/AdminV2Controller.java @@ -1,5 +1,7 @@ package no.nav.pto.veilarbportefolje.admin.v2; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.common.auth.context.AuthContextHolder; @@ -20,6 +22,7 @@ @RestController @RequestMapping("/api/v2/admin") @RequiredArgsConstructor +@Tag(name = "Admin V2", description = "Admin-funksjonalitet V2 som ikke er tilgjengelig for vanlige brukere. Funksjonaliteten er kun tilgjengelig for medlemmer av applikasjonens forvaltningsteam.") public class AdminV2Controller { private final String PTO_ADMIN = new DownstreamApi(EnvironmentUtils.isProduction().orElse(false) ? "prod-fss" : "dev-fss", "pto", "pto-admin").toString(); @@ -27,6 +30,7 @@ public class AdminV2Controller { private final OpensearchIndexer opensearchIndexer; private final AuthContextHolder authContextHolder; + @Operation(summary = "Indekser bruker med fødselsnummer", description = "Hent og skriv oppdatert data for bruker, gitt ved fødselsnummer, til søkemotoren (OpenSearch).") @PutMapping("/indeks/bruker/fnr") public String indeks(@RequestBody AdminIndeksBrukerRequest adminIndeksBrukerRequest) { sjekkTilgangTilAdmin(); @@ -35,6 +39,7 @@ public String indeks(@RequestBody AdminIndeksBrukerRequest adminIndeksBrukerRequ return "Indeksering fullfort"; } + @Operation(summary = "Indekser bruker med Aktør-ID", description = "Hent og skriv oppdatert data for bruker, gitt ved Aktør-ID, til søkemotoren (OpenSearch).") @PutMapping("/indeks/bruker") public String indeksAktoerId(@RequestBody AdminIndexAktorRequest adminIndexAktorRequest) { sjekkTilgangTilAdmin(); diff --git a/src/main/java/no/nav/pto/veilarbportefolje/arbeidsliste/v1/ArbeidsListeController.java b/src/main/java/no/nav/pto/veilarbportefolje/arbeidsliste/v1/ArbeidsListeController.java index 50cb54730c..17d5f61287 100644 --- a/src/main/java/no/nav/pto/veilarbportefolje/arbeidsliste/v1/ArbeidsListeController.java +++ b/src/main/java/no/nav/pto/veilarbportefolje/arbeidsliste/v1/ArbeidsListeController.java @@ -1,5 +1,7 @@ package no.nav.pto.veilarbportefolje.arbeidsliste.v1; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import io.vavr.control.Validation; import lombok.extern.slf4j.Slf4j; import no.nav.common.types.identer.AktorId; @@ -35,6 +37,7 @@ @Slf4j @RestController @RequestMapping("/api/arbeidsliste") +@Tag(name = "Arbeidsliste", description = "Arbeidsliste-funksjonalitet") public class ArbeidsListeController { private final ArbeidslisteService arbeidslisteService; private final BrukerServiceV2 brukerService; @@ -54,6 +57,7 @@ public ArbeidsListeController( @PostMapping + @Operation(summary = "Opprett arbeidslister", description = "Oppretter arbeidslister for et sett med brukere.") public ResponseEntity opprettArbeidsListe(@RequestBody List arbeidsliste) { authService.innloggetVeilederHarTilgangTilOppfolging(); List tilgangErrors = getTilgangErrors(arbeidsliste); @@ -75,7 +79,12 @@ public ResponseEntity opprettArbeidsListe(@RequestBody List return response.data.isEmpty() ? response.badRequest() : response.created(); } + /** + * @deprecated Skal fjernes høsten 2024 når arbeidslistene slettes. + */ @GetMapping("{fnr}") + @Deprecated(forRemoval = true) + @Operation(summary = "Hent arbeidsliste", description = "Henter arbeidsliste for en gitt bruker.") public Arbeidsliste getArbeidsListe(@PathVariable("fnr") String fnrString) { validerOppfolgingOgBruker(fnrString); @@ -97,7 +106,12 @@ public Arbeidsliste getArbeidsListe(@PathVariable("fnr") String fnrString) { return harVeilederTilgang ? arbeidsliste : emptyArbeidsliste().setHarVeilederTilgang(false); } + /** + * @deprecated Skal fjernes høsten 2024 når arbeidslistene slettes. + */ @PostMapping("{fnr}") + @Deprecated(forRemoval = true) + @Operation(summary = "Opprett arbeidsliste", description = "Oppretter en arbeidsliste for en gitt bruker.") public Arbeidsliste opprettArbeidsListe(@RequestBody ArbeidslisteRequest body, @PathVariable("fnr") String fnr) { validerOppfolgingOgBruker(fnr); sjekkTilgangTilEnhet(Fnr.ofValidFnr(fnr)); @@ -111,7 +125,12 @@ public Arbeidsliste opprettArbeidsListe(@RequestBody ArbeidslisteRequest body, @ .setIsOppfolgendeVeileder(true); } + /** + * @deprecated Skal fjernes høsten 2024 når arbeidslistene slettes. + */ @PutMapping("{fnr}") + @Deprecated(forRemoval = true) + @Operation(summary = "Oppdater arbeidsliste", description = "Oppdaterer en arbeidsliste med nye felter for en gitt bruker.") public Arbeidsliste oppdaterArbeidsListe(@RequestBody ArbeidslisteRequest body, @PathVariable("fnr") String fnrString) { validerOppfolgingOgBruker(fnrString); Fnr fnr = Fnr.ofValidFnr(fnrString); @@ -137,7 +156,12 @@ public Arbeidsliste oppdaterArbeidsListe(@RequestBody ArbeidslisteRequest body, AuthUtils.getInnloggetVeilederIdent())); } + /** + * @deprecated Skal fjernes høsten 2024 når arbeidslistene slettes. + */ @DeleteMapping("{fnr}") + @Deprecated(forRemoval = true) + @Operation(summary = "Slett arbeidsliste", description = "Sletter en arbeidsliste for en gitt bruker.") public Arbeidsliste deleteArbeidsliste(@PathVariable("fnr") String fnr) { validerOppfolgingOgBruker(fnr); sjekkTilgangTilEnhet(Fnr.ofValidFnr(fnr)); @@ -156,6 +180,7 @@ public Arbeidsliste deleteArbeidsliste(@PathVariable("fnr") String fnr) { } @PostMapping("/delete") + @Operation(summary = "Slett arbeidslister", description = "Sletter arbeidslister for et sett med brukere.") public RestResponse deleteArbeidslisteListe(@RequestBody java.util.List arbeidslisteData) { authService.innloggetVeilederHarTilgangTilOppfolging(); diff --git a/src/main/java/no/nav/pto/veilarbportefolje/arbeidsliste/v2/ArbeidsListeV2Controller.java b/src/main/java/no/nav/pto/veilarbportefolje/arbeidsliste/v2/ArbeidsListeV2Controller.java index fb811f4185..6d952e83cb 100644 --- a/src/main/java/no/nav/pto/veilarbportefolje/arbeidsliste/v2/ArbeidsListeV2Controller.java +++ b/src/main/java/no/nav/pto/veilarbportefolje/arbeidsliste/v2/ArbeidsListeV2Controller.java @@ -1,5 +1,7 @@ package no.nav.pto.veilarbportefolje.arbeidsliste.v2; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import io.vavr.control.Validation; import lombok.extern.slf4j.Slf4j; import no.nav.common.types.identer.Fnr; @@ -29,6 +31,7 @@ @Slf4j @RestController @RequestMapping("/api/v2") +@Tag(name = "Arbeidsliste", description = "Arbeidsliste-funksjonalitet") public class ArbeidsListeV2Controller { private final ArbeidslisteService arbeidslisteService; private final BrukerServiceV2 brukerService; @@ -49,6 +52,7 @@ public ArbeidsListeV2Controller( } @PostMapping("/hent-arbeidsliste") + @Operation(summary = "Hent arbeidsliste for bruker", description = "Henter arbeidsliste for en gitt bruker.") public Arbeidsliste getArbeidsListe(@RequestBody ArbeidslisteForBrukerRequest arbeidslisteForBrukerRequest) { validerOppfolgingOgBruker(arbeidslisteForBrukerRequest.fnr().get()); @@ -72,6 +76,7 @@ public Arbeidsliste getArbeidsListe(@RequestBody ArbeidslisteForBrukerRequest ar } @PostMapping("/arbeidsliste") + @Operation(summary = "Opprett arbeidsliste for bruker", description = "Oppretter en ny arbeidsliste for en gitt bruker.") public Arbeidsliste opprettArbeidsListe(@RequestBody ArbeidslisteV2Request body) { validerOppfolgingOgBruker(body.fnr().get()); Fnr gyldigFnr = Fnr.ofValidFnr(body.fnr().get()); @@ -87,6 +92,7 @@ public Arbeidsliste opprettArbeidsListe(@RequestBody ArbeidslisteV2Request body) } @PutMapping("/arbeidsliste") + @Operation(summary = "Oppdater arbeidsliste", description = "Oppdaterer en arbeidsliste med nye felter for en gitt bruker.") public Arbeidsliste oppdaterArbeidsListe(@RequestBody ArbeidslisteV2Request body) { validerOppfolgingOgBruker(body.fnr().get()); Fnr fnr = Fnr.ofValidFnr(body.fnr().get()); @@ -113,6 +119,7 @@ public Arbeidsliste oppdaterArbeidsListe(@RequestBody ArbeidslisteV2Request body } @DeleteMapping("/arbeidsliste") + @Operation(summary = "Slett arbeidsliste", description = "Sletter en arbeidsliste for en gitt bruker.") public Arbeidsliste deleteArbeidsliste( @RequestBody ArbeidslisteForBrukerRequest arbeidslisteForBrukerRequest, @RequestParam(value = "slettFargekategori", required = false, defaultValue = "true") Boolean slettFargekategori diff --git a/src/main/java/no/nav/pto/veilarbportefolje/controller/EnhetController.java b/src/main/java/no/nav/pto/veilarbportefolje/controller/EnhetController.java index f00bcacd84..6122d47a8d 100644 --- a/src/main/java/no/nav/pto/veilarbportefolje/controller/EnhetController.java +++ b/src/main/java/no/nav/pto/veilarbportefolje/controller/EnhetController.java @@ -2,6 +2,8 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import no.nav.common.types.identer.EnhetId; import no.nav.pto.veilarbportefolje.arenapakafka.aktiviteter.TiltakService; @@ -25,6 +27,7 @@ @RestController @RequiredArgsConstructor @RequestMapping("/api/enhet") +@Tag(name = "Enhet", description = "Portefølje-funksjonalitet på enhetsnivå.") public class EnhetController { private final OpensearchService opensearchService; private final AuthService authService; @@ -48,6 +51,7 @@ public class EnhetController { .build(); @PostMapping("/{enhet}/portefolje") + @Operation(summary = "Hent portefølje for enhet", description = "Henter en liste med brukere under oppfølging knyttet til enheten.") public Portefolje hentPortefoljeForEnhet( @PathVariable("enhet") String enhet, @RequestParam(value = "fra", required = false) Integer fra, @@ -72,6 +76,7 @@ public Portefolje hentPortefoljeForEnhet( } @GetMapping("/{enhet}/portefoljestorrelser") + @Operation(summary = "Hent porteføljestørrelser for enhet", description = "Henter antall brukere i porteføljen til hver veileder på en gitt enhet.") public FacetResults hentPortefoljestorrelser(@PathVariable("enhet") String enhet) { ValideringsRegler.sjekkEnhet(enhet); authService.innloggetVeilederHarTilgangTilEnhet(enhet); @@ -80,6 +85,7 @@ public FacetResults hentPortefoljestorrelser(@PathVariable("enhet") String enhet } @GetMapping("/{enhet}/portefolje/statustall") + @Operation(summary = "Hent statustall for enhetsportefølje", description = "Henter statustall på enhetsnivå (statistikk for alle brukere under oppfølging tilknyttet enheten), delt opp i brukere som veileder som utfører forespørselen har tilgang til og brukere som veileder ikke har tilgang til å se detaljer om.") public EnhetPortefoljeStatustallRespons hentEnhetPortefoljeStatustall(@PathVariable("enhet") String enhet) { ValideringsRegler.sjekkEnhet(enhet); authService.innloggetVeilederHarTilgangTilEnhet(enhet); @@ -91,6 +97,7 @@ public EnhetPortefoljeStatustallRespons hentEnhetPortefoljeStatustall(@PathVaria } @GetMapping("/{enhet}/tiltak") + @Operation(summary = "Hent tiltak for enhet", description = "Henter alle tiltakstyper for enheten hvor minst én bruker er tilknyttet tiltaket.") public EnhetTiltak hentTiltak(@PathVariable("enhet") String enhet) { ValideringsRegler.sjekkEnhet(enhet); authService.innloggetVeilederHarTilgangTilEnhet(enhet); @@ -99,6 +106,7 @@ public EnhetTiltak hentTiltak(@PathVariable("enhet") String enhet) { } @GetMapping("/{enhet}/foedeland") + @Operation(summary = "Hent fødeland for enhet", description = "Henter en liste av fødeland for brukere på enheten. Listen inneholder kun land som er registrert på brukere på enheten.") public List hentFoedeland( @PathVariable("enhet") String enhet) { @@ -110,6 +118,7 @@ public List hentFoedeland( } @GetMapping("/{enhet}/tolkSpraak") + @Operation(summary = "Hent språk med tolkebehov for enhet", description = "Henter en liste av språk for enheten hvor det er tolkebehov. Listen inneholder kun språk som er registrert på brukere på enheten.") public List hentTolkSpraak( @PathVariable("enhet") String enhet) { @@ -122,6 +131,7 @@ public List hentTolkSpraak( @GetMapping("/{enhet}/geografiskbosted") + @Operation(summary = "Hent geografiske bosteder for enhet", description = "Henter en liste av geografiske bosteder (kommuner og bydeler) for enheten. Listen inneholder kun geografiske bosteder som er registrert på brukere på enheten.") public List hentGeografiskBosted( @PathVariable("enhet") String enhet) { diff --git a/src/main/java/no/nav/pto/veilarbportefolje/controller/Frontendlogger.java b/src/main/java/no/nav/pto/veilarbportefolje/controller/Frontendlogger.java index 3a58c9193b..599f141372 100644 --- a/src/main/java/no/nav/pto/veilarbportefolje/controller/Frontendlogger.java +++ b/src/main/java/no/nav/pto/veilarbportefolje/controller/Frontendlogger.java @@ -1,5 +1,7 @@ package no.nav.pto.veilarbportefolje.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.experimental.Accessors; @@ -20,10 +22,12 @@ @RestController @RequiredArgsConstructor @RequestMapping("/api/logger") +@Tag(name = "Frontendlogger", description = "Frontendlogger-funksjonalitet") public class Frontendlogger { private final MetricsClient metricsClient; @PostMapping("/event") + @Operation(summary = "Skriv event til Influx", description = "Registrerer en frontend-hendelse og sender til InfluxDB.") public void skrivEventTilInflux(@RequestBody FrontendEvent event) { Event toInflux = new Event(event.name + ".event"); if (event.getTags() != null) { diff --git a/src/main/java/no/nav/pto/veilarbportefolje/controller/VeilederController.java b/src/main/java/no/nav/pto/veilarbportefolje/controller/VeilederController.java index 25c00c1a82..bf96bb87e6 100644 --- a/src/main/java/no/nav/pto/veilarbportefolje/controller/VeilederController.java +++ b/src/main/java/no/nav/pto/veilarbportefolje/controller/VeilederController.java @@ -1,5 +1,7 @@ package no.nav.pto.veilarbportefolje.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.common.types.identer.EnhetId; @@ -22,6 +24,7 @@ @RestController @RequiredArgsConstructor @RequestMapping("/api/veileder") +@Tag(name = "Veileder", description = "Portefølje-funksjonalitet på veiledernivå.") public class VeilederController { private final OpensearchService opensearchService; private final AuthService authService; @@ -29,6 +32,7 @@ public class VeilederController { private final AktivitetService aktivitetService; @PostMapping("/{veilederident}/portefolje") + @Operation(summary = "Hent portefølje for veileder", description = "Henter en liste med brukere under oppfølging som er tilordnet veilederen.") public Portefolje hentPortefoljeForVeileder( @PathVariable("veilederident") String veilederIdent, @RequestParam("enhet") String enhet, @@ -55,6 +59,7 @@ public Portefolje hentPortefoljeForVeileder( } @GetMapping("/{veilederident}/portefolje/statustall") + @Operation(summary = "Hent statustall for veilederportefølje", description = "Henter statustall på veileder (statistikk for alle brukere under oppfølging tilordnet veilederen).") public VeilederPortefoljeStatustallRespons hentVeilederportefoljeStatustall(@PathVariable("veilederident") String veilederIdent, @RequestParam("enhet") String enhet) { ValideringsRegler.sjekkEnhet(enhet); ValideringsRegler.sjekkVeilederIdent(veilederIdent, false); @@ -66,6 +71,7 @@ public VeilederPortefoljeStatustallRespons hentVeilederportefoljeStatustall(@Pat } @GetMapping("/{veilederident}/hentArbeidslisteForVeileder") + @Operation(summary = "Hent arbeidslister for veileder", description = "Henter en liste av arbeidslister for en gitt veileder på en gitt enhet.") public List hentArbeidslisteForVeileder(@PathVariable("veilederident") VeilederId veilederIdent, @RequestParam("enhet") EnhetId enhet) { ValideringsRegler.sjekkEnhet(enhet.get()); ValideringsRegler.sjekkVeilederIdent(veilederIdent.getValue(), false); @@ -75,6 +81,7 @@ public List hentArbeidslisteForVeileder(@PathVariable("veilederide } @GetMapping("{veilederident}/moteplan") + @Operation(summary = "Hent møteplan for veileder", description = "Henter en liste av fremtidige møter for en gitt veileder på en gitt enhet.") public List hentMoteplanForVeileder(@PathVariable("veilederident") VeilederId veilederIdent, @RequestParam("enhet") EnhetId enhet) { ValideringsRegler.sjekkEnhet(enhet.get()); ValideringsRegler.sjekkVeilederIdent(veilederIdent.getValue(), false); diff --git a/src/main/java/no/nav/pto/veilarbportefolje/fargekategori/FargekategoriController.java b/src/main/java/no/nav/pto/veilarbportefolje/fargekategori/FargekategoriController.java index c08e69fe67..3cfe919589 100644 --- a/src/main/java/no/nav/pto/veilarbportefolje/fargekategori/FargekategoriController.java +++ b/src/main/java/no/nav/pto/veilarbportefolje/fargekategori/FargekategoriController.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import no.nav.common.types.identer.AktorId; import no.nav.common.types.identer.EnhetId; @@ -28,6 +30,7 @@ @RestController @RequestMapping("/api/v1") @RequiredArgsConstructor +@Tag(name = "Fargekategori", description = "Fargekategori-funksjonalitet") public class FargekategoriController { private final FargekategoriService fargekategoriService; @@ -35,6 +38,7 @@ public class FargekategoriController { private final BrukerServiceV2 brukerServiceV2; @PostMapping("/hent-fargekategori") + @Operation(summary = "Hent fargekategori for bruker", description = "Henter fargekategorien en gitt bruker er merket med.") public ResponseEntity hentFargekategoriForBruker(@RequestBody HentFargekategoriRequest request) { validerRequest(request.fnr); @@ -59,6 +63,7 @@ public ResponseEntity hentFargekategoriForBruker(@RequestBo } @PutMapping("/fargekategorier") + @Operation(summary = "Sett fargekategori for bruker(e)", description = "Setter en fargekategori for en eller flere brukere i samme operasjon.") public ResponseEntity batchoppdaterFargekategoriForBruker(@RequestBody BatchoppdaterFargekategoriRequest request) { VeilederId innloggetVeileder = AuthUtils.getInnloggetVeilederIdent(); authService.innloggetVeilederHarTilgangTilOppfolging(); diff --git a/src/main/java/no/nav/pto/veilarbportefolje/huskelapp/controller/HuskelappController.java b/src/main/java/no/nav/pto/veilarbportefolje/huskelapp/controller/HuskelappController.java index b211d7c08c..cd4e4cd903 100644 --- a/src/main/java/no/nav/pto/veilarbportefolje/huskelapp/controller/HuskelappController.java +++ b/src/main/java/no/nav/pto/veilarbportefolje/huskelapp/controller/HuskelappController.java @@ -1,5 +1,7 @@ package no.nav.pto.veilarbportefolje.huskelapp.controller; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import io.vavr.control.Validation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -32,6 +34,7 @@ @RequestMapping("/api/v1") @RequiredArgsConstructor @Slf4j +@Tag(name = "Huskelapp", description = "Huskelapp-funksjonalitet") public class HuskelappController { private final HuskelappService huskelappService; @@ -40,6 +43,7 @@ public class HuskelappController { private final VeilarbVeilederClient veilarbVeilederClient; @PostMapping("/huskelapp") + @Operation(summary = "Opprett huskelapp", description = "Oppretter en huskelapp for en gitt bruker på en gitt enhet.") public ResponseEntity opprettHuskelapp(@RequestBody HuskelappOpprettRequest huskelappOpprettRequest) { validerOppfolgingOgBrukerOgEnhet(huskelappOpprettRequest.brukerFnr().get()); try { @@ -62,6 +66,7 @@ public ResponseEntity opprettHuskelapp(@RequestBody Hu } @PutMapping("/huskelapp") + @Operation(summary = "Oppdater huskelapp", description = "Oppdaterer huskelappen for en gitt bruker med nye felter.") public ResponseEntity redigerHuskelapp(@RequestBody HuskelappRedigerRequest huskelappRedigerRequest) { validerOppfolgingOgBrukerOgEnhet(huskelappRedigerRequest.brukerFnr().get()); try { @@ -86,6 +91,7 @@ public ResponseEntity redigerHuskelapp(@RequestBody HuskelappRedigerRequest husk } @PostMapping("/hent-huskelapp-for-bruker") + @Operation(summary = "Hent huskelapp for bruker", description = "Henter aktiv huskelapp for en gitt bruker.") public ResponseEntity hentHuskelapp(@RequestBody HuskelappForBrukerRequest huskelappForBrukerRequest) { validerOppfolgingOgBrukerOgEnhet(huskelappForBrukerRequest.fnr().get()); try { @@ -97,6 +103,7 @@ public ResponseEntity hentHuskelapp(@RequestBody HuskelappFor } @DeleteMapping("/huskelapp") + @Operation(summary = "Slett huskelapp", description = "Setter huskelapp som inaktiv i databasen og sletter den fra søkemotoren (OpenSearch).") public ResponseEntity slettHuskelapp(@RequestBody HuskelappSlettRequest huskelappSlettRequest) { Optional huskelappOptional = huskelappService.hentHuskelapp(UUID.fromString(huskelappSlettRequest.huskelappId())); @@ -124,6 +131,7 @@ public Boolean harBrukerenTildeltVeileder(Fnr fnr) { } @PostMapping("/hent-er-bruker-ufordelt") + @Operation(summary = "Hent om bruker er ufordelt", description = "Sjekker om bruker er ufordelt og returnerer true hvis bruker er ufordelt.") public ResponseEntity hentErBrukerUfordelt(@RequestBody HentErBrukerUfordelt request) { Optional navKontor = brukerServiceV2.hentNavKontor(request.fnr); if (navKontor.isEmpty()) { diff --git a/src/main/java/no/nav/pto/veilarbportefolje/internal/InternalController.java b/src/main/java/no/nav/pto/veilarbportefolje/internal/InternalController.java index 0afe81494f..b8b50bbcb7 100644 --- a/src/main/java/no/nav/pto/veilarbportefolje/internal/InternalController.java +++ b/src/main/java/no/nav/pto/veilarbportefolje/internal/InternalController.java @@ -1,5 +1,7 @@ package no.nav.pto.veilarbportefolje.internal; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import no.nav.common.health.selftest.SelfTestChecks; import no.nav.common.health.selftest.SelfTestUtils; @@ -18,18 +20,22 @@ @RestController @RequiredArgsConstructor @RequestMapping("/internal") +@Tag(name = "Internal", description = "Intern funksjonalitet. Benyttes hovedsakelig av kjøretidsplattformen.") public class InternalController { private final SelfTestChecks selfTestChecks; @GetMapping("/isReady") + @Operation(summary = "Applikasjon klar for trafikk", description = "Sjekker om applikasjonen er klar til å motta trafikk.") public void isReady() { } @GetMapping("/isAlive") + @Operation(summary = "Applikasjon kjører", description = "Sjekker om applikasjonen kjører.") public void isAlive() { } @GetMapping("/selftest") + @Operation(summary = "Sjekk applikasjonens helsesjekker", description = "Utfører helsesjekk for tjenester som applikasjonen er avhengig av og generer rapport.") public ResponseEntity selftest() { List results = checkAllParallel(selfTestChecks.getSelfTestChecks()); String html = SelftestHtmlGenerator.generate(results); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index eaec97a481..aa67df1983 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,6 +12,9 @@ management.endpoints.web.base-path=/internal management.endpoints.web.exposure.include=prometheus management.endpoint.prometheus.enabled=true management.prometheus.metrics.export.enabled=true +# swagger-ui custom path +springdoc.swagger-ui.path=/internal/swagger-ui.html +springdoc.pathsToMatch=/api/** # Application environment app.env.opensearchUri=${OPEN_SEARCH_URI} app.env.opensearchUsername=${OPEN_SEARCH_USERNAME}