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
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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 : "";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user