refactor(documents): change DocumentBatchMetadataDTO.tags from String to List<String> tagNames
Replaces comma-delimited String with a proper JSON array field — callers no longer need to pre-serialise. Service drops the split/trim/filter step and passes tagNames directly to updateDocumentTags(). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -13,6 +13,6 @@ public class DocumentBatchMetadataDTO {
|
|||||||
private List<UUID> receiverIds;
|
private List<UUID> receiverIds;
|
||||||
private LocalDate documentDate;
|
private LocalDate documentDate;
|
||||||
private String location;
|
private String location;
|
||||||
private String tags;
|
private List<String> tagNames;
|
||||||
private Boolean metadataComplete;
|
private Boolean metadataComplete;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -166,11 +166,9 @@ public class DocumentService {
|
|||||||
if (metadata.getMetadataComplete() != null) {
|
if (metadata.getMetadataComplete() != null) {
|
||||||
doc.setMetadataComplete(metadata.getMetadataComplete());
|
doc.setMetadataComplete(metadata.getMetadataComplete());
|
||||||
}
|
}
|
||||||
if (metadata.getTags() != null && !metadata.getTags().isBlank()) {
|
if (metadata.getTagNames() != null && !metadata.getTagNames().isEmpty()) {
|
||||||
List<String> tagNames = Arrays.stream(metadata.getTags().split(","))
|
|
||||||
.map(String::trim).filter(s -> !s.isEmpty()).toList();
|
|
||||||
UUID docId = doc.getId();
|
UUID docId = doc.getId();
|
||||||
updateDocumentTags(docId, tagNames);
|
updateDocumentTags(docId, metadata.getTagNames());
|
||||||
doc = documentRepository.findById(docId)
|
doc = documentRepository.findById(docId)
|
||||||
.orElseThrow(() -> DomainException.notFound(ErrorCode.DOCUMENT_NOT_FOUND, "Not found after batch metadata: " + docId));
|
.orElseThrow(() -> DomainException.notFound(ErrorCode.DOCUMENT_NOT_FOUND, "Not found after batch metadata: " + docId));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -886,6 +886,30 @@ class DocumentControllerTest {
|
|||||||
.andExpect(status().isBadRequest());
|
.andExpect(status().isBadRequest());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@WithMockUser(authorities = "WRITE_ALL")
|
||||||
|
void quickUpload_withMetadata_tagNamesJsonArray_parsedCorrectly() throws Exception {
|
||||||
|
Document doc = Document.builder().id(UUID.randomUUID()).title("brief").originalFilename("brief.pdf").build();
|
||||||
|
when(userService.findByEmail(any())).thenReturn(AppUser.builder().id(UUID.randomUUID()).build());
|
||||||
|
|
||||||
|
org.mockito.ArgumentCaptor<DocumentBatchMetadataDTO> captor =
|
||||||
|
org.mockito.ArgumentCaptor.forClass(DocumentBatchMetadataDTO.class);
|
||||||
|
when(documentService.storeDocumentWithBatchMetadata(any(), captor.capture(), anyInt(), any()))
|
||||||
|
.thenReturn(new DocumentService.StoreResult(doc, true));
|
||||||
|
|
||||||
|
org.springframework.mock.web.MockMultipartFile file =
|
||||||
|
new org.springframework.mock.web.MockMultipartFile("files", "brief.pdf", "application/pdf", new byte[]{1});
|
||||||
|
org.springframework.mock.web.MockMultipartFile metadata =
|
||||||
|
new org.springframework.mock.web.MockMultipartFile("metadata", "metadata", "application/json",
|
||||||
|
"{\"tagNames\":[\"Briefwechsel\",\"Krieg\"]}".getBytes());
|
||||||
|
|
||||||
|
mockMvc.perform(multipart("/api/documents/quick-upload").file(file).file(metadata))
|
||||||
|
.andExpect(status().isOk());
|
||||||
|
|
||||||
|
org.assertj.core.api.Assertions.assertThat(captor.getValue().getTagNames())
|
||||||
|
.containsExactly("Briefwechsel", "Krieg");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@WithMockUser(authorities = "WRITE_ALL")
|
@WithMockUser(authorities = "WRITE_ALL")
|
||||||
void quickUpload_returns400_whenBatchExceedsCap() throws Exception {
|
void quickUpload_returns400_whenBatchExceedsCap() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user