refactor: inline private normalize() wrappers; use StringNormalizer.toLowerCaseRoot() directly

Remove boilerplate private normalize(String) wrappers from:
- ChannelDirectoryService
- ChannelSettingsService
- AccountService
- AuditLogService (keepsg normalizeFilter() which adds null-if-blank semantics)

Add StringNormalizer import to AuditLogService; remove now-unused Locale import.
This commit is contained in:
2026-04-24 16:13:27 +02:00
parent 41ba1e242e
commit 7b72cbafc9
4 changed files with 29 additions and 43 deletions
@@ -54,7 +54,7 @@ public class AccountService {
@Transactional @Transactional
public void deleteAccount(String username) { public void deleteAccount(String username) {
String normalized = normalize(username); String normalized = StringNormalizer.toLowerCaseRoot(username);
if (normalized == null || normalized.isBlank()) { if (normalized == null || normalized.isBlank()) {
return; return;
} }
@@ -95,7 +95,4 @@ public class AccountService {
jdbcTemplate.update("DELETE FROM SPRING_SESSION WHERE PRINCIPAL_NAME = ?", username); jdbcTemplate.update("DELETE FROM SPRING_SESSION WHERE PRINCIPAL_NAME = ?", username);
} }
private String normalize(String value) {
return StringNormalizer.toLowerCaseRoot(value);
}
} }
@@ -3,7 +3,7 @@ package dev.kruhlmann.imgfloat.service;
import dev.kruhlmann.imgfloat.model.db.audit.AuditLogEntry; import dev.kruhlmann.imgfloat.model.db.audit.AuditLogEntry;
import dev.kruhlmann.imgfloat.repository.audit.AuditLogRepository; import dev.kruhlmann.imgfloat.repository.audit.AuditLogRepository;
import dev.kruhlmann.imgfloat.util.LogSanitizer; import dev.kruhlmann.imgfloat.util.LogSanitizer;
import java.util.Locale; import dev.kruhlmann.imgfloat.util.StringNormalizer;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
@@ -25,11 +25,11 @@ public class AuditLogService {
} }
public void recordEntry(String broadcaster, String actor, String action, String details) { public void recordEntry(String broadcaster, String actor, String action, String details) {
String normalizedBroadcaster = normalize(broadcaster); String normalizedBroadcaster = StringNormalizer.toLowerCaseRoot(broadcaster);
if (normalizedBroadcaster == null || normalizedBroadcaster.isBlank()) { if (normalizedBroadcaster == null || normalizedBroadcaster.isBlank()) {
return; return;
} }
String normalizedActor = normalize(actor); String normalizedActor = StringNormalizer.toLowerCaseRoot(actor);
if (normalizedActor == null || normalizedActor.isBlank()) { if (normalizedActor == null || normalizedActor.isBlank()) {
normalizedActor = DEFAULT_ACTOR; normalizedActor = DEFAULT_ACTOR;
} }
@@ -60,7 +60,7 @@ public class AuditLogService {
int page, int page,
int size int size
) { ) {
String normalizedBroadcaster = normalize(broadcaster); String normalizedBroadcaster = StringNormalizer.toLowerCaseRoot(broadcaster);
if (normalizedBroadcaster == null || normalizedBroadcaster.isBlank()) { if (normalizedBroadcaster == null || normalizedBroadcaster.isBlank()) {
return Page.empty(); return Page.empty();
} }
@@ -80,19 +80,15 @@ public class AuditLogService {
} }
public void deleteEntriesForBroadcaster(String broadcaster) { public void deleteEntriesForBroadcaster(String broadcaster) {
String normalizedBroadcaster = normalize(broadcaster); String normalizedBroadcaster = StringNormalizer.toLowerCaseRoot(broadcaster);
if (normalizedBroadcaster == null || normalizedBroadcaster.isBlank()) { if (normalizedBroadcaster == null || normalizedBroadcaster.isBlank()) {
return; return;
} }
auditLogRepository.deleteByBroadcaster(normalizedBroadcaster); auditLogRepository.deleteByBroadcaster(normalizedBroadcaster);
} }
private String normalize(String value) {
return value == null ? null : value.toLowerCase(Locale.ROOT);
}
private String normalizeFilter(String value) { private String normalizeFilter(String value) {
String normalized = normalize(value); String normalized = StringNormalizer.toLowerCaseRoot(value);
return normalized == null || normalized.isBlank() ? null : normalized; return normalized == null || normalized.isBlank() ? null : normalized;
} }
} }
@@ -122,12 +122,12 @@ public class ChannelDirectoryService {
} }
public Channel getOrCreateChannel(String broadcaster) { public Channel getOrCreateChannel(String broadcaster) {
String normalized = normalize(broadcaster); String normalized = StringNormalizer.toLowerCaseRoot(broadcaster);
return channelRepository.findById(normalized).orElseGet(() -> channelRepository.save(new Channel(normalized))); return channelRepository.findById(normalized).orElseGet(() -> channelRepository.save(new Channel(normalized)));
} }
public List<String> searchBroadcasters(String query) { public List<String> searchBroadcasters(String query) {
String q = normalize(query); String q = StringNormalizer.toLowerCaseRoot(query);
return channelRepository return channelRepository
.findTop50ByBroadcasterContainingIgnoreCaseOrderByBroadcasterAsc(q == null ? "" : q) .findTop50ByBroadcasterContainingIgnoreCaseOrderByBroadcasterAsc(q == null ? "" : q)
.stream() .stream()
@@ -137,7 +137,7 @@ public class ChannelDirectoryService {
public boolean addAdmin(String broadcaster, String username, String actor) { public boolean addAdmin(String broadcaster, String username, String actor) {
Channel channel = getOrCreateChannel(broadcaster); Channel channel = getOrCreateChannel(broadcaster);
String normalizedUsername = normalize(username); String normalizedUsername = StringNormalizer.toLowerCaseRoot(username);
boolean added = channel.addAdmin(normalizedUsername); boolean added = channel.addAdmin(normalizedUsername);
if (added) { if (added) {
channelRepository.saveAndFlush(channel); channelRepository.saveAndFlush(channel);
@@ -154,7 +154,7 @@ public class ChannelDirectoryService {
public boolean removeAdmin(String broadcaster, String username, String actor) { public boolean removeAdmin(String broadcaster, String username, String actor) {
Channel channel = getOrCreateChannel(broadcaster); Channel channel = getOrCreateChannel(broadcaster);
String normalizedUsername = normalize(username); String normalizedUsername = StringNormalizer.toLowerCaseRoot(username);
boolean removed = channel.removeAdmin(normalizedUsername); boolean removed = channel.removeAdmin(normalizedUsername);
if (removed) { if (removed) {
channelRepository.saveAndFlush(channel); channelRepository.saveAndFlush(channel);
@@ -170,12 +170,12 @@ public class ChannelDirectoryService {
} }
public Collection<AssetView> getAssetsForAdmin(String broadcaster) { public Collection<AssetView> getAssetsForAdmin(String broadcaster) {
String normalized = normalize(broadcaster); String normalized = StringNormalizer.toLowerCaseRoot(broadcaster);
return sortAndMapAssets(normalized, assetRepository.findByBroadcaster(normalized)); return sortAndMapAssets(normalized, assetRepository.findByBroadcaster(normalized));
} }
public Collection<AssetView> getVisibleAssets(String broadcaster) { public Collection<AssetView> getVisibleAssets(String broadcaster) {
String normalized = normalize(broadcaster); String normalized = StringNormalizer.toLowerCaseRoot(broadcaster);
List<Asset> assets = assetRepository.findByBroadcaster(normalized); List<Asset> assets = assetRepository.findByBroadcaster(normalized);
List<String> visualIds = assets List<String> visualIds = assets
.stream() .stream()
@@ -335,7 +335,7 @@ public class ChannelDirectoryService {
@Transactional @Transactional
public Optional<AssetView> updateCodeAsset(String broadcaster, String assetId, CodeAssetRequest request, String actor) { public Optional<AssetView> updateCodeAsset(String broadcaster, String assetId, CodeAssetRequest request, String actor) {
validateCodeAssetSource(request.getSource()); validateCodeAssetSource(request.getSource());
String normalized = normalize(broadcaster); String normalized = StringNormalizer.toLowerCaseRoot(broadcaster);
byte[] bytes = request.getSource().getBytes(StandardCharsets.UTF_8); byte[] bytes = request.getSource().getBytes(StandardCharsets.UTF_8);
enforceUploadLimit(bytes.length); enforceUploadLimit(bytes.length);
List<String> allowedDomains = normalizeAllowedDomains(request.getAllowedDomains()); List<String> allowedDomains = normalizeAllowedDomains(request.getAllowedDomains());
@@ -683,7 +683,7 @@ public class ChannelDirectoryService {
@Transactional @Transactional
public Optional<AssetView> updateTransform(String broadcaster, String assetId, TransformRequest req, String actor) { public Optional<AssetView> updateTransform(String broadcaster, String assetId, TransformRequest req, String actor) {
String normalized = normalize(broadcaster); String normalized = StringNormalizer.toLowerCaseRoot(broadcaster);
return assetRepository return assetRepository
.findById(assetId) .findById(assetId)
@@ -809,7 +809,7 @@ public class ChannelDirectoryService {
} }
public Optional<AssetPatch> previewTransform(String broadcaster, String assetId, TransformRequest request) { public Optional<AssetPatch> previewTransform(String broadcaster, String assetId, TransformRequest request) {
String normalized = normalize(broadcaster); String normalized = StringNormalizer.toLowerCaseRoot(broadcaster);
Asset asset = assetRepository Asset asset = assetRepository
.findById(assetId) .findById(assetId)
@@ -876,7 +876,7 @@ public class ChannelDirectoryService {
if (updates == null || updates.isEmpty()) { if (updates == null || updates.isEmpty()) {
return; return;
} }
String normalized = normalize(broadcaster); String normalized = StringNormalizer.toLowerCaseRoot(broadcaster);
applyBulkOrderUpdates( applyBulkOrderUpdates(
broadcaster, broadcaster,
normalized, normalized,
@@ -1082,7 +1082,7 @@ public class ChannelDirectoryService {
} }
public Optional<AssetView> triggerPlayback(String broadcaster, String assetId, PlaybackRequest req, String actor) { public Optional<AssetView> triggerPlayback(String broadcaster, String assetId, PlaybackRequest req, String actor) {
String normalized = normalize(broadcaster); String normalized = StringNormalizer.toLowerCaseRoot(broadcaster);
return assetRepository return assetRepository
.findById(assetId) .findById(assetId)
.filter((a) -> normalized.equals(a.getBroadcaster())) .filter((a) -> normalized.equals(a.getBroadcaster()))
@@ -1110,7 +1110,7 @@ public class ChannelDirectoryService {
VisibilityRequest request, VisibilityRequest request,
String actor String actor
) { ) {
String normalized = normalize(broadcaster); String normalized = StringNormalizer.toLowerCaseRoot(broadcaster);
return assetRepository return assetRepository
.findById(assetId) .findById(assetId)
.filter((a) -> normalized.equals(a.getBroadcaster())) .filter((a) -> normalized.equals(a.getBroadcaster()))
@@ -1224,7 +1224,7 @@ public class ChannelDirectoryService {
public List<ScriptAssetAttachmentView> listScriptAttachments(String broadcaster, String scriptAssetId) { public List<ScriptAssetAttachmentView> listScriptAttachments(String broadcaster, String scriptAssetId) {
Asset asset = requireScriptAssetForBroadcaster(broadcaster, scriptAssetId); Asset asset = requireScriptAssetForBroadcaster(broadcaster, scriptAssetId);
return loadScriptAttachments(normalize(broadcaster), asset.getId(), null); return loadScriptAttachments(StringNormalizer.toLowerCaseRoot(broadcaster), asset.getId(), null);
} }
@Transactional(rollbackFor = IOException.class) @Transactional(rollbackFor = IOException.class)
@@ -1343,7 +1343,7 @@ public class ChannelDirectoryService {
) { ) {
Asset asset = assetRepository Asset asset = assetRepository
.findById(scriptAssetId) .findById(scriptAssetId)
.filter((stored) -> normalize(broadcaster).equals(stored.getBroadcaster())) .filter((stored) -> StringNormalizer.toLowerCaseRoot(broadcaster).equals(stored.getBroadcaster()))
.filter((stored) -> stored.getAssetType() == AssetType.SCRIPT) .filter((stored) -> stored.getAssetType() == AssetType.SCRIPT)
.orElse(null); .orElse(null);
if (asset == null) { if (asset == null) {
@@ -1372,9 +1372,9 @@ public class ChannelDirectoryService {
public boolean isAdmin(String broadcaster, String username) { public boolean isAdmin(String broadcaster, String username) {
return channelRepository return channelRepository
.findById(normalize(broadcaster)) .findById(StringNormalizer.toLowerCaseRoot(broadcaster))
.map(Channel::getAdmins) .map(Channel::getAdmins)
.map((admins) -> admins.contains(normalize(username))) .map((admins) -> admins.contains(StringNormalizer.toLowerCaseRoot(username)))
.orElse(false); .orElse(false);
} }
@@ -1389,10 +1389,6 @@ public class ChannelDirectoryService {
.toList(); .toList();
} }
private String normalize(String value) {
return StringNormalizer.toLowerCaseRoot(value);
}
private boolean isCodeMediaType(String mediaType) { private boolean isCodeMediaType(String mediaType) {
if (mediaType == null || mediaType.isBlank()) { if (mediaType == null || mediaType.isBlank()) {
return false; return false;
@@ -1466,7 +1462,7 @@ public class ChannelDirectoryService {
} }
private String topicFor(String broadcaster) { private String topicFor(String broadcaster) {
return "/topic/channel/" + normalize(broadcaster); return "/topic/channel/" + StringNormalizer.toLowerCaseRoot(broadcaster);
} }
private List<AssetView> sortAndMapAssets(String broadcaster, Collection<Asset> assets) { private List<AssetView> sortAndMapAssets(String broadcaster, Collection<Asset> assets) {
@@ -1534,7 +1530,7 @@ public class ChannelDirectoryService {
private int nextDisplayOrder(String broadcaster, AssetType... types) { private int nextDisplayOrder(String broadcaster, AssetType... types) {
return ( return (
assetRepository assetRepository
.findByBroadcaster(normalize(broadcaster)) .findByBroadcaster(StringNormalizer.toLowerCaseRoot(broadcaster))
.stream() .stream()
.filter((asset) -> Arrays.asList(types).contains(asset.getAssetType())) .filter((asset) -> Arrays.asList(types).contains(asset.getAssetType()))
.map(Asset::getDisplayOrder) .map(Asset::getDisplayOrder)
@@ -1577,7 +1573,7 @@ public class ChannelDirectoryService {
return List.of(); return List.of();
} }
List<Asset> ordered = assetRepository List<Asset> ordered = assetRepository
.findByBroadcaster(normalize(broadcaster)) .findByBroadcaster(StringNormalizer.toLowerCaseRoot(broadcaster))
.stream() .stream()
.filter((asset) -> types.contains(asset.getAssetType())) .filter((asset) -> types.contains(asset.getAssetType()))
.sorted( .sorted(
@@ -1744,7 +1740,7 @@ public class ChannelDirectoryService {
} }
private Asset requireScriptAssetForBroadcaster(String broadcaster, String scriptAssetId) { private Asset requireScriptAssetForBroadcaster(String broadcaster, String scriptAssetId) {
String normalized = normalize(broadcaster); String normalized = StringNormalizer.toLowerCaseRoot(broadcaster);
return assetRepository return assetRepository
.findById(scriptAssetId) .findById(scriptAssetId)
.filter((asset) -> normalized.equals(asset.getBroadcaster())) .filter((asset) -> normalized.equals(asset.getBroadcaster()))
@@ -190,16 +190,13 @@ public class ChannelSettingsService {
} }
private Channel getOrCreateChannel(String broadcaster) { private Channel getOrCreateChannel(String broadcaster) {
String normalized = normalize(broadcaster); String normalized = StringNormalizer.toLowerCaseRoot(broadcaster);
return channelRepository.findById(normalized) return channelRepository.findById(normalized)
.orElseGet(() -> channelRepository.save(new Channel(normalized))); .orElseGet(() -> channelRepository.save(new Channel(normalized)));
} }
private String topicFor(String broadcaster) { private String topicFor(String broadcaster) {
return "/topic/channel/" + normalize(broadcaster); return "/topic/channel/" + StringNormalizer.toLowerCaseRoot(broadcaster);
} }
private String normalize(String value) {
return StringNormalizer.toLowerCaseRoot(value);
}
} }