feat(service): add alias CRUD methods to PersonService
getAliases (sorted by sort_order), addAlias (auto-incrementing sort_order), removeAlias (with IDOR protection verifying alias belongs to the given person). All TDD with 7 new unit tests. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -4,11 +4,14 @@ import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.raddatz.familienarchiv.dto.PersonNameAliasDTO;
|
||||
import org.raddatz.familienarchiv.dto.PersonSummaryDTO;
|
||||
import org.raddatz.familienarchiv.dto.PersonUpdateDTO;
|
||||
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.repository.PersonNameAliasRepository;
|
||||
import org.raddatz.familienarchiv.repository.PersonRepository;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -22,6 +25,7 @@ import lombok.RequiredArgsConstructor;
|
||||
public class PersonService {
|
||||
|
||||
private final PersonRepository personRepository;
|
||||
private final PersonNameAliasRepository aliasRepository;
|
||||
|
||||
public List<PersonSummaryDTO> findAll(String q) {
|
||||
if (q == null) {
|
||||
@@ -137,4 +141,35 @@ public class PersonService {
|
||||
|
||||
personRepository.deleteById(sourceId);
|
||||
}
|
||||
|
||||
// ─── Alias management ───────────────────────────────────────────────────
|
||||
|
||||
public List<PersonNameAlias> getAliases(UUID personId) {
|
||||
getById(personId);
|
||||
return aliasRepository.findByPersonIdOrderBySortOrderAscCreatedAtAsc(personId);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public PersonNameAlias addAlias(UUID personId, PersonNameAliasDTO dto) {
|
||||
Person person = getById(personId);
|
||||
int nextSortOrder = aliasRepository.findMaxSortOrder(personId) + 1;
|
||||
PersonNameAlias alias = PersonNameAlias.builder()
|
||||
.person(person)
|
||||
.lastName(dto.lastName())
|
||||
.firstName(dto.firstName())
|
||||
.type(dto.type())
|
||||
.sortOrder(nextSortOrder)
|
||||
.build();
|
||||
return aliasRepository.save(alias);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void removeAlias(UUID personId, UUID aliasId) {
|
||||
PersonNameAlias alias = aliasRepository.findById(aliasId)
|
||||
.orElseThrow(() -> DomainException.notFound(ErrorCode.ALIAS_NOT_FOUND, "Alias not found: " + aliasId));
|
||||
if (!alias.getPerson().getId().equals(personId)) {
|
||||
throw DomainException.forbidden("Alias does not belong to this person");
|
||||
}
|
||||
aliasRepository.delete(alias);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user