Skip to content

Commit

Permalink
Håndter ulovlige status-endringer med 400 istedetfor 500
Browse files Browse the repository at this point in the history
  • Loading branch information
tu55eladd committed Jan 25, 2024
1 parent c1370fc commit 190f523
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ public AktivitetData opprettNyAktivitet(AktivitetData aktivitetData) {
}

@Transactional
public AktivitetData oppdaterAktivitet(AktivitetData aktivitet) {
public AktivitetData oppdaterAktivitet(AktivitetData aktivitet) throws UlovligEndringFeil {
AktivitetData original = hentAktivitet(aktivitet.getId());
kanEndreAktivitetGuard(original, aktivitet.getVersjon(), aktivitet.getAktorId());
if (original.getAktivitetType() == AktivitetTypeData.STILLING_FRA_NAV) {
Expand Down Expand Up @@ -175,40 +175,40 @@ private void oppdaterSomEksternBruker(AktivitetData aktivitet, AktivitetData ori
}
}

private void kanEndreAktivitetGuard(AktivitetData orginalAktivitet, long sisteVersjon, Person.AktorId aktorId) {
private void kanEndreAktivitetGuard(AktivitetData orginalAktivitet, long sisteVersjon, Person.AktorId aktorId) throws UlovligEndringFeil {
if (!orginalAktivitet.getAktorId().equals(aktorId)) {
secureLog.error("kan ikke oppdatere aktorid på aktivitet: orginal aktorId: {}, aktorId fra context: {}, aktivitetsId: {}",
orginalAktivitet.getAktorId(), aktorId, orginalAktivitet.getId());
throw new IllegalArgumentException("kan ikke oppdatere aktorid på aktivitet");
throw new UlovligEndringFeil("kan ikke oppdatere aktorid på aktivitet");
}
if (orginalAktivitet.getVersjon() != sisteVersjon) {
throw new ResponseStatusException(HttpStatus.CONFLICT);
} else if (!orginalAktivitet.endringTillatt()) {
throw new IllegalArgumentException(
throw new UlovligEndringFeil(
String.format("Kan ikke endre aktivitet [%s] i en ferdig status",
orginalAktivitet.getId())
);
}
}

private void kanEndreAktivitetEtikettGuard(AktivitetData orginalAktivitet, AktivitetData aktivitet) {
private void kanEndreAktivitetEtikettGuard(AktivitetData orginalAktivitet, AktivitetData aktivitet) throws UlovligEndringFeil {
if (!orginalAktivitet.getAktorId().equals(aktivitet.getAktorId())) {
throw new IllegalArgumentException("kan ikke oppdatere aktorid på aktivitet");
throw new UlovligEndringFeil("kan ikke oppdatere aktorid på aktivitet");

}
if (!Objects.equals(orginalAktivitet.getVersjon(), aktivitet.getVersjon())) {
throw new ResponseStatusException(HttpStatus.CONFLICT);
} else if (orginalAktivitet.getHistoriskDato() != null) {
// Etikett skal kunne endres selv om aktivitet er fullført eller avbrutt
throw new IllegalArgumentException(
throw new UlovligEndringFeil(
String.format("Kan ikke endre etikett på historisk aktivitet [%s]",
orginalAktivitet.getId())
);
}
}

@Transactional
public AktivitetData oppdaterStatus(AktivitetData aktivitet) {
public AktivitetData oppdaterStatus(AktivitetData aktivitet) throws UlovligEndringFeil {
val originalAktivitet = hentAktivitet(aktivitet.getId());
kanEndreAktivitetGuard(originalAktivitet, aktivitet.getVersjon(), aktivitet.getAktorId());

Expand All @@ -224,15 +224,15 @@ public AktivitetData oppdaterStatus(AktivitetData aktivitet) {
}

@Transactional
public AktivitetData oppdaterEtikett(AktivitetData aktivitet) {
public AktivitetData oppdaterEtikett(AktivitetData aktivitet) throws UlovligEndringFeil {
val originalAktivitet = hentAktivitet(aktivitet.getId());
kanEndreAktivitetEtikettGuard(originalAktivitet, aktivitet);
aktivitetService.oppdaterEtikett(originalAktivitet, aktivitet);
return aktivitetService.hentAktivitetMedForhaandsorientering(aktivitet.getId());
}

@Transactional
public AktivitetData oppdaterReferat(AktivitetData aktivitet) {
public AktivitetData oppdaterReferat(AktivitetData aktivitet) throws UlovligEndringFeil {
val originalAktivitet = hentAktivitet(aktivitet.getId());
kanEndreAktivitetGuard(originalAktivitet, aktivitet.getVersjon(), aktivitet.getAktorId());

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package no.nav.veilarbaktivitet.aktivitet

open class AktivitetsplanException(message: String): Exception(message) {
}

class UlovligEndringFeil(message: String): AktivitetsplanException(message)
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import no.nav.veilarbaktivitet.aktivitet.mappers.AktivitetDataMapperService
import no.nav.veilarbaktivitet.aktivitetskort.MigreringService
import no.nav.veilarbaktivitet.person.UserInContext
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import org.springframework.web.server.ResponseStatusException
import java.util.*
Expand Down Expand Up @@ -234,6 +235,12 @@ class AktivitetsplanController(
return Arrays.asList(*KanalDTO.values())
}

@ExceptionHandler(UlovligEndringFeil::class)
fun handleExceptions(e: Exception): ResponseEntity<String> {
val feilmelding = String.format("Funksjonell feil under behandling: %s - %s ", e.javaClass.simpleName, e.message)
return ResponseEntity.status(HttpStatus.CONFLICT).body(feilmelding)
}

private fun filtrerKontorsperret(aktivitet: AktivitetData): Boolean {
return aktivitet.kontorsperreEnhetId == null || authService.harTilgangTilEnhet(EnhetId.of(aktivitet.kontorsperreEnhetId))
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package no.nav.veilarbaktivitet.service;

import lombok.SneakyThrows;
import lombok.val;
import no.nav.poao.dab.spring_auth.IAuthService;
import no.nav.veilarbaktivitet.aktivitet.AktivitetAppService;
import no.nav.veilarbaktivitet.aktivitet.AktivitetService;
import no.nav.veilarbaktivitet.aktivitet.MetricService;
import no.nav.veilarbaktivitet.aktivitet.UlovligEndringFeil;
import no.nav.veilarbaktivitet.aktivitet.domain.AktivitetData;
import no.nav.veilarbaktivitet.aktivitet.domain.AktivitetStatus;
import no.nav.veilarbaktivitet.aktivitet.domain.BehandlingAktivitetData;
Expand Down Expand Up @@ -50,6 +52,7 @@ public class AktivitetAppServiceTest {
@SuppressWarnings("unused") // Blir faktisk brukt
private MetricService metricService;

@SneakyThrows
@Test
void eksternbruker_skal_kunne_endre_sluttdato_selv_om_avtalt_medisinsk_behandling() {
AktivitetData gammelAktivitet = nyBehandlingAktivitet().withId(AKTIVITET_ID).withAvtalt(true).withTilDato(toJavaUtilDate("2022-12-10"));
Expand Down Expand Up @@ -78,6 +81,7 @@ void eksternbruker_skal_kunne_endre_sluttdato_selv_om_avtalt_medisinsk_behandlin

}

@SneakyThrows
@Test
void eksternbruker_skal_kunne_endre_flere_ting_nar_ikke_avtalt_medisinsk_behandling() {
AktivitetData gammelAktivitet = nyBehandlingAktivitet()
Expand Down Expand Up @@ -115,6 +119,8 @@ void eksternbruker_skal_kunne_endre_flere_ting_nar_ikke_avtalt_medisinsk_behandl
});
}


@SneakyThrows
@Test
void nav_skal_kunne_endre_sluttdato_selv_om_avtalt_medisinsk_behandling() {
AktivitetData gammelAktivitet = nyBehandlingAktivitet().withAvtalt(true).withTilDato(toJavaUtilDate("2022-12-10"));
Expand All @@ -141,6 +147,7 @@ void nav_skal_kunne_endre_sluttdato_selv_om_avtalt_medisinsk_behandling() {
});
}

@SneakyThrows
@Test
void nav_skal_kunne_endre_noen_ting_selv_om_avtalt_mote() {
AktivitetData gammelAktivitet = nyMoteAktivitet().withAvtalt(true).withTilDato(toJavaUtilDate("2000-01-01"));
Expand Down Expand Up @@ -201,6 +208,7 @@ void skal_ikke_kunne_endre_aktivitet_nar_den_er_avbrutt_eller_fullfort() {
testAlleOppdateringsmetoderUnntattEtikett(aktivitet);
}

@SneakyThrows
@Test
void skal_kunne_endre_etikett_nar_aktivitet_avbrutt_eller_fullfort() {
val aktivitet = nyttStillingssok().toBuilder().id(AKTIVITET_ID)
Expand Down Expand Up @@ -228,6 +236,8 @@ void opprett_skal_returnere_kontorsperreEnhet_naar_ikke_systembruker() {
Assertions.assertThat(aktivitetData.getKontorsperreEnhetId()).isEqualTo(KONTORSPERRE_ENHET_ID);
}


@SneakyThrows
@Test
void skal_ikke_kunne_endre_aktivitet_nar_den_er_historisk() {
val aktivitet = nyttStillingssok().toBuilder().id(AKTIVITET_ID)
Expand All @@ -240,22 +250,22 @@ private void testAlleOppdateringsmetoder(final AktivitetData aktivitet) {
try {
appService.oppdaterStatus(aktivitet);
fail();
} catch (IllegalArgumentException ignored) {
} catch (UlovligEndringFeil ignored) {
}
try {
appService.oppdaterEtikett(aktivitet);
fail();
} catch (IllegalArgumentException ignored) {
} catch (UlovligEndringFeil ignored) {
}
try {
appService.oppdaterReferat(aktivitet);
fail();
} catch (IllegalArgumentException ignored) {
} catch (UlovligEndringFeil ignored) {
}
try {
appService.oppdaterAktivitet(aktivitet);
fail();
} catch (IllegalArgumentException ignored) {
} catch (UlovligEndringFeil ignored) {
}

verify(aktivitetService, never()).oppdaterStatus(any(), any());
Expand All @@ -270,19 +280,13 @@ private void testAlleOppdateringsmetoder(final AktivitetData aktivitet) {
private void testAlleOppdateringsmetoderUnntattEtikett(final AktivitetData aktivitet) {
try {
appService.oppdaterStatus(aktivitet);
fail();
} catch (IllegalArgumentException ignored) {
}
} catch (UlovligEndringFeil ignored) {}
try {
appService.oppdaterReferat(aktivitet);
fail();
} catch (IllegalArgumentException ignored) {
}
} catch (UlovligEndringFeil ignored) {}
try {
appService.oppdaterAktivitet(aktivitet);
fail();
} catch (IllegalArgumentException ignored) {
}
} catch (UlovligEndringFeil ignored) {}

verify(aktivitetService, never()).oppdaterStatus(any(), any());
verify(aktivitetService, never()).oppdaterAktivitet(any(), any());
Expand Down

0 comments on commit 190f523

Please sign in to comment.