Fix: locking fields discards unsaved changes (#1799)

* Fixes data loss on lock fields

* Test combined metadata update and lock field
This commit is contained in:
Muppetteer
2025-12-10 18:23:16 +11:00
committed by GitHub
parent 962e232495
commit ff67bed2c4
2 changed files with 33 additions and 3 deletions

View File

@@ -74,8 +74,6 @@ public class BookMetadataUpdater {
MetadataClearFlags clearFlags = wrapper.getClearFlags();
BookMetadataEntity metadata = bookEntity.getMetadata();
updateLocks(newMetadata, metadata);
boolean thumbnailRequiresUpdate = StringUtils.hasText(newMetadata.getThumbnailUrl());
boolean hasMetadataChanges = MetadataChangeDetector.isDifferent(newMetadata, metadata, clearFlags);
boolean hasValueChanges = MetadataChangeDetector.hasValueChanges(newMetadata, metadata, clearFlags);
@@ -84,7 +82,8 @@ public class BookMetadataUpdater {
return;
}
if (metadata.areAllFieldsLocked()) {
// If all fields are locked we must allow unlocking, hasValueChanges will be false
if (metadata.areAllFieldsLocked() && hasValueChanges) {
log.warn("All fields are locked for book ID {}. Skipping update.", bookId);
return;
}
@@ -103,6 +102,7 @@ public class BookMetadataUpdater {
updateTagsIfNeeded(newMetadata, metadata, clearFlags, mergeTags, replaceMode);
bookReviewUpdateService.updateBookReviews(newMetadata, metadata, clearFlags, mergeCategories);
updateThumbnailIfNeeded(bookId, newMetadata, metadata, updateThumbnail);
updateLocks(newMetadata, metadata);
bookRepository.save(bookEntity);

View File

@@ -259,4 +259,34 @@ class BookMetadataUpdaterTest {
assertTrue(bookEntity.getMetadata().getMoods().stream().anyMatch(m -> m.getName().equals("Mood2")));
assertTrue(bookEntity.getMetadata().getMoods().stream().anyMatch(m -> m.getName().equals("Mood3")));
}
@Test
void setBookMetadata_withLockField_shouldUpdateAndLock() {
BookEntity bookEntity = new BookEntity();
bookEntity.setId(1L);
BookMetadataEntity metadataEntity = new BookMetadataEntity();
metadataEntity.setTitle("Old Title");
metadataEntity.setTitleLocked(false);
bookEntity.setMetadata(metadataEntity);
BookMetadata newMetadata = new BookMetadata();
newMetadata.setTitle("New Title");
newMetadata.setTitleLocked(true);
MetadataUpdateWrapper wrapper = MetadataUpdateWrapper.builder()
.metadata(newMetadata)
.build();
MetadataUpdateContext context = MetadataUpdateContext.builder()
.bookEntity(bookEntity)
.metadataUpdateWrapper(wrapper)
.replaceMode(MetadataReplaceMode.REPLACE_ALL)
.build();
bookMetadataUpdater.setBookMetadata(context);
assertEquals("New Title", bookEntity.getMetadata().getTitle());
assertTrue(bookEntity.getMetadata().getTitleLocked());
}
}