feat(model): add title, personType, displayName to Person entity
- Add title (nullable VARCHAR) and personType (enum, default PERSON) - Make firstName nullable for non-person entities - Add @Transient getDisplayName() as single source of truth for name display, exposed via @Schema(READ_ONLY, REQUIRED) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -21,14 +21,22 @@ public class Person {
|
|||||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private UUID id;
|
private UUID id;
|
||||||
|
|
||||||
@Column(nullable = false)
|
@Column(name = "title")
|
||||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
|
private String title;
|
||||||
|
|
||||||
|
@Column(nullable = true)
|
||||||
private String firstName;
|
private String firstName;
|
||||||
|
|
||||||
@Column(nullable = false)
|
@Column(nullable = false)
|
||||||
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private String lastName;
|
private String lastName;
|
||||||
|
|
||||||
|
@Enumerated(EnumType.STRING)
|
||||||
|
@Column(name = "person_type", nullable = false)
|
||||||
|
@Builder.Default
|
||||||
|
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private PersonType personType = PersonType.PERSON;
|
||||||
|
|
||||||
// Optional: Aliasse für die Suche (z.B. "Opa Hans")
|
// Optional: Aliasse für die Suche (z.B. "Opa Hans")
|
||||||
private String alias;
|
private String alias;
|
||||||
|
|
||||||
@@ -46,4 +54,14 @@ public class Person {
|
|||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private List<PersonNameAlias> nameAliases = new ArrayList<>();
|
private List<PersonNameAlias> nameAliases = new ArrayList<>();
|
||||||
|
|
||||||
|
@Transient
|
||||||
|
@Schema(accessMode = Schema.AccessMode.READ_ONLY, requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
public String getDisplayName() {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (title != null) sb.append(title).append(" ");
|
||||||
|
if (firstName != null) sb.append(firstName).append(" ");
|
||||||
|
sb.append(lastName);
|
||||||
|
return sb.toString().trim();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package org.raddatz.familienarchiv.model;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
class PersonTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getDisplayName_withAllFields() {
|
||||||
|
Person person = Person.builder()
|
||||||
|
.title("Dr.")
|
||||||
|
.firstName("Walter")
|
||||||
|
.lastName("de Gruyter")
|
||||||
|
.build();
|
||||||
|
assertThat(person.getDisplayName()).isEqualTo("Dr. Walter de Gruyter");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getDisplayName_withoutTitle() {
|
||||||
|
Person person = Person.builder()
|
||||||
|
.firstName("Clara")
|
||||||
|
.lastName("Cram")
|
||||||
|
.build();
|
||||||
|
assertThat(person.getDisplayName()).isEqualTo("Clara Cram");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getDisplayName_withNullFirstName() {
|
||||||
|
Person person = Person.builder()
|
||||||
|
.lastName("Gesellschafter des Verlages")
|
||||||
|
.build();
|
||||||
|
assertThat(person.getDisplayName()).isEqualTo("Gesellschafter des Verlages");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getDisplayName_withTitleAndNullFirstName() {
|
||||||
|
Person person = Person.builder()
|
||||||
|
.title("Tante")
|
||||||
|
.lastName("Molly")
|
||||||
|
.build();
|
||||||
|
assertThat(person.getDisplayName()).isEqualTo("Tante Molly");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void personType_defaultsToPerson() {
|
||||||
|
Person person = Person.builder()
|
||||||
|
.firstName("Clara")
|
||||||
|
.lastName("Cram")
|
||||||
|
.build();
|
||||||
|
assertThat(person.getPersonType()).isEqualTo(PersonType.PERSON);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user