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 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,7 @@ import org.raddatz.familienarchiv.exception.DomainException;
|
|||||||
import org.raddatz.familienarchiv.exception.ErrorCode;
|
import org.raddatz.familienarchiv.exception.ErrorCode;
|
||||||
import org.raddatz.familienarchiv.model.Person;
|
import org.raddatz.familienarchiv.model.Person;
|
||||||
import org.raddatz.familienarchiv.model.PersonNameAlias;
|
import org.raddatz.familienarchiv.model.PersonNameAlias;
|
||||||
|
import org.raddatz.familienarchiv.model.PersonNameAliasType;
|
||||||
import org.raddatz.familienarchiv.repository.PersonNameAliasRepository;
|
import org.raddatz.familienarchiv.repository.PersonNameAliasRepository;
|
||||||
import org.raddatz.familienarchiv.repository.PersonRepository;
|
import org.raddatz.familienarchiv.repository.PersonRepository;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
@@ -62,11 +63,21 @@ public class PersonService {
|
|||||||
String alias = rawName.trim();
|
String alias = rawName.trim();
|
||||||
return personRepository.findByAliasIgnoreCase(alias).orElseGet(() -> {
|
return personRepository.findByAliasIgnoreCase(alias).orElseGet(() -> {
|
||||||
PersonNameParser.SplitName split = PersonNameParser.split(alias);
|
PersonNameParser.SplitName split = PersonNameParser.split(alias);
|
||||||
return personRepository.save(Person.builder()
|
Person person = personRepository.save(Person.builder()
|
||||||
.alias(alias)
|
.alias(alias)
|
||||||
.firstName(split.firstName())
|
.firstName(split.firstName())
|
||||||
.lastName(split.lastName())
|
.lastName(split.lastName())
|
||||||
.build());
|
.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;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -201,6 +201,34 @@ class PersonServiceTest {
|
|||||||
verify(personRepository).save(any());
|
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
|
@Test
|
||||||
void findOrCreateByAlias_trimsInput() {
|
void findOrCreateByAlias_trimsInput() {
|
||||||
String alias = " Clara Cram ";
|
String alias = " Clara Cram ";
|
||||||
|
|||||||
Reference in New Issue
Block a user