refactor(geschichte): extract PersonNameFormatter to eliminate duplicated name-join logic
All checks were successful
CI / Unit & Component Tests (pull_request) Successful in 3m15s
CI / OCR Service Tests (pull_request) Successful in 24s
CI / Backend Unit Tests (pull_request) Successful in 3m51s
CI / fail2ban Regex (pull_request) Successful in 45s
CI / Semgrep Security Scan (pull_request) Successful in 22s
CI / Compose Bucket Idempotency (pull_request) Successful in 1m8s

Create PersonNameFormatter with a single static join(firstName, lastName) method.
Replace the inline string concatenation in GeschichteService.toView() and the
private join() method in JourneyItemService with calls to PersonNameFormatter.join().
The new helper handles null-safety and trimming consistently in one place.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-06-08 20:53:49 +02:00
parent 9db3b41fdb
commit 1108277472
3 changed files with 26 additions and 8 deletions

View File

@@ -71,8 +71,7 @@ public class GeschichteService {
AppUser author = g.getAuthor(); AppUser author = g.getAuthor();
GeschichteView.AuthorView authorView = null; GeschichteView.AuthorView authorView = null;
if (author != null) { if (author != null) {
String displayName = ((author.getFirstName() != null ? author.getFirstName() : "") String displayName = PersonNameFormatter.join(author.getFirstName(), author.getLastName());
+ " " + (author.getLastName() != null ? author.getLastName() : "")).trim();
if (displayName.isBlank()) displayName = "[Unbekannt]"; if (displayName.isBlank()) displayName = "[Unbekannt]";
authorView = new GeschichteView.AuthorView(author.getId(), displayName); authorView = new GeschichteView.AuthorView(author.getId(), displayName);
} }

View File

@@ -0,0 +1,22 @@
package org.raddatz.familienarchiv.geschichte;
/**
* Utility for joining a person's first and last name into a display string.
* Centralises the logic that was previously duplicated across GeschichteService
* and JourneyItemService.
*/
public class PersonNameFormatter {
private PersonNameFormatter() {
// utility class — no instances
}
public static String join(String firstName, String lastName) {
String first = firstName != null ? firstName.trim() : "";
String last = lastName != null ? lastName.trim() : "";
if (first.isEmpty() && last.isEmpty()) return "";
if (first.isEmpty()) return last;
if (last.isEmpty()) return first;
return first + " " + last;
}
}

View File

@@ -13,6 +13,7 @@ import org.raddatz.familienarchiv.geschichte.Geschichte;
import org.raddatz.familienarchiv.geschichte.GeschichteQueryService; import org.raddatz.familienarchiv.geschichte.GeschichteQueryService;
import org.raddatz.familienarchiv.geschichte.GeschichteType; import org.raddatz.familienarchiv.geschichte.GeschichteType;
import org.raddatz.familienarchiv.geschichte.DocumentSummary; import org.raddatz.familienarchiv.geschichte.DocumentSummary;
import org.raddatz.familienarchiv.geschichte.PersonNameFormatter;
import org.raddatz.familienarchiv.person.Person; import org.raddatz.familienarchiv.person.Person;
import org.raddatz.familienarchiv.user.AppUser; import org.raddatz.familienarchiv.user.AppUser;
import org.raddatz.familienarchiv.user.UserService; import org.raddatz.familienarchiv.user.UserService;
@@ -216,7 +217,7 @@ public class JourneyItemService {
private static String buildSenderName(Document doc) { private static String buildSenderName(Document doc) {
Person sender = doc.getSender(); Person sender = doc.getSender();
if (sender != null) { if (sender != null) {
String name = join(sender.getFirstName(), sender.getLastName()); String name = PersonNameFormatter.join(sender.getFirstName(), sender.getLastName());
if (!name.isBlank()) return name; if (!name.isBlank()) return name;
} }
String senderText = doc.getSenderText(); String senderText = doc.getSenderText();
@@ -228,7 +229,7 @@ public class JourneyItemService {
return receivers.stream() return receivers.stream()
.min(Comparator.comparing(p -> sortKey(p.getLastName()) + " " + sortKey(p.getFirstName()))) .min(Comparator.comparing(p -> sortKey(p.getLastName()) + " " + sortKey(p.getFirstName())))
.map(p -> { .map(p -> {
String name = join(p.getFirstName(), p.getLastName()); String name = PersonNameFormatter.join(p.getFirstName(), p.getLastName());
return name.isBlank() ? null : name; return name.isBlank() ? null : name;
}) })
.orElse(null); .orElse(null);
@@ -239,10 +240,6 @@ public class JourneyItemService {
return raw.trim(); return raw.trim();
} }
private static String join(String first, String last) {
return ((first != null ? first : "") + " " + (last != null ? last : "")).trim();
}
private static String sortKey(String s) { private static String sortKey(String s) {
return s != null ? s : ""; return s != null ? s : "";
} }