fix(dates): preserve stored date precision when edit omits it
updateDocument unconditionally set metaDatePrecision/End/Raw from the DTO, so saving an unrelated edit (a multipart PUT where the form omits the precision controls) clobbered the stored precision with null — fabricating a precision the user never chose. Apply each field only when the DTO carries it, mirroring the existing metadataComplete/scriptType guards. Refs #666 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -378,9 +378,7 @@ public class DocumentService {
|
|||||||
// 1. Einfache Felder Update
|
// 1. Einfache Felder Update
|
||||||
doc.setTitle(dto.getTitle());
|
doc.setTitle(dto.getTitle());
|
||||||
doc.setDocumentDate(dto.getDocumentDate());
|
doc.setDocumentDate(dto.getDocumentDate());
|
||||||
doc.setMetaDatePrecision(dto.getMetaDatePrecision());
|
applyDatePrecision(doc, dto);
|
||||||
doc.setMetaDateEnd(dto.getMetaDateEnd());
|
|
||||||
doc.setMetaDateRaw(dto.getMetaDateRaw());
|
|
||||||
doc.setLocation(dto.getLocation());
|
doc.setLocation(dto.getLocation());
|
||||||
doc.setTranscription(dto.getTranscription());
|
doc.setTranscription(dto.getTranscription());
|
||||||
doc.setSummary(dto.getSummary());
|
doc.setSummary(dto.getSummary());
|
||||||
@@ -449,6 +447,25 @@ public class DocumentService {
|
|||||||
return saved;
|
return saved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies the three date-precision fields only when the DTO carries them.
|
||||||
|
* A null field means "not submitted" — overwriting the stored value with null
|
||||||
|
* would fabricate a precision the user never chose, the exact dishonesty #666
|
||||||
|
* exists to prevent. A row with a genuinely-unknown precision must keep it when
|
||||||
|
* an unrelated edit (e.g. a location typo) is saved.
|
||||||
|
*/
|
||||||
|
private void applyDatePrecision(Document doc, DocumentUpdateDTO dto) {
|
||||||
|
if (dto.getMetaDatePrecision() != null) {
|
||||||
|
doc.setMetaDatePrecision(dto.getMetaDatePrecision());
|
||||||
|
}
|
||||||
|
if (dto.getMetaDateEnd() != null) {
|
||||||
|
doc.setMetaDateEnd(dto.getMetaDateEnd());
|
||||||
|
}
|
||||||
|
if (dto.getMetaDateRaw() != null) {
|
||||||
|
doc.setMetaDateRaw(dto.getMetaDateRaw());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public Document updateDocumentTags(UUID docId, List<String> tagNames) {
|
public Document updateDocumentTags(UUID docId, List<String> tagNames) {
|
||||||
Document doc = documentRepository.findById(docId)
|
Document doc = documentRepository.findById(docId)
|
||||||
|
|||||||
@@ -164,6 +164,33 @@ class DocumentServiceTest {
|
|||||||
assertThat(doc.getMetaDateRaw()).isEqualTo("10.–11. Januar 1917");
|
assertThat(doc.getMetaDateRaw()).isEqualTo("10.–11. Januar 1917");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void updateDocument_preservesStoredPrecision_whenDtoOmitsIt() throws Exception {
|
||||||
|
// Editing a doc (e.g. fixing a location typo) without touching the precision
|
||||||
|
// controls must NOT fabricate a precision. The form omits the three precision
|
||||||
|
// fields → they arrive null on the DTO → the stored values must be preserved.
|
||||||
|
UUID id = UUID.randomUUID();
|
||||||
|
Document doc = Document.builder()
|
||||||
|
.id(id)
|
||||||
|
.metaDatePrecision(DatePrecision.MONTH)
|
||||||
|
.metaDateEnd(LocalDate.of(1916, 6, 30))
|
||||||
|
.metaDateRaw("Juni 1916")
|
||||||
|
.receivers(new HashSet<>())
|
||||||
|
.tags(new HashSet<>())
|
||||||
|
.build();
|
||||||
|
when(documentRepository.findById(id)).thenReturn(Optional.of(doc));
|
||||||
|
when(documentRepository.save(any())).thenReturn(doc);
|
||||||
|
|
||||||
|
DocumentUpdateDTO dto = new DocumentUpdateDTO();
|
||||||
|
dto.setLocation("Berlin"); // unrelated edit; precision fields left null
|
||||||
|
|
||||||
|
documentService.updateDocument(id, dto, null, null);
|
||||||
|
|
||||||
|
assertThat(doc.getMetaDatePrecision()).isEqualTo(DatePrecision.MONTH);
|
||||||
|
assertThat(doc.getMetaDateEnd()).isEqualTo(LocalDate.of(1916, 6, 30));
|
||||||
|
assertThat(doc.getMetaDateRaw()).isEqualTo("Juni 1916");
|
||||||
|
}
|
||||||
|
|
||||||
// ─── deleteTagCascading ───────────────────────────────────────────────────
|
// ─── deleteTagCascading ───────────────────────────────────────────────────
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user