From 9f90cc1a5f67d927fc200c5f8e6ed013361b7fdf Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 8 Apr 2026 12:55:50 +0200 Subject: [PATCH] feat(service): create MAIDEN_NAME alias in findOrCreateByAlias When split() returns a non-null maidenName, PersonService now creates a PersonNameAlias with type MAIDEN_NAME. The maiden name is stored as lastName on the alias (no firstName). Co-Authored-By: Claude Sonnet 4.6 --- .../familienarchiv/service/PersonService.java | 13 ++++++++- .../service/PersonServiceTest.java | 28 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) 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 ";