RED-2403 Fixed issue with file collision for multi file report template uploads

This commit is contained in:
Philipp Schramm 2021-10-14 08:55:46 +02:00
parent 1225803c73
commit 3105367aa9
2 changed files with 430 additions and 30 deletions

View File

@ -1,7 +1,20 @@
package com.iqser.red.service.peristence.v1.server.controller;
import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils;
import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity;
import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException;
import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException;
import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException;
import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService;
@ -11,17 +24,9 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.Re
import com.iqser.red.service.persistence.service.v1.api.resources.ReportTemplateResource;
import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist;
import com.iqser.red.storage.commons.service.StorageService;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.apache.commons.io.IOUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert;
@RestController
@RequiredArgsConstructor
@ -33,18 +38,17 @@ public class ReportTemplateController implements ReportTemplateResource {
public ReportTemplate uploadTemplate(@RequestBody ReportTemplateUploadRequest reportTemplateUploadRequest) {
String fileName = parseFileName(reportTemplateUploadRequest);
List<ReportTemplateEntity> reportTemplates = reportTemplatePersistenceService.findByDossierTemplateId(reportTemplateUploadRequest.getDossierTemplateId());
for (ReportTemplateEntity reportTemplate : reportTemplates) {
if (reportTemplate.getFileName().equals(reportTemplateUploadRequest.getFileName())) {
throw new ConflictException("Template already exists.");
}
if (doesFileNameExists(reportTemplates, fileName)) {
throw new ConflictException("Template already exists.");
}
String storageId = StorageIdUtils.getReportStorageId(reportTemplateUploadRequest.getDossierTemplateId(), reportTemplateUploadRequest
.getFileName());
String storageId = StorageIdUtils.getReportStorageId(reportTemplateUploadRequest.getDossierTemplateId(), fileName);
storageService.storeObject(storageId, reportTemplateUploadRequest.getTemplate());
String templateId = UUID.randomUUID().toString();
reportTemplatePersistenceService.insert(reportTemplateUploadRequest.getDossierTemplateId(), templateId, storageId, reportTemplateUploadRequest
.getFileName(), reportTemplateUploadRequest.isMultiFileReport(), reportTemplateUploadRequest.isActiveByDefault());
reportTemplatePersistenceService.insert(reportTemplateUploadRequest.getDossierTemplateId(), templateId, storageId, fileName, reportTemplateUploadRequest.isMultiFileReport(), reportTemplateUploadRequest.isActiveByDefault());
return convert(reportTemplatePersistenceService.find(templateId), ReportTemplate.class);
@ -87,4 +91,29 @@ public class ReportTemplateController implements ReportTemplateResource {
}
private boolean doesFileNameExists(List<ReportTemplateEntity> reportTemplates, String fileName) {
for (ReportTemplateEntity reportTemplate : reportTemplates) {
if (reportTemplate.getFileName().equals(fileName)) {
return true;
}
}
return false;
}
private String parseFileName(@NonNull ReportTemplateUploadRequest reportTemplateUploadRequest) {
String fileName = reportTemplateUploadRequest.getFileName();
if (reportTemplateUploadRequest.isMultiFileReport()) {
String[] splitFileName = StringUtils.split(fileName, ".");
if (splitFileName.length != 2) {
throw new BadRequestException("FileName is not correct.");
}
fileName = splitFileName[0] + "(multifile)." + splitFileName[1];
}
return fileName;
}
}

View File

@ -1,13 +1,15 @@
package com.iqser.red.service.peristence.v1.server.integration.tests;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.iqser.red.service.peristence.v1.server.integration.client.ReportTemplateClient;
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider;
import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest;
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import static org.assertj.core.api.Assertions.assertThat;
public class ReportTemplateTest extends AbstractPersistenceServerServiceTest {
@ -17,38 +19,407 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest {
@Autowired
private ReportTemplateClient reportTemplateClient;
/*
* Upload report, verify it exist and delete afterwards
*/
@Test
public void testReportTemplate() {
// Arrange
String fileName = "report.xlsx";
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
// Act & Assert
var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(true)
.fileName("test.docx")
.template(new byte[]{1, 2, 3, 4}).build());
.multiFileReport(false)
.fileName(fileName)
.template(new byte[]{1, 2, 3, 4})
.build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId());
var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
.next()
.getTemplateId());
assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
assertThat(firstTemplate.getFileName()).isEqualTo(fileName);
var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
assertThat(download.getFile().length).isEqualTo(4);
reportTemplateClient.deleteTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
}
/*
* Upload multiFile report, verify it exist with correct fileName and delete afterwards
*/
@Test
public void testMultiFileReportTemplate() {
// Arrange
String fileName = "report.xlsx";
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
// Act & Assert
var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(true)
.fileName(fileName)
.template(new byte[]{1, 2, 3, 4})
.build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
.next()
.getTemplateId());
assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
assertThat(firstTemplate.getFileName()).isEqualTo("report(multifile).xlsx");
var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
assertThat(download.getFile().length).isEqualTo(4);
reportTemplateClient.deleteTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
}
/*
* Try to upload template two times
*/
@Test
public void testReportTemplateTwoTimes() {
// Arrange
String fileName = "report.xlsx";
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
// Act & Assert
var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(false)
.fileName(fileName)
.template(new byte[]{1, 2, 3, 4})
.build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
final Throwable thrown = catchThrowable(() -> {
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(false)
.fileName(fileName)
.template(new byte[]{1, 2, 3, 4})
.build());
});
assertThat(thrown.getMessage()).contains("Template already exists");
}
/*
* Try to upload multi file template two times
*/
@Test
public void testMultiFileReportTemplateTwoTimes() {
// Arrange
String fileName = "report.xlsx";
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
// Act & Assert
var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(true)
.fileName(fileName)
.template(new byte[]{1, 2, 3, 4})
.build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
final Throwable thrown = catchThrowable(() -> {
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(true)
.fileName(fileName)
.template(new byte[]{1, 2, 3, 4})
.build());
});
assertThat(thrown.getMessage()).contains("Template already exists");
}
/*
* Upload template file and then multi file template with the same name
*/
@Test
public void testReportTemplateAndThenMultiFileReportTemple() {
// Arrange
String fileName = "report.xlsx";
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
// Act & Assert
var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(false)
.fileName(fileName)
.template(new byte[]{1, 2, 3, 4})
.build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
.next()
.getTemplateId());
assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
assertThat(firstTemplate.getFileName()).isEqualTo(fileName);
var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
assertThat(download.getFile().length).isEqualTo(4);
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(true)
.fileName(fileName)
.template(new byte[]{1, 2, 3, 4})
.build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
assertThat(availableTemplates.size()).isEqualTo(2);
var secondTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.get(1)
.getTemplateId());
assertThat(availableTemplates.get(1)).isEqualTo(secondTemplate);
assertThat(secondTemplate.getFileName()).isEqualTo("report(multifile).xlsx");
}
/*
* Upload multi file template and then template file with the same name
*/
@Test
public void testMultiFileReportTemplateAndThenReportTemple() {
// Arrange
String fileName = "report.xlsx";
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
// Act & Assert
var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(true)
.fileName(fileName)
.template(new byte[]{1, 2, 3, 4})
.build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
.next()
.getTemplateId());
assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
assertThat(firstTemplate.getFileName()).isEqualTo("report(multifile).xlsx");
var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId());
assertThat(download.getFile().length).isEqualTo(4);
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(false)
.fileName(fileName)
.template(new byte[]{1, 2, 3, 4})
.build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
assertThat(availableTemplates.size()).isEqualTo(2);
var secondTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.get(1)
.getTemplateId());
assertThat(availableTemplates.get(1)).isEqualTo(secondTemplate);
assertThat(secondTemplate.getFileName()).isEqualTo(fileName);
}
/*
* Upload MF with ending xlsx
*/
@Test
public void testMultiFileReportTemplateAsExcel() {
// Arrange
String fileName = "report with really_weird~Name(567) [}=§$783 XYz&";
String fileEnding = ".xlsx";
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
// Act & Assert
var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(true)
.fileName(fileName + fileEnding)
.template(new byte[]{1, 2, 3, 4})
.build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
.next()
.getTemplateId());
assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
assertThat(firstTemplate.getFileName()).isEqualTo(fileName + "(multifile)" + fileEnding);
}
/*
* Upload MF with ending docx
*/
@Test
public void testMultiFileReportTemplateAsWord() {
// Arrange
String fileName = "report with really_weird~Name(567) [}=§$783 XYz&";
String fileEnding = ".docx";
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
// Act & Assert
var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(true)
.fileName(fileName + fileEnding)
.template(new byte[]{1, 2, 3, 4})
.build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
.next()
.getTemplateId());
assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
assertThat(firstTemplate.getFileName()).isEqualTo(fileName + "(multifile)" + fileEnding);
}
/*
* Upload multiFile report with fantasy fileEnding
*/
@Test
public void testMultiFileReportTemplateWithFantasyName() {
// Arrange
String fileName = "report with really_weird~Name(567) [}=§$783 XYz&";
String fileEnding = ".fantasyEnding";
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
// Act & Assert
var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(true)
.fileName(fileName + fileEnding)
.template(new byte[]{1, 2, 3, 4})
.build());
availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isNotEmpty();
var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator()
.next()
.getTemplateId());
assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate);
assertThat(firstTemplate.getFileName()).isEqualTo(fileName + "(multifile)" + fileEnding);
}
/*
* Upload multiFile report with corrupt fileName
*/
@Test
public void testMultiFileReportTemplateWithCorruptFileName() {
// Arrange
String fileName = "report";
String fileEnding = "endingWithoutDot";
var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate();
// Act & Assert
var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId());
assertThat(availableTemplates).isEmpty();
final Throwable thrown = catchThrowable(() -> {
reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder()
.activeByDefault(true)
.dossierTemplateId(dossierTemplate.getId())
.multiFileReport(true)
.fileName(fileName + fileEnding)
.template(new byte[]{1, 2, 3, 4})
.build());
});
assertThat(thrown.getMessage()).contains("FileName is not correct");
}
}