diff --git a/backend/src/main/java/org/raddatz/familienarchiv/exception/ErrorCode.java b/backend/src/main/java/org/raddatz/familienarchiv/exception/ErrorCode.java index 5a0cbd73..e40b122c 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/exception/ErrorCode.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/exception/ErrorCode.java @@ -8,6 +8,10 @@ package org.raddatz.familienarchiv.exception; */ public enum ErrorCode { + // --- Persons --- + /** A person with the given ID does not exist. 404 */ + PERSON_NOT_FOUND, + // --- Documents --- /** A document with the given ID does not exist. 404 */ DOCUMENT_NOT_FOUND, diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java index 52f6231c..9926ea1d 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java @@ -5,6 +5,8 @@ import java.util.Optional; import java.util.UUID; import org.raddatz.familienarchiv.dto.PersonUpdateDTO; +import org.raddatz.familienarchiv.exception.DomainException; +import org.raddatz.familienarchiv.exception.ErrorCode; import org.raddatz.familienarchiv.model.Person; import org.raddatz.familienarchiv.repository.PersonRepository; import org.springframework.http.HttpStatus; @@ -29,7 +31,7 @@ public class PersonService { public Person getById(UUID id) { return personRepository.findById(id) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Person nicht gefunden")); + .orElseThrow(() -> DomainException.notFound(ErrorCode.PERSON_NOT_FOUND, "Person not found: " + id)); } public List findCorrespondents(UUID personId, String q) { @@ -86,7 +88,7 @@ public class PersonService { public Person updatePerson(UUID id, PersonUpdateDTO dto) { validateYears(dto.getBirthYear(), dto.getDeathYear()); Person person = personRepository.findById(id) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Person nicht gefunden")); + .orElseThrow(() -> DomainException.notFound(ErrorCode.PERSON_NOT_FOUND, "Person not found: " + id)); person.setFirstName(dto.getFirstName()); person.setLastName(dto.getLastName()); person.setAlias(dto.getAlias() == null || dto.getAlias().isBlank() ? null : dto.getAlias().trim()); @@ -102,9 +104,9 @@ public class PersonService { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Quelle und Ziel dürfen nicht identisch sein"); } personRepository.findById(sourceId) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Quell-Person nicht gefunden")); + .orElseThrow(() -> DomainException.notFound(ErrorCode.PERSON_NOT_FOUND, "Source person not found: " + sourceId)); personRepository.findById(targetId) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Ziel-Person nicht gefunden")); + .orElseThrow(() -> DomainException.notFound(ErrorCode.PERSON_NOT_FOUND, "Target person not found: " + targetId)); // Reassign sender references personRepository.reassignSender(sourceId, targetId); diff --git a/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java b/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java index fb0023fe..c8cc2624 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java @@ -6,6 +6,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.raddatz.familienarchiv.dto.PersonUpdateDTO; +import org.raddatz.familienarchiv.exception.DomainException; import org.raddatz.familienarchiv.model.Person; import org.raddatz.familienarchiv.repository.PersonRepository; import org.springframework.web.server.ResponseStatusException; @@ -33,8 +34,8 @@ class PersonServiceTest { when(personRepository.findById(id)).thenReturn(Optional.empty()); assertThatThrownBy(() -> personService.getById(id)) - .isInstanceOf(ResponseStatusException.class) - .extracting(e -> ((ResponseStatusException) e).getStatusCode().value()) + .isInstanceOf(DomainException.class) + .extracting(e -> ((DomainException) e).getStatus().value()) .isEqualTo(404); } @@ -371,8 +372,8 @@ class PersonServiceTest { when(personRepository.findById(sourceId)).thenReturn(Optional.empty()); assertThatThrownBy(() -> personService.mergePersons(sourceId, targetId)) - .isInstanceOf(ResponseStatusException.class) - .extracting(e -> ((ResponseStatusException) e).getStatusCode().value()) + .isInstanceOf(DomainException.class) + .extracting(e -> ((DomainException) e).getStatus().value()) .isEqualTo(404); } @@ -385,8 +386,8 @@ class PersonServiceTest { when(personRepository.findById(targetId)).thenReturn(Optional.empty()); assertThatThrownBy(() -> personService.mergePersons(sourceId, targetId)) - .isInstanceOf(ResponseStatusException.class) - .extracting(e -> ((ResponseStatusException) e).getStatusCode().value()) + .isInstanceOf(DomainException.class) + .extracting(e -> ((DomainException) e).getStatus().value()) .isEqualTo(404); }