diff --git a/server/src/main/java/com/testsigma/controller/UploadsController.java b/server/src/main/java/com/testsigma/controller/UploadsController.java index fba87680a..6c1583ebb 100644 --- a/server/src/main/java/com/testsigma/controller/UploadsController.java +++ b/server/src/main/java/com/testsigma/controller/UploadsController.java @@ -81,9 +81,7 @@ public void delete(@PathVariable("id") Long id) throws ResourceNotFoundException @DeleteMapping(value = "/bulk") @ResponseStatus(HttpStatus.ACCEPTED) - public void bulkDelete(@RequestParam(value = "ids[]") Long[] ids) throws ResourceNotFoundException { - for (Long id : ids) { - uploadService.delete(uploadService.find(id)); - } + public void bulkDelete(@RequestParam(value = "ids[]") Long[] ids) throws Exception { + uploadService.bulkDelete(ids); } } diff --git a/server/src/main/java/com/testsigma/repository/UploadVersionRepository.java b/server/src/main/java/com/testsigma/repository/UploadVersionRepository.java index d5a5a626a..0fbfb7a01 100644 --- a/server/src/main/java/com/testsigma/repository/UploadVersionRepository.java +++ b/server/src/main/java/com/testsigma/repository/UploadVersionRepository.java @@ -23,6 +23,7 @@ public interface UploadVersionRepository extends BaseRepository findAllByLastUploadedTimeBeforeAndUploadTypeIn(Timestamp lastUploadedTime, Collection uploadType); List findAllByUploadTypeIn(Collection uploadType); + List findAllByUploadId(Long uploadId); Optional findByNameAndUploadId(String name, Long importedId); diff --git a/server/src/main/java/com/testsigma/service/UploadService.java b/server/src/main/java/com/testsigma/service/UploadService.java index bd452ca36..79c123022 100644 --- a/server/src/main/java/com/testsigma/service/UploadService.java +++ b/server/src/main/java/com/testsigma/service/UploadService.java @@ -22,11 +22,13 @@ import com.testsigma.repository.UploadRepository; import com.testsigma.specification.SearchCriteria; import com.testsigma.specification.SearchOperation; +import com.testsigma.specification.TestCaseSpecificationsBuilder; import com.testsigma.specification.UploadSpecificationsBuilder; import com.testsigma.web.request.UploadRequest; import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springframework.context.ApplicationEventPublisher; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -50,6 +52,7 @@ public class UploadService extends XMLExportImportService { private final WorkspaceService workspaceService; private final WorkspaceVersionService workspaceVersionService; private final UploadVersionService uploadVersionService; + private final TestCaseService testCaseService; private final UploadMapper mapper; public Upload find(Long id) throws ResourceNotFoundException { @@ -112,9 +115,38 @@ public Upload save(Upload upload) { } public void delete(Upload upload) { - this.uploadRepository.delete(upload); - publishEvent(upload, EventType.DELETE); + TestCaseSpecificationsBuilder builder = new TestCaseSpecificationsBuilder(); + Long id = upload.getId(); + String workspace_type = String.valueOf(upload.getWorkspace().getWorkspaceType()); + List params = new ArrayList<>(); + List uploadVersions = uploadVersionService.findByUploadId(id); + for(UploadVersion uploadVersion: uploadVersions ) { + params.add(new SearchCriteria("testData", SearchOperation.EQUALITY, "testsigma-storage:/"+uploadVersion.getPath())); + builder.setParams(params); + Specification spec = builder.build(); + Page linkedTestCases = testCaseService.findAll(spec, PageRequest.of(0, 1)); + if(linkedTestCases.getTotalElements() > 0){ + throw new DataIntegrityViolationException("dataIntegrityViolationException: Failed to delete some of the Uploads " + + "since they are already associated to some Test Cases."); + } + try{ + this.uploadRepository.delete(upload); + } + catch(DataIntegrityViolationException e){ + throw new DataIntegrityViolationException ("dataIntegrityViolationException: Failed to delete some of the Uploads " + + "since they are already associated to some Test Cases, please remove mapping and try again."); + } + publishEvent(upload, EventType.DELETE); + } } + public void bulkDelete(Long[] ids) throws Exception { + TestCaseSpecificationsBuilder builder = new TestCaseSpecificationsBuilder(); + for (Long id : ids) { + Upload upload = find(id); + this.delete(upload); + } + } + public void publishEvent(Upload upload, EventType eventType) { UploadEvent event = createEvent(upload, eventType); diff --git a/server/src/main/java/com/testsigma/service/UploadVersionService.java b/server/src/main/java/com/testsigma/service/UploadVersionService.java index 3a25bccdc..61cb1cbe9 100644 --- a/server/src/main/java/com/testsigma/service/UploadVersionService.java +++ b/server/src/main/java/com/testsigma/service/UploadVersionService.java @@ -356,4 +356,7 @@ public boolean isEntityAlreadyImported(Optional previous, UploadV } + public List findByUploadId(Long id) { + return uploadVersionRepository.findAllByUploadId(id); + } } diff --git a/server/src/main/java/com/testsigma/specification/TestCaseSpecification.java b/server/src/main/java/com/testsigma/specification/TestCaseSpecification.java index 7f6a80101..b7b4fe6e1 100644 --- a/server/src/main/java/com/testsigma/specification/TestCaseSpecification.java +++ b/server/src/main/java/com/testsigma/specification/TestCaseSpecification.java @@ -92,6 +92,9 @@ protected Expression getPath(SearchCriteria criteria, Root roo } else if(criteria.getKey().equals("forLoopTestDataId")){ Join s = root.join("testSteps",JoinType.INNER); return s.get("forLoopTestDataId"); + } else if(criteria.getKey().equals("testData")){ + Join s = root.join("testSteps", JoinType.INNER); + return s.get("testData"); } return root.get(criteria.getKey()); } diff --git a/ui/src/app/components/uploads/list.component.html b/ui/src/app/components/uploads/list.component.html index 4052167c4..1eb7c102a 100644 --- a/ui/src/app/components/uploads/list.component.html +++ b/ui/src/app/components/uploads/list.component.html @@ -8,7 +8,7 @@
-