diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingFactory.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingFactory.kt index 9b18dfa7faa..ef324629738 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingFactory.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingFactory.kt @@ -23,6 +23,7 @@ import no.nav.etterlatte.libs.common.behandling.Prosesstype import no.nav.etterlatte.libs.common.behandling.Revurderingaarsak import no.nav.etterlatte.libs.common.behandling.SakType import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException +import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException import no.nav.etterlatte.libs.common.grunnlag.Grunnlagsopplysning import no.nav.etterlatte.libs.common.grunnlag.NyeSaksopplysninger @@ -180,7 +181,7 @@ class BehandlingFactory( kilde: Vedtaksloesning, request: DataHentetForOpprettBehandling, prosessType: Prosesstype = Prosesstype.MANUELL, - ): BehandlingOgOppgave? { + ): BehandlingOgOppgave { logger.info("Starter behandling i sak $sakId") return if (request.harIverksattBehandling()) { @@ -211,8 +212,13 @@ class BehandlingFactory( kilde, prosessType, ) - ?: return null - runBlocking { grunnlagService.leggInnNyttGrunnlag(behandling, persongalleri, HardkodaSystembruker.opprettGrunnlag) } + runBlocking { + grunnlagService.leggInnNyttGrunnlag( + behandling, + persongalleri, + HardkodaSystembruker.opprettGrunnlag, + ) + } val oppgave = oppgaveService.opprettFoerstegangsbehandlingsOppgaveForInnsendtSoeknad( referanse = behandling.id.toString(), @@ -247,7 +253,8 @@ class BehandlingFactory( inTransaction { val sak = sakService.finnSak(sakId) ?: throw GenerellIkkeFunnetException() val behandlingerISak = behandlingDao.hentBehandlingerForSak(sakId) - val foerstegangsbehandlinger = behandlingerISak.filter { it.type == BehandlingType.FØRSTEGANGSBEHANDLING } + val foerstegangsbehandlinger = + behandlingerISak.filter { it.type == BehandlingType.FØRSTEGANGSBEHANDLING } if (foerstegangsbehandlinger.isEmpty()) { throw AvslagOmgjoering.IngenFoerstegangsbehandling() } @@ -270,7 +277,9 @@ class BehandlingFactory( } val sisteAvslaatteBehandling = - behandlingerISak.filter { it.status == BehandlingStatus.AVSLAG }.maxByOrNull { it.behandlingOpprettet } + behandlingerISak + .filter { it.status == BehandlingStatus.AVSLAG } + .maxByOrNull { it.behandlingOpprettet } val foerstegangsbehandlingViOmgjoerer = foerstegangsbehandlinger.maxBy { it.behandlingOpprettet } @@ -378,7 +387,7 @@ class BehandlingFactory( mottattDato: String?, kilde: Vedtaksloesning, prosessType: Prosesstype, - ): Behandling? { + ): Behandling { behandlingerUnderBehandling.forEach { behandlingDao.lagreStatus(it.id, BehandlingStatus.AVBRUTT, LocalDateTime.now()) oppgaveService.avbrytAapneOppgaverMedReferanse(it.id.toString()) @@ -399,6 +408,10 @@ class BehandlingFactory( logger.info("Opprettet behandling ${opprettBehandling.id} i sak ${opprettBehandling.sakId}") behandlingDao.hentBehandling(opprettBehandling.id) + ?: throw InternfeilException( + "Behandlingen vi akkurat opprettet finnes ikke i databasen. Id burde være " + + "${opprettBehandling.id}, i sak ${opprettBehandling.sakId}", + ) } } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingRoutes.kt index a3972006f42..80ce4a8406e 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingRoutes.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingRoutes.kt @@ -31,6 +31,9 @@ import no.nav.etterlatte.libs.common.behandling.NyBehandlingRequest import no.nav.etterlatte.libs.common.behandling.RedigertFamilieforhold import no.nav.etterlatte.libs.common.behandling.SendBrev import no.nav.etterlatte.libs.common.behandling.Utlandstilknytning +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException +import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException +import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException import no.nav.etterlatte.libs.common.grunnlag.Grunnlagsopplysning import no.nav.etterlatte.libs.common.gyldigSoeknad.GyldighetsResultat import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt @@ -68,7 +71,8 @@ internal fun Route.behandlingRoutes( val request = call.receive() request.validerPersongalleri() - val gjeldendeEnhet = inTransaction { behandlingFactory.finnGjeldendeEnhet(request.persongalleri, request.sakType) } + val gjeldendeEnhet = + inTransaction { behandlingFactory.finnGjeldendeEnhet(request.persongalleri, request.sakType) } kunSkrivetilgang(enhetNr = gjeldendeEnhet) { val behandling = behandlingFactory.opprettSakOgBehandlingForOppgave(request, brukerTokenInfo) @@ -79,7 +83,8 @@ internal fun Route.behandlingRoutes( post("/api/behandling/omgjoer-avslag-avbrudd/{$SAKID_CALL_PARAMETER}") { kunSaksbehandlerMedSkrivetilgang { saksbehandler -> val skalKopiereRequest = call.receive() - val behandlingOgOppgave = behandlingFactory.opprettOmgjoeringAvslag(sakId, saksbehandler, skalKopiereRequest.skalKopiere) + val behandlingOgOppgave = + behandlingFactory.opprettOmgjoeringAvslag(sakId, saksbehandler, skalKopiereRequest.skalKopiere) call.respond(behandlingOgOppgave.toBehandlingSammendrag()) } } @@ -111,7 +116,7 @@ internal fun Route.behandlingRoutes( ) } ) { - null -> call.respond(HttpStatusCode.NotFound) + null -> throw GenerellIkkeFunnetException() else -> call.respond(HttpStatusCode.OK, lagretGyldighetsResultat) } } @@ -132,8 +137,11 @@ internal fun Route.behandlingRoutes( inTransaction { kommerBarnetTilGodeService.lagreKommerBarnetTilgode(kommerBarnetTilgode) } call.respond(HttpStatusCode.OK, kommerBarnetTilgode) } catch (e: TilstandException.UgyldigTilstand) { - logger.warn("Ugyldig tilstand for lagre kommer barnet til gode", e) - call.respond(HttpStatusCode.BadRequest, "Kunne ikke endre på feltet") + throw UgyldigForespoerselException( + "UGYLDIG_TILSTAND_BEHANDLING", + "Ugyldig tilstand i behandling for å lagre kommer barnet til gode", + cause = e, + ) } } } @@ -353,7 +361,10 @@ internal fun Route.behandlingRoutes( logger.info("Henter detaljert behandling for behandling med id=$behandlingId") when (val behandling = inTransaction { behandlingService.hentDetaljertBehandling(behandlingId, brukerTokenInfo) }) { is DetaljertBehandling -> call.respond(behandling) - else -> call.respond(HttpStatusCode.NotFound, "Fant ikke behandling med id=$behandlingId") + else -> throw IkkeFunnetException( + "FANT_IKKE_BEHANDLING", + "Fant ikke behandling med id=$behandlingId", + ) } } @@ -375,22 +386,18 @@ internal fun Route.behandlingRoutes( inTransaction { behandlingFactory.hentDataForOpprettBehandling(behandlingsBehov.sakId) } - when ( - val behandling = - inTransaction { - behandlingFactory.opprettBehandling( - behandlingsBehov.sakId, - behandlingsBehov.persongalleri, - behandlingsBehov.mottattDato, - Vedtaksloesning.GJENNY, - request = request, - ) - }?.also { it.sendMeldingForHendelse() } - ?.behandling - ) { - null -> call.respond(HttpStatusCode.NotFound) - else -> call.respondText(behandling.id.toString()) - } + val behandlingOgOppgave = + inTransaction { + behandlingFactory.opprettBehandling( + behandlingsBehov.sakId, + behandlingsBehov.persongalleri, + behandlingsBehov.mottattDato, + Vedtaksloesning.GJENNY, + request = request, + ) + } + behandlingOgOppgave.sendMeldingForHendelse() + call.respondText(behandlingOgOppgave.behandling.id.toString()) } } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingVedtakRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingVedtakRoute.kt index 5213ddcfd33..a40d796a7eb 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingVedtakRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/BehandlingVedtakRoute.kt @@ -8,13 +8,23 @@ import io.ktor.server.routing.Route import io.ktor.server.routing.post import io.ktor.server.routing.route import no.nav.etterlatte.inTransaction +import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException +import no.nav.etterlatte.libs.common.oppgave.SakIdOgReferanse import no.nav.etterlatte.libs.common.oppgave.VedtakEndringDTO +import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.common.vedtak.VedtakType import no.nav.etterlatte.libs.ktor.token.brukerTokenInfo import no.nav.etterlatte.tilgangsstyring.kunSkrivetilgang import java.util.UUID +class BehandlingIkkeFunnetException( + sakId: SakId, + behandlingId: String, +) : IkkeFunnetException("BEHANLDING_IKKE_FUNNET", "Behandling med $behandlingId ble ikke funnet i sak $sakId") { + constructor(referanse: SakIdOgReferanse) : this(referanse.sakId, referanse.referanse) +} + internal fun Route.behandlingVedtakRoute( behandlingsstatusService: BehandlingStatusService, behandlingService: BehandlingService, @@ -29,24 +39,21 @@ internal fun Route.behandlingVedtakRoute( behandlingService.hentBehandling( UUID.fromString(vedtak.sakIdOgReferanse.referanse), ) + } ?: throw BehandlingIkkeFunnetException(vedtak.sakIdOgReferanse) + inTransaction { + behandlingsstatusService.settFattetVedtak(behandling, vedtak, brukerTokenInfo) + + if (vedtak.vedtakType == VedtakType.OPPHOER) { + behandlingService.lagreOpphoerFom( + behandling.id, + vedtak.opphoerFraOgMed ?: throw UgyldigForespoerselException( + code = "MANGLER_OPPHOER_FOM", + detail = "Vedtak for ${behandling.id} mangler opphør fra og med dato", + ), + ) } - if (behandling == null) { - call.respond(HttpStatusCode.NotFound, "Fant ingen behandling") - } else { - inTransaction { - behandlingsstatusService.settFattetVedtak(behandling, vedtak, brukerTokenInfo) - if (vedtak.vedtakType == VedtakType.OPPHOER) { - behandlingService.lagreOpphoerFom( - behandling.id, - vedtak.opphoerFraOgMed ?: throw UgyldigForespoerselException( - code = "MANGLER_OPPHOER_FOM", - detail = "Vedtak for ${behandling.id} mangler opphør fra og med dato", - ), - ) - } - } - call.respond(HttpStatusCode.OK) } + call.respond(HttpStatusCode.OK) } } } @@ -60,15 +67,11 @@ internal fun Route.behandlingVedtakRoute( behandlingService.hentBehandling( UUID.fromString(underkjennVedtakOppgave.sakIdOgReferanse.referanse), ) - } - if (behandling == null) { - call.respond(HttpStatusCode.NotFound, "Fant ingen behandling") - } else { - inTransaction { - behandlingsstatusService.settReturnertVedtak(behandling, underkjennVedtakOppgave) - } - call.respond(HttpStatusCode.OK) + } ?: throw BehandlingIkkeFunnetException(underkjennVedtakOppgave.sakIdOgReferanse) + inTransaction { + behandlingsstatusService.settReturnertVedtak(behandling, underkjennVedtakOppgave) } + call.respond(HttpStatusCode.OK) } } } @@ -82,15 +85,11 @@ internal fun Route.behandlingVedtakRoute( behandlingService.hentBehandling( UUID.fromString(attesterVedtakOppgave.sakIdOgReferanse.referanse), ) - } - if (behandling == null) { - call.respond(HttpStatusCode.NotFound, "Fant ingen behandling") - } else { - inTransaction { - behandlingsstatusService.settAttestertVedtak(behandling, attesterVedtakOppgave, brukerTokenInfo) - } - call.respond(HttpStatusCode.OK) + } ?: throw BehandlingIkkeFunnetException(attesterVedtakOppgave.sakIdOgReferanse) + inTransaction { + behandlingsstatusService.settAttestertVedtak(behandling, attesterVedtakOppgave, brukerTokenInfo) } + call.respond(HttpStatusCode.OK) } } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt index 644f9e65661..5e2471454d3 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/aktivitetsplikt/AktivitetspliktRoute.kt @@ -19,7 +19,9 @@ import no.nav.etterlatte.inTransaction import no.nav.etterlatte.libs.common.behandling.OpprettAktivitetspliktOppfolging import no.nav.etterlatte.libs.common.behandling.OpprettOppgaveForAktivitetspliktVarigUnntakDto import no.nav.etterlatte.libs.common.behandling.OpprettRevurderingForAktivitetspliktDto +import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException +import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.ktor.route.BEHANDLINGID_CALL_PARAMETER import no.nav.etterlatte.libs.ktor.route.OPPGAVEID_CALL_PARAMETER import no.nav.etterlatte.libs.ktor.route.SAKID_CALL_PARAMETER @@ -161,7 +163,13 @@ internal fun Route.aktivitetspliktRoutes(aktivitetspliktService: Aktivitetsplikt logger.info("Henter aktivitetspliktDto for statistikk") val dto = inTransaction { - runBlocking { aktivitetspliktService.hentAktivitetspliktDto(sakId, brukerTokenInfo, behandlingId) } + runBlocking { + aktivitetspliktService.hentAktivitetspliktDto( + sakId, + brukerTokenInfo, + behandlingId, + ) + } } call.respond(dto) } @@ -220,14 +228,18 @@ internal fun Route.aktivitetspliktRoutes(aktivitetspliktService: Aktivitetsplikt route("/api/sak/{$SAKID_CALL_PARAMETER}/oppgave/{$OPPGAVEID_CALL_PARAMETER}/aktivitetsplikt/vurdering") { get { logger.info("Henter aktivitetsplikt vurdering for oppgaveId=$oppgaveId") - val vurdering = inTransaction { aktivitetspliktService.hentVurderingForOppgaveGammel(oppgaveId) } - call.respond(vurdering ?: HttpStatusCode.NotFound) + val vurdering = + inTransaction { aktivitetspliktService.hentVurderingForOppgaveGammel(oppgaveId) } + ?: throw VurderingIkkeFunnetException(sakId, oppgaveId) + call.respond(vurdering) } get("/ny") { logger.info("Henter ny aktivitetsplikt vurdering for oppgaveId=$oppgaveId") - val vurdering = inTransaction { aktivitetspliktService.hentVurderingForOppgave(oppgaveId) } - call.respond(vurdering ?: HttpStatusCode.NotFound) + val vurdering = + inTransaction { aktivitetspliktService.hentVurderingForOppgave(oppgaveId) } + ?: throw VurderingIkkeFunnetException(sakId, oppgaveId) + call.respond(vurdering) } post("/aktivitetsgrad") { @@ -266,14 +278,18 @@ internal fun Route.aktivitetspliktRoutes(aktivitetspliktService: Aktivitetsplikt route("/api/sak/{$SAKID_CALL_PARAMETER}/behandling/{$BEHANDLINGID_CALL_PARAMETER}/aktivitetsplikt/vurdering") { get { logger.info("Henter aktivitetsplikt vurdering for behandlingId=$behandlingId") - val vurdering = inTransaction { aktivitetspliktService.hentVurderingForBehandlingGammel(behandlingId) } - call.respond(vurdering ?: HttpStatusCode.NotFound) + val vurdering = + inTransaction { aktivitetspliktService.hentVurderingForBehandlingGammel(behandlingId) } + ?: throw VurderingIkkeFunnetException(sakId, behandlingId) + call.respond(vurdering) } get("/ny") { logger.info("Henter ny aktivitetsplikt vurdering for behandlingId=$behandlingId") - val vurdering = inTransaction { aktivitetspliktService.hentVurderingForBehandling(behandlingId) } - call.respond(vurdering ?: HttpStatusCode.NotFound) + val vurdering = + inTransaction { aktivitetspliktService.hentVurderingForBehandling(behandlingId) } + ?: throw VurderingIkkeFunnetException(sakId, behandlingId) + call.respond(vurdering) } post("/aktivitetsgrad") { @@ -309,3 +325,8 @@ internal fun Route.aktivitetspliktRoutes(aktivitetspliktService: Aktivitetsplikt } } } + +class VurderingIkkeFunnetException( + sakId: SakId, + referanse: UUID, +) : IkkeFunnetException("VURDERING_IKKE_FUNNET", "Fant ikke vurdering i sak=$sakId med referanse=$referanse") diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/bosattutland/BosattUtlandRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/bosattutland/BosattUtlandRoutes.kt index a168b0b8e88..15c993feea4 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/bosattutland/BosattUtlandRoutes.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/bosattutland/BosattUtlandRoutes.kt @@ -1,6 +1,5 @@ package no.nav.etterlatte.behandling.bosattutland -import io.ktor.http.HttpStatusCode import io.ktor.server.application.call import io.ktor.server.request.receive import io.ktor.server.response.respond @@ -9,6 +8,7 @@ import io.ktor.server.routing.get import io.ktor.server.routing.post import io.ktor.server.routing.route import no.nav.etterlatte.inTransaction +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.ktor.route.BEHANDLINGID_CALL_PARAMETER import no.nav.etterlatte.libs.ktor.route.behandlingId import no.nav.etterlatte.libs.ktor.route.kunSaksbehandler @@ -25,10 +25,10 @@ internal fun Route.bosattUtlandRoutes(bosattUtlandService: BosattUtlandService) } get { kunSaksbehandler { - when (val bosattUtland = inTransaction { bosattUtlandService.hentBosattUtland(behandlingId) }) { - null -> call.respond(HttpStatusCode.NotFound) - else -> call.respond(bosattUtland) - } + val bosattUtland = + inTransaction { bosattUtlandService.hentBosattUtland(behandlingId) } + ?: throw GenerellIkkeFunnetException() + call.respond(bosattUtland) } } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/generellbehandling/GenerellBehandlingRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/generellbehandling/GenerellBehandlingRoute.kt index 55d8ceb8107..4ecf59412c0 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/generellbehandling/GenerellBehandlingRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/generellbehandling/GenerellBehandlingRoute.kt @@ -9,6 +9,8 @@ import io.ktor.server.routing.get import io.ktor.server.routing.post import io.ktor.server.routing.put import no.nav.etterlatte.inTransaction +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException +import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException import no.nav.etterlatte.libs.common.generellbehandling.GenerellBehandling import no.nav.etterlatte.libs.ktor.route.GENERELLBEHANDLINGID_CALL_PARAMETER import no.nav.etterlatte.libs.ktor.route.SAKID_CALL_PARAMETER @@ -17,6 +19,7 @@ import no.nav.etterlatte.libs.ktor.route.kunSaksbehandler import no.nav.etterlatte.libs.ktor.route.routeLogger import no.nav.etterlatte.libs.ktor.route.sakId import no.nav.etterlatte.libs.ktor.token.brukerTokenInfo +import no.nav.etterlatte.sak.SakIkkeFunnetException import no.nav.etterlatte.sak.SakService import no.nav.etterlatte.tilgangsstyring.kunSaksbehandlerMedSkrivetilgang @@ -29,10 +32,9 @@ internal fun Route.generellbehandlingRoutes( post("/api/generellbehandling/{$SAKID_CALL_PARAMETER}") { kunSaksbehandlerMedSkrivetilgang { saksbehandler -> val request = call.receive() - val finnSak = inTransaction { sakService.finnSak(sakId) } - if (finnSak == null) { - call.respond(HttpStatusCode.NotFound, "Saken finnes ikke") - } + val sak = + inTransaction { sakService.finnSak(sakId) } + ?: throw SakIkkeFunnetException("Sak med id=$sakId finnes ikke") inTransaction { generellBehandlingService.opprettBehandling( GenerellBehandling.opprettFraType(request.type, sakId), @@ -40,7 +42,7 @@ internal fun Route.generellbehandlingRoutes( ) } logger.info( - "Opprettet generell behandling for sak $sakId av typen ${request.type}", + "Opprettet generell behandling for sak ${sak.id} av typen ${request.type}", ) call.respond(HttpStatusCode.OK) } @@ -49,11 +51,16 @@ internal fun Route.generellbehandlingRoutes( put("/api/generellbehandling/sendtilattestering/{$SAKID_CALL_PARAMETER}") { kunSaksbehandlerMedSkrivetilgang { saksbehandler -> val request = call.receive() + if (request.sakId != sakId) { + throw SakParameterStemmerIkkeException( + "Innsendt sak har id=${request.sakId}, men sak i url er $sakId", + ) + } inTransaction { generellBehandlingService.sendTilAttestering(request, saksbehandler) } logger.info( - "Opprettet generell behandling for sak $sakId av typen ${request.type}", + "Sender generell behandling med id=${request.id} til attestering i sak $sakId av typen ${request.type}", ) call.respond(HttpStatusCode.OK) } @@ -73,7 +80,7 @@ internal fun Route.generellbehandlingRoutes( kunSaksbehandlerMedSkrivetilgang { saksbehandler -> val kommentar = call.receive() inTransaction { - generellBehandlingService.underkjenn(generellBehandlingId, saksbehandler, kommentar) + generellBehandlingService.underkjenn(generellBehandlingId, saksbehandler, kommentar, sakId) } logger.info("underkjent generell behandling med id $generellBehandlingId") call.respond(HttpStatusCode.OK) @@ -86,6 +93,7 @@ internal fun Route.generellbehandlingRoutes( inTransaction { generellBehandlingService.lagreNyeOpplysninger( request, + sakId, ) } logger.info( @@ -98,7 +106,7 @@ internal fun Route.generellbehandlingRoutes( put("/api/generellbehandling/avbryt/{$SAKID_CALL_PARAMETER}/{$GENERELLBEHANDLINGID_CALL_PARAMETER}") { kunSaksbehandlerMedSkrivetilgang { inTransaction { - generellBehandlingService.avbrytBehandling(generellBehandlingId, brukerTokenInfo) + generellBehandlingService.avbrytBehandling(generellBehandlingId, sakId, brukerTokenInfo) } logger.info( "Setter generell behandling med behandlingid $generellBehandlingId til avbrutt", @@ -110,8 +118,10 @@ internal fun Route.generellbehandlingRoutes( get("/api/generellbehandling/hent/{$GENERELLBEHANDLINGID_CALL_PARAMETER}") { kunSaksbehandler { val generellBehandlingId = generellBehandlingId - val hentetBehandling = inTransaction { generellBehandlingService.hentBehandlingMedId(generellBehandlingId) } - call.respond(hentetBehandling ?: HttpStatusCode.NotFound) + val hentetBehandling = + inTransaction { generellBehandlingService.hentBehandlingMedId(generellBehandlingId) } + ?: throw GenerellIkkeFunnetException() + call.respond(hentetBehandling) } } @@ -131,3 +141,7 @@ internal fun Route.generellbehandlingRoutes( data class OpprettGenerellBehandlingRequest( val type: GenerellBehandling.GenerellBehandlingType, ) + +class SakParameterStemmerIkkeException( + override val detail: String, +) : UgyldigForespoerselException("SAK_PARAMETER_STEMER_IKKE", detail) diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/generellbehandling/GenerellBehandlingService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/generellbehandling/GenerellBehandlingService.kt index 6bd218276c5..28c46734858 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/generellbehandling/GenerellBehandlingService.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/generellbehandling/GenerellBehandlingService.kt @@ -226,13 +226,19 @@ class GenerellBehandlingService( generellbehandlingId: UUID, saksbehandler: Saksbehandler, kommentar: Kommentar, + sakId: SakId, ) { - val hentetBehandling = hentBehandlingMedId(generellbehandlingId) - require(hentetBehandling !== null) { "Behandlingen må finnes, fant ikke id: $generellbehandlingId" } - require(hentetBehandling?.status === GenerellBehandling.Status.FATTET) { - "Behandlingen må ha status FATTET, hadde: ${hentetBehandling?.status}" + val behandling = hentBehandlingMedId(generellbehandlingId) + require(behandling != null) { "Behandlingen må finnes, fant ikke id: $generellbehandlingId" } + require(behandling.status === GenerellBehandling.Status.FATTET) { + "Behandlingen må ha status FATTET, hadde: ${behandling.status}" + } + if (sakId != behandling.sakId) { + throw SakParameterStemmerIkkeException( + "Behandlingen med id $generellbehandlingId" + + " tilhører ikke sak $sakId, som ble sendt inn.", + ) } - val behandling = hentetBehandling!! oppgaveService.tilUnderkjent( referanse = behandling.id.toString(), @@ -249,7 +255,7 @@ class GenerellBehandlingService( ) opprettHendelse( GenerellBehandlingHendelseType.UNDERKJENT, - hentetBehandling, + behandling, saksbehandler, kommentar.begrunnelse, ) @@ -295,16 +301,32 @@ class GenerellBehandlingService( fun avbrytBehandling( id: UUID, + sakId: SakId, saksbehandler: BrukerTokenInfo, ) { val generellBehandling = generellBehandlingDao.hentGenerellBehandlingMedId(id) + if (generellBehandling?.sakId != sakId) { + throw SakParameterStemmerIkkeException( + "Generell behandling med id=${generellBehandling?.id} tilhører ikke sak med id=$sakId, " + + "som ble sendt inn.", + ) + } finnesOgErRedigerbar(generellBehandling) generellBehandlingDao.oppdaterGenerellBehandling(generellBehandling!!.copy(status = GenerellBehandling.Status.AVBRUTT)) oppgaveService.avbrytOppgaveUnderBehandling(generellBehandling.id.toString(), saksbehandler) } - fun lagreNyeOpplysninger(generellBehandling: GenerellBehandling): GenerellBehandling { + fun lagreNyeOpplysninger( + generellBehandling: GenerellBehandling, + sakId: SakId, + ): GenerellBehandling { val lagretBehandling = generellBehandlingDao.hentGenerellBehandlingMedId(generellBehandling.id) + if (generellBehandling.sakId != sakId) { + throw SakParameterStemmerIkkeException( + "Generell behandling med id=${generellBehandling.id} tilhører ikke sak med id=$sakId, " + + "som ble sendt inn.", + ) + } finnesOgErRedigerbar(lagretBehandling) return this.oppdaterBehandling(generellBehandling) } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/klage/KlageRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/klage/KlageRoutes.kt index 964768a80f1..7accbff5f77 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/klage/KlageRoutes.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/klage/KlageRoutes.kt @@ -18,6 +18,7 @@ import no.nav.etterlatte.libs.common.behandling.InitieltUtfallMedBegrunnelseDto import no.nav.etterlatte.libs.common.behandling.InnkommendeKlage import no.nav.etterlatte.libs.common.behandling.Kabalrespons import no.nav.etterlatte.libs.common.behandling.KlageUtfallUtenBrev +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.IkkeTillattException import no.nav.etterlatte.libs.common.klage.AarsakTilAvbrytelse import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt @@ -72,11 +73,9 @@ internal fun Route.klageRoutes( val klage = inTransaction { klageService.hentKlage(klageId) - } - when (klage) { - null -> call.respond(HttpStatusCode.NotFound) - else -> call.respond(klage) - } + } ?: throw GenerellIkkeFunnetException() + + call.respond(klage) } put("formkrav") { diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/statistikk/StatistikkRoute.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/statistikk/StatistikkRoute.kt index b32fba2f192..a2b15b4f9d3 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/statistikk/StatistikkRoute.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/statistikk/StatistikkRoute.kt @@ -1,13 +1,12 @@ package no.nav.etterlatte.behandling.statistikk -import io.ktor.http.HttpStatusCode import io.ktor.server.application.call import io.ktor.server.response.respond import io.ktor.server.routing.Route import io.ktor.server.routing.get import io.ktor.server.routing.route import no.nav.etterlatte.behandling.BehandlingService -import no.nav.etterlatte.libs.common.behandling.StatistikkBehandling +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.ktor.route.BEHANDLINGID_CALL_PARAMETER import no.nav.etterlatte.libs.ktor.route.behandlingId import no.nav.etterlatte.libs.ktor.route.routeLogger @@ -19,10 +18,10 @@ internal fun Route.statistikkRoutes(behandlingService: BehandlingService) { route("/behandlinger/statistikk/{$BEHANDLINGID_CALL_PARAMETER}") { get { logger.info("Henter detaljert behandling for behandling med id=$behandlingId") - when (val behandling = behandlingService.hentStatistikkBehandling(behandlingId, brukerTokenInfo)) { - is StatistikkBehandling -> call.respond(behandling) - else -> call.respond(HttpStatusCode.NotFound, "Fant ikke behandling med id=$behandlingId") - } + val behandling = + behandlingService.hentStatistikkBehandling(behandlingId, brukerTokenInfo) + ?: throw GenerellIkkeFunnetException() + call.respond(behandling) } } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/tilbakekreving/TilbakekrevingRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/tilbakekreving/TilbakekrevingRoutes.kt index cb99c4366f2..feac4e4a1fd 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/behandling/tilbakekreving/TilbakekrevingRoutes.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/tilbakekreving/TilbakekrevingRoutes.kt @@ -9,6 +9,7 @@ import io.ktor.server.routing.get import io.ktor.server.routing.post import io.ktor.server.routing.put import io.ktor.server.routing.route +import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException import no.nav.etterlatte.libs.common.tilbakekreving.Kravgrunnlag import no.nav.etterlatte.libs.common.tilbakekreving.TilbakekrevingPeriode import no.nav.etterlatte.libs.common.tilbakekreving.TilbakekrevingVurdering @@ -93,9 +94,10 @@ internal fun Route.tilbakekrevingRoutes(service: TilbakekrevingService) { val tilbakekreving = service.opprettTilbakekreving(it) call.respond(HttpStatusCode.OK, tilbakekreving) } catch (e: TilbakekrevingHarMangelException) { - call.respond( - HttpStatusCode.NotFound, + throw IkkeFunnetException( + "MANGLER_SAK", "Eksisterer ikke sak=${it.sakId.value} for kravgrunnlag=${it.kravgrunnlagId}", + cause = e, ) } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/institusjonsopphold/InstitusjonsoppholdRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/institusjonsopphold/InstitusjonsoppholdRoutes.kt index ae50775dd7b..1acff8cbb0b 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/institusjonsopphold/InstitusjonsoppholdRoutes.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/institusjonsopphold/InstitusjonsoppholdRoutes.kt @@ -8,6 +8,8 @@ import io.ktor.server.routing.Route import io.ktor.server.routing.get import io.ktor.server.routing.post import io.ktor.server.routing.route +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException +import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException import no.nav.etterlatte.libs.common.grunnlag.Grunnlagsopplysning import no.nav.etterlatte.libs.ktor.route.SAKID_CALL_PARAMETER import no.nav.etterlatte.libs.ktor.route.sakId @@ -32,13 +34,14 @@ internal fun Route.institusjonsoppholdRoute(institusjonsoppholdService: Institus route("/api/institusjonsoppholdbegrunnelse/{grunnlagsendringsid}") { get { val grunnlagsendringsId = - call.parameters["grunnlagsendringsid"] ?: return@get call.respond( - HttpStatusCode.BadRequest, + call.parameters["grunnlagsendringsid"] ?: throw UgyldigForespoerselException( + "MANGLER_PARAMETER", "Mangler grunnlagsendringsid", ) val institusjonsoppholdBegrunnelseMedSaksbehandler = institusjonsoppholdService.hentInstitusjonsoppholdBegrunnelse(grunnlagsendringsId) - call.respond(institusjonsoppholdBegrunnelseMedSaksbehandler ?: HttpStatusCode.NotFound) + ?: throw GenerellIkkeFunnetException() + call.respond(institusjonsoppholdBegrunnelseMedSaksbehandler) } } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/sak/SakRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/sak/SakRoutes.kt index ad621ddf2f6..2cf6c4b0a5f 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/sak/SakRoutes.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/sak/SakRoutes.kt @@ -21,6 +21,7 @@ import no.nav.etterlatte.inTransaction import no.nav.etterlatte.libs.common.behandling.FoersteVirkDto import no.nav.etterlatte.libs.common.behandling.SakType import no.nav.etterlatte.libs.common.behandling.SisteIverksatteBehandling +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException import no.nav.etterlatte.libs.common.person.Folkeregisteridentifikator @@ -82,8 +83,8 @@ internal fun Route.sakSystemRoutes( val sak = inTransaction { sakService.finnSak(sakId) - } - call.respond(sak ?: HttpStatusCode.NotFound) + } ?: throw GenerellIkkeFunnetException() + call.respond(sak) } get("/behandlinger") { @@ -107,9 +108,9 @@ internal fun Route.sakSystemRoutes( behandlingService .hentSisteIverksatte(sakId) ?.let { SisteIverksatteBehandling(it.id) } - } + } ?: throw GenerellIkkeFunnetException() - call.respond(sisteIverksatteBehandling ?: HttpStatusCode.NotFound) + call.respond(sisteIverksatteBehandling) } get("/gradering") { @@ -142,8 +143,8 @@ internal fun Route.sakSystemRoutes( val sak = inTransaction { sakService.finnSak(fnr.value, type) }.also { requestLogger.loggRequest(brukerTokenInfo, fnr, "personer/sak") - } - call.respond(sak ?: HttpStatusCode.NotFound) + } ?: throw GenerellIkkeFunnetException() + call.respond(sak) } } } @@ -178,8 +179,8 @@ internal fun Route.sakWebRoutes( val sak = inTransaction { sakService.finnSak(sakId) - } - call.respond(sak ?: HttpStatusCode.NotFound) + } ?: throw GenerellIkkeFunnetException() + call.respond(sak) } get("/grunnlagsendringshendelser") { @@ -237,10 +238,8 @@ internal fun Route.sakWebRoutes( get("/behandlinger/foerstevirk") { logger.info("Henter første virkningstidspunkt på en iverksatt behandling i sak med id $sakId") - when (val foersteVirk = inTransaction { behandlingService.hentFoersteVirk(sakId) }) { - null -> call.respond(HttpStatusCode.NotFound) - else -> call.respond(FoersteVirkDto(foersteVirk.atDay(1), sakId)) - } + val foersteVirk = inTransaction { behandlingService.hentFoersteVirk(sakId) } ?: throw GenerellIkkeFunnetException() + call.respond(FoersteVirkDto(foersteVirk.atDay(1), sakId)) } get("/hendelser") { diff --git a/apps/etterlatte-behandling/src/main/kotlin/tilgangsstyring/Tilgangsstyring.kt b/apps/etterlatte-behandling/src/main/kotlin/tilgangsstyring/Tilgangsstyring.kt index 7a8b2dd6c9b..2ab94b0ff13 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/tilgangsstyring/Tilgangsstyring.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/tilgangsstyring/Tilgangsstyring.kt @@ -19,6 +19,7 @@ import no.nav.etterlatte.Kontekst import no.nav.etterlatte.SaksbehandlerMedEnheterOgRoller import no.nav.etterlatte.SystemUser import no.nav.etterlatte.libs.common.feilhaandtering.ForespoerselException +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.common.person.Folkeregisteridentifikator import no.nav.etterlatte.libs.common.sak.SakId import no.nav.etterlatte.libs.ktor.route.CallParamAuthId @@ -91,7 +92,7 @@ val adressebeskyttelsePlugin: RouteScopedPlugin = SaksbehandlerMedRoller(bruker, saksbehandlerGroupIdsByKey), ) ) { - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } return@on } @@ -101,7 +102,7 @@ val adressebeskyttelsePlugin: RouteScopedPlugin = SaksbehandlerMedRoller(bruker, saksbehandlerGroupIdsByKey), ) ) { - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } return@on } @@ -111,7 +112,7 @@ val adressebeskyttelsePlugin: RouteScopedPlugin = SaksbehandlerMedRoller(bruker, saksbehandlerGroupIdsByKey), ) ) { - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } return@on } @@ -121,7 +122,7 @@ val adressebeskyttelsePlugin: RouteScopedPlugin = SaksbehandlerMedRoller(bruker, saksbehandlerGroupIdsByKey), ) ) { - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } return@on } @@ -131,7 +132,7 @@ val adressebeskyttelsePlugin: RouteScopedPlugin = SaksbehandlerMedRoller(bruker, saksbehandlerGroupIdsByKey), ) ) { - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } return@on } @@ -141,7 +142,7 @@ val adressebeskyttelsePlugin: RouteScopedPlugin = SaksbehandlerMedRoller(bruker, saksbehandlerGroupIdsByKey), ) ) { - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } return@on } @@ -170,7 +171,7 @@ suspend inline fun PipelineContext<*, ApplicationCall>.withFoedselsnummerInterna if (harTilgang) { onSuccess(foedselsnummer) } else { - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } } diff --git a/apps/etterlatte-behandling/src/main/kotlin/vilkaarsvurdering/VilkaarsvurderingRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/vilkaarsvurdering/VilkaarsvurderingRoutes.kt index f5adff44222..461caba05ba 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/vilkaarsvurdering/VilkaarsvurderingRoutes.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/vilkaarsvurdering/VilkaarsvurderingRoutes.kt @@ -12,6 +12,7 @@ import io.ktor.server.routing.post import io.ktor.server.routing.route import io.ktor.util.pipeline.PipelineContext import no.nav.etterlatte.inTransaction +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt import no.nav.etterlatte.libs.common.tidspunkt.toLocalDatetimeUTC import no.nav.etterlatte.libs.common.vilkaarsvurdering.StatusOppdatertDto @@ -143,7 +144,7 @@ fun Route.vilkaarsvurdering(vilkaarsvurderingService: VilkaarsvurderingService) "Kunne ikke kopiere vilkårsvurdering fra $forrigeBehandling. Fant ikke vilkårsvurdering", e, ) - call.respond(HttpStatusCode.NotFound, "Fant ikke vilkårsvurdering") + throw GenerellIkkeFunnetException() } } diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/generellbehandling/GenerellBehandlingServiceTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/generellbehandling/GenerellBehandlingServiceTest.kt index 45c491e8963..ae4f2b32346 100644 --- a/apps/etterlatte-behandling/src/test/kotlin/behandling/generellbehandling/GenerellBehandlingServiceTest.kt +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/generellbehandling/GenerellBehandlingServiceTest.kt @@ -137,7 +137,7 @@ internal class GenerellBehandlingServiceTest( val opprettBehandling = service.opprettBehandling(manueltOpprettetBehandling, SAKSBEHANDLER) dao.oppdaterGenerellBehandling(opprettBehandling.copy(status = GenerellBehandling.Status.FATTET)) assertThrows { - service.lagreNyeOpplysninger(opprettBehandling) + service.lagreNyeOpplysninger(opprettBehandling, sak.id) } } @@ -303,7 +303,7 @@ internal class GenerellBehandlingServiceTest( val utlandsOppgave = hentOppgaverForReferanse[0] oppgaveService.tildelSaksbehandler(utlandsOppgave.id, SAKSBEHANDLER.ident) - service.avbrytBehandling(opprettBehandling.id, SAKSBEHANDLER) + service.avbrytBehandling(opprettBehandling.id, sak.id, SAKSBEHANDLER) val avbruttBehandling = service.hentBehandlingMedId(opprettBehandling.id) assertEquals(GenerellBehandling.Status.AVBRUTT, avbruttBehandling!!.status) val avbruttOppgave = oppgaveService.hentOppgave(utlandsOppgave.id) @@ -335,13 +335,13 @@ internal class GenerellBehandlingServiceTest( "124124124", ) val behandlingUtfylt = opprettBehandling.copy(innhold = kravpakkeUtlandInnhold) - val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt) + val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt, sak.id) service.sendTilAttestering(oppdaterBehandling, SAKSBEHANDLER) val fattetBehandling = service.hentBehandlingMedId(oppdaterBehandling.id) fattetBehandling?.status shouldBe GenerellBehandling.Status.FATTET assertThrows { - service.avbrytBehandling(opprettBehandling.id, SAKSBEHANDLER) + service.avbrytBehandling(opprettBehandling.id, sak.id, SAKSBEHANDLER) } } @@ -370,7 +370,7 @@ internal class GenerellBehandlingServiceTest( "124124124", ) val behandlingUtfylt = opprettBehandling.copy(innhold = kravpakkeUtlandInnhold) - val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt) + val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt, sak.id) service.sendTilAttestering(oppdaterBehandling, SAKSBEHANDLER) val fattetBehandling = service.hentBehandlingMedId(oppdaterBehandling.id) @@ -416,7 +416,7 @@ internal class GenerellBehandlingServiceTest( "124124124", ) val behandlingUtfylt = opprettBehandling.copy(innhold = kravpakkeUtlandInnhold) - val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt) + val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt, sak.id) assertThrows { service.sendTilAttestering(oppdaterBehandling, SAKSBEHANDLER) } @@ -446,7 +446,7 @@ internal class GenerellBehandlingServiceTest( ) val behandlingUtfylt = opprettBehandling.copy(innhold = kravpakkeUtlandInnhold, status = GenerellBehandling.Status.FATTET) - val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt) + val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt, sak.id) assertThrows { service.sendTilAttestering(oppdaterBehandling, SAKSBEHANDLER) } @@ -475,7 +475,7 @@ internal class GenerellBehandlingServiceTest( "", ) val behandlingUtfylt = opprettBehandling.copy(innhold = kravpakkeUtlandInnhold) - val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt) + val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt, sak.id) assertThrows { service.sendTilAttestering(oppdaterBehandling, SAKSBEHANDLER) } @@ -504,7 +504,7 @@ internal class GenerellBehandlingServiceTest( "rinanummer", ) val behandlingUtfylt = opprettBehandling.copy(innhold = kravpakkeUtlandInnhold) - val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt) + val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt, sak.id) assertThrows { service.sendTilAttestering(oppdaterBehandling, SAKSBEHANDLER) } @@ -533,7 +533,7 @@ internal class GenerellBehandlingServiceTest( "rinanummer", ) val behandlingUtfylt = opprettBehandling.copy(innhold = kravpakkeUtlandInnhold) - val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt) + val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt, sak.id) assertThrows { service.sendTilAttestering(oppdaterBehandling, SAKSBEHANDLER) } @@ -564,7 +564,7 @@ internal class GenerellBehandlingServiceTest( "124124124", ) val behandlingUtfylt = opprettBehandling.copy(innhold = kravpakkeUtlandInnhold) - val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt) + val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt, sak.id) service.sendTilAttestering(oppdaterBehandling, SAKSBEHANDLER) val fattetBehandling = service.hentBehandlingMedId(oppdaterBehandling.id) @@ -629,7 +629,7 @@ internal class GenerellBehandlingServiceTest( "124124124", ) val behandlingUtfylt = opprettBehandling.copy(innhold = kravpakkeUtlandInnhold) - val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt) + val oppdaterBehandling = service.lagreNyeOpplysninger(behandlingUtfylt, sak.id) service.sendTilAttestering(oppdaterBehandling, SAKSBEHANDLER) val fattetBehandling = service.hentBehandlingMedId(oppdaterBehandling.id) assertEquals(GenerellBehandling.Status.FATTET, fattetBehandling?.status) @@ -673,7 +673,7 @@ internal class GenerellBehandlingServiceTest( val behandlingsoppgave = oppgaveService.hentOppgaverForReferanse(behandling.id.toString()).single() oppgaveService.tildelSaksbehandler(behandlingsoppgave.id, SAKSBEHANDLER.ident) - val behandlingMedKravpakke = service.lagreNyeOpplysninger(behandling.copy(innhold = kravpakkeUtland())) + val behandlingMedKravpakke = service.lagreNyeOpplysninger(behandling.copy(innhold = kravpakkeUtland()), sak.id) service.sendTilAttestering(behandlingMedKravpakke, SAKSBEHANDLER) val nyAttesteringsoppgave = @@ -685,7 +685,7 @@ internal class GenerellBehandlingServiceTest( val begrunnelse = "Ikke godkjent" val kommentar = Kommentar(begrunnelse) - service.underkjenn(behandlingMedKravpakke.id, ATTESTANT, kommentar) + service.underkjenn(behandlingMedKravpakke.id, ATTESTANT, kommentar, sak.id) val underkjentBehandling = service.hentBehandlingMedId(behandlingMedKravpakke.id) underkjentBehandling?.status shouldBe GenerellBehandling.Status.RETURNERT diff --git a/apps/etterlatte-beregning/src/main/kotlin/beregning/BeregningRoutes.kt b/apps/etterlatte-beregning/src/main/kotlin/beregning/BeregningRoutes.kt index 6c5ae92baa8..b66527fcc29 100644 --- a/apps/etterlatte-beregning/src/main/kotlin/beregning/BeregningRoutes.kt +++ b/apps/etterlatte-beregning/src/main/kotlin/beregning/BeregningRoutes.kt @@ -11,6 +11,7 @@ import io.ktor.server.routing.post import io.ktor.server.routing.route import no.nav.etterlatte.klienter.BehandlingKlient import no.nav.etterlatte.libs.common.beregning.OverstyrBeregningDTO +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.ktor.route.BEHANDLINGID_CALL_PARAMETER import no.nav.etterlatte.libs.ktor.route.behandlingId import no.nav.etterlatte.libs.ktor.route.routeLogger @@ -27,10 +28,10 @@ fun Route.beregning( get("/{$BEHANDLINGID_CALL_PARAMETER}") { withBehandlingId(behandlingKlient) { logger.info("Henter beregning med behandlingId=$it") - when (val beregning = beregningService.hentBeregning(it, brukerTokenInfo)) { - null -> call.response.status(HttpStatusCode.NotFound) - else -> call.respond(beregning.toDTO()) - } + val beregning = + beregningService.hentBeregning(it, brukerTokenInfo) + ?: throw GenerellIkkeFunnetException() + call.respond(beregning.toDTO()) } } diff --git a/apps/etterlatte-beregning/src/main/kotlin/ytelseMedGrunnlag/YtelseMedGrunnlagRoutes.kt b/apps/etterlatte-beregning/src/main/kotlin/ytelseMedGrunnlag/YtelseMedGrunnlagRoutes.kt index 96d80c03f92..57d4a0af486 100644 --- a/apps/etterlatte-beregning/src/main/kotlin/ytelseMedGrunnlag/YtelseMedGrunnlagRoutes.kt +++ b/apps/etterlatte-beregning/src/main/kotlin/ytelseMedGrunnlag/YtelseMedGrunnlagRoutes.kt @@ -1,12 +1,12 @@ package no.nav.etterlatte.ytelseMedGrunnlag -import io.ktor.http.HttpStatusCode import io.ktor.server.application.call import io.ktor.server.response.respond import io.ktor.server.routing.Route import io.ktor.server.routing.get import io.ktor.server.routing.route import no.nav.etterlatte.klienter.BehandlingKlient +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.ktor.route.BEHANDLINGID_CALL_PARAMETER import no.nav.etterlatte.libs.ktor.route.routeLogger import no.nav.etterlatte.libs.ktor.route.withBehandlingId @@ -21,10 +21,10 @@ fun Route.ytelseMedGrunnlag( get { withBehandlingId(behandlingKlient) { logger.info("Henter utregnet ytelse med grunnlag for behandlingId=$it") - when (val ytelse = ytelseMedGrunnlagService.hentYtelseMedGrunnlag(it, brukerTokenInfo)) { - null -> call.response.status(HttpStatusCode.NotFound) - else -> call.respond(ytelse) - } + val ytelse = + ytelseMedGrunnlagService.hentYtelseMedGrunnlag(it, brukerTokenInfo) + ?: throw GenerellIkkeFunnetException() + call.respond(ytelse) } } } diff --git a/apps/etterlatte-grunnlag/src/main/kotlin/grunnlag/BehandlingGrunnlagRoutes.kt b/apps/etterlatte-grunnlag/src/main/kotlin/grunnlag/BehandlingGrunnlagRoutes.kt index 9c13b2f665c..00f6476281b 100644 --- a/apps/etterlatte-grunnlag/src/main/kotlin/grunnlag/BehandlingGrunnlagRoutes.kt +++ b/apps/etterlatte-grunnlag/src/main/kotlin/grunnlag/BehandlingGrunnlagRoutes.kt @@ -10,6 +10,7 @@ import io.ktor.server.routing.post import io.ktor.server.routing.route import no.nav.etterlatte.grunnlag.klienter.BehandlingKlient import no.nav.etterlatte.libs.common.behandling.SakType +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.common.grunnlag.NyeSaksopplysninger import no.nav.etterlatte.libs.common.grunnlag.OppdaterGrunnlagRequest import no.nav.etterlatte.libs.common.grunnlag.Opplysningsbehov @@ -25,10 +26,10 @@ fun Route.behandlingGrunnlagRoute( route("/behandling/{$BEHANDLINGID_CALL_PARAMETER}") { get { withBehandlingId(behandlingKlient) { behandlingId -> - when (val opplysningsgrunnlag = grunnlagService.hentOpplysningsgrunnlag(behandlingId)) { - null -> call.respond(HttpStatusCode.NotFound) - else -> call.respond(opplysningsgrunnlag) - } + val opplysningsgrunnlag = + grunnlagService.hentOpplysningsgrunnlag(behandlingId) + ?: throw GenerellIkkeFunnetException() + call.respond(opplysningsgrunnlag) } } @@ -42,17 +43,17 @@ fun Route.behandlingGrunnlagRoute( } else if (opplysningstype == Opplysningstype.SOESKEN_I_BEREGNINGEN) { call.respond(HttpStatusCode.NoContent) } else { - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } } } get("revurdering/${Opplysningstype.HISTORISK_FORELDREANSVAR}") { withBehandlingId(behandlingKlient) { behandlingId -> - when (val historisk = grunnlagService.hentHistoriskForeldreansvar(behandlingId)) { - null -> call.respond(HttpStatusCode.NotFound) - else -> call.respond(historisk) - } + val historisk = + grunnlagService.hentHistoriskForeldreansvar(behandlingId) + ?: throw GenerellIkkeFunnetException() + call.respond(historisk) } } diff --git a/apps/etterlatte-grunnlag/src/main/kotlin/grunnlag/SakGrunnlagRoutes.kt b/apps/etterlatte-grunnlag/src/main/kotlin/grunnlag/SakGrunnlagRoutes.kt index 1cf68d6a405..100811c2f9a 100644 --- a/apps/etterlatte-grunnlag/src/main/kotlin/grunnlag/SakGrunnlagRoutes.kt +++ b/apps/etterlatte-grunnlag/src/main/kotlin/grunnlag/SakGrunnlagRoutes.kt @@ -9,6 +9,7 @@ import io.ktor.server.routing.get import io.ktor.server.routing.post import io.ktor.server.routing.route import no.nav.etterlatte.grunnlag.klienter.BehandlingKlient +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.common.grunnlag.NyeSaksopplysninger import no.nav.etterlatte.libs.common.grunnlag.OppdaterGrunnlagRequest import no.nav.etterlatte.libs.common.grunnlag.Opplysningsbehov @@ -24,10 +25,10 @@ fun Route.sakGrunnlagRoute( route("sak/{$SAKID_CALL_PARAMETER}") { get { withSakId(behandlingKlient) { sakId -> - when (val opplysningsgrunnlag = grunnlagService.hentOpplysningsgrunnlagForSak(sakId)) { - null -> call.respond(HttpStatusCode.NotFound) - else -> call.respond(opplysningsgrunnlag) - } + val opplysningsgrunnlag = + grunnlagService.hentOpplysningsgrunnlagForSak(sakId) + ?: throw GenerellIkkeFunnetException() + call.respond(opplysningsgrunnlag) } } diff --git a/apps/etterlatte-vedtaksvurdering/src/main/kotlin/no/nav/etterlatte/vedtaksvurdering/VedtaksvurderingRoute.kt b/apps/etterlatte-vedtaksvurdering/src/main/kotlin/no/nav/etterlatte/vedtaksvurdering/VedtaksvurderingRoute.kt index a1ced08f058..0b1637b8cf3 100644 --- a/apps/etterlatte-vedtaksvurdering/src/main/kotlin/no/nav/etterlatte/vedtaksvurdering/VedtaksvurderingRoute.kt +++ b/apps/etterlatte-vedtaksvurdering/src/main/kotlin/no/nav/etterlatte/vedtaksvurdering/VedtaksvurderingRoute.kt @@ -12,6 +12,8 @@ import io.ktor.server.routing.route import no.nav.etterlatte.libs.common.behandling.Klage import no.nav.etterlatte.libs.common.behandling.SakType import no.nav.etterlatte.libs.common.feilhaandtering.ForespoerselException +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException +import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException import no.nav.etterlatte.libs.common.person.Folkeregisteridentifikator import no.nav.etterlatte.libs.common.tidspunkt.toNorskTid import no.nav.etterlatte.libs.common.vedtak.AttesterVedtakDto @@ -87,12 +89,12 @@ fun Route.vedtaksvurderingRoute( get("/{$BEHANDLINGID_CALL_PARAMETER}") { withBehandlingId(behandlingKlient) { behandlingId -> logger.info("Henter vedtak for behandling $behandlingId") - val vedtak = vedtakService.hentVedtakMedBehandlingId(behandlingId) - if (vedtak == null) { - call.response.status(HttpStatusCode.NotFound) - } else { - call.respond(vedtak.toDto()) - } + val vedtak = + vedtakService.hentVedtakMedBehandlingId(behandlingId) ?: throw IkkeFunnetException( + "FANT_IKKE_VEDTAK", + "Fant ikke vedtaket til behandlingen med id=$behandlingId", + ) + call.respond(vedtak.toDto()) } } @@ -251,13 +253,12 @@ fun Route.vedtaksvurderingRoute( post("/{vedtakId}") { val vedtakId = requireNotNull(call.parameters["vedtakId"]).toLong() - val vedtak = vedtakService.hentVedtak(vedtakId) - if (vedtak == null) { - call.respond(HttpStatusCode.NotFound) - } + val vedtak = + vedtakService.hentVedtak(vedtakId) + ?: throw GenerellIkkeFunnetException() vedtakBehandlingService - .samordnetVedtak(vedtak!!.behandlingId, brukerTokenInfo) + .samordnetVedtak(vedtak.behandlingId, brukerTokenInfo) ?.let { samordnetVedtak -> rapidService.sendToRapid(samordnetVedtak) call.respond(HttpStatusCode.OK, samordnetVedtak.rapidInfo1.vedtak) @@ -292,12 +293,10 @@ fun Route.samordningSystembrukerVedtakRoute(vedtakSamordningService: VedtakSamor get("/{vedtakId}") { val vedtakId = requireNotNull(call.parameters["vedtakId"]).toLong() - val vedtak = vedtakSamordningService.hentVedtak(vedtakId) - if (vedtak != null) { - call.respond(vedtak) - } else { - call.respond(HttpStatusCode.NotFound) - } + val vedtak = + vedtakSamordningService.hentVedtak(vedtakId) + ?: throw GenerellIkkeFunnetException() + call.respond(vedtak) } } } @@ -403,6 +402,7 @@ private fun Vedtak.toVedtakSammendragDto(): VedtakSammendragDto { virkningstidspunkt = innhold.virkningstidspunkt, opphoerFraOgMed = innhold.opphoerFraOgMed, ) + else -> dto } } diff --git a/libs/etterlatte-ktor/src/main/kotlin/feilhaandtering/StatusPagesKonfigurasjon.kt b/libs/etterlatte-ktor/src/main/kotlin/feilhaandtering/StatusPagesKonfigurasjon.kt index 45a3051e0ee..548002ff715 100644 --- a/libs/etterlatte-ktor/src/main/kotlin/feilhaandtering/StatusPagesKonfigurasjon.kt +++ b/libs/etterlatte-ktor/src/main/kotlin/feilhaandtering/StatusPagesKonfigurasjon.kt @@ -9,7 +9,6 @@ import io.ktor.server.request.receive import io.ktor.server.request.uri import io.ktor.server.response.respond import no.nav.etterlatte.libs.common.feilhaandtering.ForespoerselException -import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.IkkeTillattException import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException @@ -21,6 +20,7 @@ import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt import no.nav.etterlatte.libs.ktor.erDeserialiseringsException import no.nav.etterlatte.libs.ktor.feilhaandtering.EscapeUtils.escape import no.nav.etterlatte.libs.ktor.route.routeLogger +import no.nav.etterlatte.libs.ktor.skjulAllePotensielleFnr import org.slf4j.Logger class StatusPagesKonfigurasjon( @@ -73,7 +73,19 @@ class StatusPagesKonfigurasjon( status(*statusCodes4xx) { call, code -> routeLogger.debug("Fikk kode {}", code) when (code) { - HttpStatusCode.NotFound -> call.respond(GenerellIkkeFunnetException()) + HttpStatusCode.NotFound -> { + call.application.log.warn( + "Forespurt URI (${skjulAllePotensielleFnr(call.request.uri)}) " + + "returnerte kode 404, ruten er enten ikke satt opp eller den returnerer 404 direkte.", + ) + + call.respond( + IkkeFunnetException( + code = "ROUTE_NOT_CONFIGURED", + detail = "Du ba om en rute / url som ikke er konfigurert opp. Dobbeltsjekk forespørselen.", + ), + ) + } HttpStatusCode.BadRequest -> call.respond( diff --git a/libs/etterlatte-ktor/src/main/kotlin/route/RouteUtils.kt b/libs/etterlatte-ktor/src/main/kotlin/route/RouteUtils.kt index 4fcd99b0fde..a6603a5c450 100644 --- a/libs/etterlatte-ktor/src/main/kotlin/route/RouteUtils.kt +++ b/libs/etterlatte-ktor/src/main/kotlin/route/RouteUtils.kt @@ -9,6 +9,7 @@ import io.ktor.util.pipeline.PipelineContext import no.nav.etterlatte.funksjonsbrytere.FeatureToggle import no.nav.etterlatte.funksjonsbrytere.FeatureToggleService import no.nav.etterlatte.libs.common.feilhaandtering.ForespoerselException +import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException import no.nav.etterlatte.libs.common.grunnlag.Grunnlagsopplysning import no.nav.etterlatte.libs.common.logging.sikkerlogger @@ -99,7 +100,7 @@ suspend inline fun PipelineContext<*, ApplicationCall>.withBehandlingId( onSuccess(behandlingId) } else { logger.info("Har ikke tilgang til behandling") - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } } @@ -119,7 +120,7 @@ suspend inline fun PipelineContext<*, ApplicationCall>.withSakId( onSuccess(sakId) } else { logger.info("Har ikke tilgang til sak") - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } } @@ -146,7 +147,7 @@ suspend inline fun PipelineContext<*, ApplicationCall>.withFoedselsnummer( onSuccess(foedselsnummer) } else { logger.info("Har ikke tilgang til person") - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } } @@ -174,7 +175,7 @@ suspend inline fun PipelineContext<*, ApplicationCall>.kunSystembruker(onSuccess else -> { logger.debug("Endepunktet er ikke tilgjengeliggjort for saksbehandler, avviser forespørselen") - call.respond(HttpStatusCode.NotFound) + throw GenerellIkkeFunnetException() } } } diff --git a/libs/etterlatte-ktor/src/test/kotlin/RestModuleTest.kt b/libs/etterlatte-ktor/src/test/kotlin/RestModuleTest.kt index d0958db0362..78f23451854 100644 --- a/libs/etterlatte-ktor/src/test/kotlin/RestModuleTest.kt +++ b/libs/etterlatte-ktor/src/test/kotlin/RestModuleTest.kt @@ -260,8 +260,18 @@ class RestModuleTest { }.also { val body = it.body() assertEquals(NotFound.value, body.status) - assertEquals("NOT_FOUND", body.code) + assertEquals("ROUTE_NOT_CONFIGURED", body.code) } + client + .get("route_som_ikke_finnes_og_vi/bare/fallbacker/til/ktorhaandtering") { + header(HttpHeaders.Authorization, "Bearer $token") + header(HttpHeaders.Accept, ContentType.Application.Json) + }.also { + val body = it.body() + assertEquals(NotFound.value, body.status) + assertEquals("ROUTE_NOT_CONFIGURED", body.code) + } + client .get("intern/vilkaarlig") { header(HttpHeaders.Authorization, "Bearer $token")