From 14fa7b058b48c7b469ddf625196733e68bc64a01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= <127139797+balazs-szucs@users.noreply.github.com> Date: Thu, 22 Jan 2026 06:40:40 +0100 Subject: [PATCH] feat(metadata): add 'Replace When Provided' option to metadata replacement modes (#2379) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Balázs Szücs --- .../model/enums/MetadataReplaceMode.java | 3 +- .../service/metadata/BookMetadataUpdater.java | 40 ++++++++----------- ...tadata-advanced-fetch-options.component.ts | 3 +- .../request/metadata-refresh-options.model.ts | 2 +- 4 files changed, 21 insertions(+), 27 deletions(-) diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/model/enums/MetadataReplaceMode.java b/booklore-api/src/main/java/com/adityachandel/booklore/model/enums/MetadataReplaceMode.java index efdcb290d..009cd2ed8 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/model/enums/MetadataReplaceMode.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/model/enums/MetadataReplaceMode.java @@ -2,5 +2,6 @@ package com.adityachandel.booklore.model.enums; public enum MetadataReplaceMode { REPLACE_ALL, - REPLACE_MISSING + REPLACE_MISSING, + REPLACE_WHEN_PROVIDED } diff --git a/booklore-api/src/main/java/com/adityachandel/booklore/service/metadata/BookMetadataUpdater.java b/booklore-api/src/main/java/com/adityachandel/booklore/service/metadata/BookMetadataUpdater.java index dc70a38d7..4e9338023 100644 --- a/booklore-api/src/main/java/com/adityachandel/booklore/service/metadata/BookMetadataUpdater.java +++ b/booklore-api/src/main/java/com/adityachandel/booklore/service/metadata/BookMetadataUpdater.java @@ -186,10 +186,14 @@ public class BookMetadataUpdater { if (newValue != null) setter.accept(newValue); return; } - if (mode == MetadataReplaceMode.REPLACE_ALL) { - setter.accept(newValue); - } else if (mode == MetadataReplaceMode.REPLACE_MISSING && isValueMissing(getter.get())) { - setter.accept(newValue); + switch (mode) { + case REPLACE_ALL -> setter.accept(newValue); + case REPLACE_MISSING -> { + if (isValueMissing(getter.get())) setter.accept(newValue); + } + case REPLACE_WHEN_PROVIDED -> { + if (!isValueMissing(newValue)) setter.accept(newValue); + } } } @@ -223,14 +227,11 @@ public class BookMetadataUpdater { if (newAuthors.isEmpty()) return; - boolean replaceAll = replaceMode == MetadataReplaceMode.REPLACE_ALL; - boolean replaceMissing = replaceMode == MetadataReplaceMode.REPLACE_MISSING; - - if (replaceAll) { + if (replaceMode == MetadataReplaceMode.REPLACE_ALL || replaceMode == MetadataReplaceMode.REPLACE_WHEN_PROVIDED) { if (!merge) e.getAuthors().clear(); e.getAuthors().addAll(newAuthors); e.updateSearchText(); - } else if (replaceMissing && e.getAuthors().isEmpty()) { + } else if (replaceMode == MetadataReplaceMode.REPLACE_MISSING && e.getAuthors().isEmpty()) { e.getAuthors().addAll(newAuthors); e.updateSearchText(); } else if (replaceMode == null) { @@ -264,13 +265,10 @@ public class BookMetadataUpdater { if (newCategories.isEmpty()) return; - boolean replaceAll = replaceMode == MetadataReplaceMode.REPLACE_ALL; - boolean replaceMissing = replaceMode == MetadataReplaceMode.REPLACE_MISSING; - - if (replaceAll) { + if (replaceMode == MetadataReplaceMode.REPLACE_ALL || replaceMode == MetadataReplaceMode.REPLACE_WHEN_PROVIDED) { if (!merge) e.getCategories().clear(); e.getCategories().addAll(newCategories); - } else if (replaceMissing && e.getCategories().isEmpty()) { + } else if (replaceMode == MetadataReplaceMode.REPLACE_MISSING && e.getCategories().isEmpty()) { e.getCategories().addAll(newCategories); } else if (replaceMode == null) { if (!merge) e.getCategories().clear(); @@ -302,13 +300,10 @@ public class BookMetadataUpdater { if (newMoods.isEmpty()) return; - boolean replaceAll = replaceMode == MetadataReplaceMode.REPLACE_ALL; - boolean replaceMissing = replaceMode == MetadataReplaceMode.REPLACE_MISSING; - - if (replaceAll) { + if (replaceMode == MetadataReplaceMode.REPLACE_ALL || replaceMode == MetadataReplaceMode.REPLACE_WHEN_PROVIDED) { if (!merge) e.getMoods().clear(); e.getMoods().addAll(newMoods); - } else if (replaceMissing && e.getMoods().isEmpty()) { + } else if (replaceMode == MetadataReplaceMode.REPLACE_MISSING && e.getMoods().isEmpty()) { e.getMoods().addAll(newMoods); } else if (replaceMode == null) { if (!merge) e.getMoods().clear(); @@ -340,13 +335,10 @@ public class BookMetadataUpdater { if (newTags.isEmpty()) return; - boolean replaceAll = replaceMode == MetadataReplaceMode.REPLACE_ALL; - boolean replaceMissing = replaceMode == MetadataReplaceMode.REPLACE_MISSING; - - if (replaceAll) { + if (replaceMode == MetadataReplaceMode.REPLACE_ALL || replaceMode == MetadataReplaceMode.REPLACE_WHEN_PROVIDED) { if (!merge) e.getTags().clear(); e.getTags().addAll(newTags); - } else if (replaceMissing && e.getTags().isEmpty()) { + } else if (replaceMode == MetadataReplaceMode.REPLACE_MISSING && e.getTags().isEmpty()) { e.getTags().addAll(newTags); } else if (replaceMode == null) { if (!merge) e.getTags().clear(); diff --git a/booklore-ui/src/app/features/metadata/component/metadata-options-dialog/metadata-advanced-fetch-options/metadata-advanced-fetch-options.component.ts b/booklore-ui/src/app/features/metadata/component/metadata-options-dialog/metadata-advanced-fetch-options/metadata-advanced-fetch-options.component.ts index d558fe5a3..d1693475e 100644 --- a/booklore-ui/src/app/features/metadata/component/metadata-options-dialog/metadata-advanced-fetch-options/metadata-advanced-fetch-options.component.ts +++ b/booklore-ui/src/app/features/metadata/component/metadata-options-dialog/metadata-advanced-fetch-options/metadata-advanced-fetch-options.component.ts @@ -64,7 +64,8 @@ export class MetadataAdvancedFetchOptionsComponent implements OnChanges { replaceModeOptions: { label: string; value: MetadataReplaceMode }[] = [ { label: 'Replace Missing Only', value: 'REPLACE_MISSING' }, - { label: 'Replace All Fields', value: 'REPLACE_ALL' } + { label: 'Replace All Fields', value: 'REPLACE_ALL' }, + { label: 'Replace When Provided', value: 'REPLACE_WHEN_PROVIDED' } ]; fieldOptions: FieldOptions = this.initializeFieldOptions(); diff --git a/booklore-ui/src/app/features/metadata/model/request/metadata-refresh-options.model.ts b/booklore-ui/src/app/features/metadata/model/request/metadata-refresh-options.model.ts index 35c75083b..ff27752e6 100644 --- a/booklore-ui/src/app/features/metadata/model/request/metadata-refresh-options.model.ts +++ b/booklore-ui/src/app/features/metadata/model/request/metadata-refresh-options.model.ts @@ -1,4 +1,4 @@ -export type MetadataReplaceMode = 'REPLACE_ALL' | 'REPLACE_MISSING'; +export type MetadataReplaceMode = 'REPLACE_ALL' | 'REPLACE_MISSING' | 'REPLACE_WHEN_PROVIDED'; export interface MetadataRefreshOptions { libraryId: number | null;