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 41607df5..590f10b9 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/PersonService.java @@ -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) 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 e6ee4a0a..1095e93f 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/service/PersonServiceTest.java @@ -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";