feat(service): integrate PersonTypeClassifier into findOrCreateByAlias

Classify raw name before processing. SKIP returns null (no Person
created). INSTITUTION/GROUP skip split() and store full name in
lastName with firstName=null and appropriate personType.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-04-08 13:06:49 +02:00
parent 68f0c4c4b9
commit a3da5731d0
2 changed files with 54 additions and 0 deletions

View File

@@ -12,6 +12,7 @@ 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.model.PersonType;
import org.raddatz.familienarchiv.repository.PersonNameAliasRepository;
import org.raddatz.familienarchiv.repository.PersonRepository;
import org.springframework.http.HttpStatus;
@@ -61,7 +62,18 @@ public class PersonService {
@Transactional
public Person findOrCreateByAlias(String rawName) {
String alias = rawName.trim();
PersonType type = PersonTypeClassifier.classify(alias);
if (type == PersonType.SKIP) return null;
return personRepository.findByAliasIgnoreCase(alias).orElseGet(() -> {
if (type == PersonType.INSTITUTION || type == PersonType.GROUP) {
return personRepository.save(Person.builder()
.alias(alias)
.lastName(alias)
.personType(type)
.build());
}
PersonNameParser.SplitName split = PersonNameParser.split(alias);
Person person = personRepository.save(Person.builder()
.alias(alias)

View File

@@ -12,6 +12,7 @@ import org.raddatz.familienarchiv.exception.DomainException;
import org.raddatz.familienarchiv.model.Person;
import org.raddatz.familienarchiv.model.PersonNameAlias;
import org.raddatz.familienarchiv.model.PersonNameAliasType;
import org.raddatz.familienarchiv.model.PersonType;
import org.raddatz.familienarchiv.repository.PersonNameAliasRepository;
import org.raddatz.familienarchiv.repository.PersonRepository;
import org.springframework.web.server.ResponseStatusException;
@@ -217,6 +218,47 @@ class PersonServiceTest {
a.getType() == PersonNameAliasType.MAIDEN_NAME));
}
@Test
void findOrCreateByAlias_returnsNull_whenSkip() {
Person result = personService.findOrCreateByAlias("Briefumschlag aus Java");
assertThat(result).isNull();
verify(personRepository, never()).save(any());
}
@Test
void findOrCreateByAlias_setsInstitutionType_withFullNameInLastName() {
String alias = "Arthur Collignon GmbH";
when(personRepository.findByAliasIgnoreCase(alias)).thenReturn(Optional.empty());
when(personRepository.save(any())).thenAnswer(inv -> {
Person p = inv.getArgument(0);
p.setId(UUID.randomUUID());
return p;
});
Person result = personService.findOrCreateByAlias(alias);
assertThat(result.getPersonType()).isEqualTo(PersonType.INSTITUTION);
assertThat(result.getFirstName()).isNull();
assertThat(result.getLastName()).isEqualTo("Arthur Collignon GmbH");
}
@Test
void findOrCreateByAlias_setsGroupType_withFullNameInLastName() {
String alias = "Geschwister de Gruyter";
when(personRepository.findByAliasIgnoreCase(alias)).thenReturn(Optional.empty());
when(personRepository.save(any())).thenAnswer(inv -> {
Person p = inv.getArgument(0);
p.setId(UUID.randomUUID());
return p;
});
Person result = personService.findOrCreateByAlias(alias);
assertThat(result.getPersonType()).isEqualTo(PersonType.GROUP);
assertThat(result.getFirstName()).isNull();
assertThat(result.getLastName()).isEqualTo("Geschwister de Gruyter");
}
@Test
void findOrCreateByAlias_noAlias_whenNoGeb() {
String alias = "Clara Cram";