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 51bebc24..41607df5 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java @@ -11,6 +11,7 @@ import org.raddatz.familienarchiv.exception.DomainException; import org.raddatz.familienarchiv.exception.ErrorCode; import org.raddatz.familienarchiv.model.Person; import org.raddatz.familienarchiv.model.PersonNameAlias; +import org.raddatz.familienarchiv.model.PersonNameAliasType; import org.raddatz.familienarchiv.repository.PersonNameAliasRepository; import org.raddatz.familienarchiv.repository.PersonRepository; import org.springframework.http.HttpStatus; @@ -62,11 +63,21 @@ public class PersonService { String alias = rawName.trim(); return personRepository.findByAliasIgnoreCase(alias).orElseGet(() -> { PersonNameParser.SplitName split = PersonNameParser.split(alias); - return personRepository.save(Person.builder() + Person person = personRepository.save(Person.builder() .alias(alias) .firstName(split.firstName()) .lastName(split.lastName()) .build()); + if (split.maidenName() != null) { + int nextSortOrder = aliasRepository.findMaxSortOrder(person.getId()) + 1; + aliasRepository.save(PersonNameAlias.builder() + .person(person) + .lastName(split.maidenName()) + .type(PersonNameAliasType.MAIDEN_NAME) + .sortOrder(nextSortOrder) + .build()); + } + return person; }); } 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 33288bf6..e6ee4a0a 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java @@ -201,6 +201,34 @@ class PersonServiceTest { verify(personRepository).save(any()); } + @Test + void findOrCreateByAlias_createsMaidenNameAlias_whenGebPresent() { + String alias = "Clara Cram geb. de Gruyter"; + Person saved = Person.builder().id(UUID.randomUUID()).alias(alias).firstName("Clara").lastName("Cram").build(); + when(personRepository.findByAliasIgnoreCase(alias)).thenReturn(Optional.empty()); + when(personRepository.save(any())).thenReturn(saved); + when(aliasRepository.findMaxSortOrder(saved.getId())).thenReturn(0); + when(aliasRepository.save(any())).thenAnswer(inv -> inv.getArgument(0)); + + personService.findOrCreateByAlias(alias); + + verify(aliasRepository).save(argThat(a -> + a.getLastName().equals("de Gruyter") && + a.getType() == PersonNameAliasType.MAIDEN_NAME)); + } + + @Test + void findOrCreateByAlias_noAlias_whenNoGeb() { + String alias = "Clara Cram"; + Person saved = Person.builder().id(UUID.randomUUID()).alias(alias).firstName("Clara").lastName("Cram").build(); + when(personRepository.findByAliasIgnoreCase(alias)).thenReturn(Optional.empty()); + when(personRepository.save(any())).thenReturn(saved); + + personService.findOrCreateByAlias(alias); + + verify(aliasRepository, never()).save(any()); + } + @Test void findOrCreateByAlias_trimsInput() { String alias = " Clara Cram ";