diff --git a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/WorkbasketControllerIntTest.java b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/WorkbasketControllerIntTest.java index 4e027375e..9b4064f1c 100644 --- a/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/WorkbasketControllerIntTest.java +++ b/rest/taskana-rest-spring-example/src/test/java/pro/taskana/rest/WorkbasketControllerIntTest.java @@ -1,11 +1,13 @@ package pro.taskana.rest; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Collections; +import java.util.Iterator; import org.junit.Before; import org.junit.Test; @@ -17,6 +19,7 @@ import org.springframework.context.annotation.Import; import org.springframework.core.ParameterizedTypeReference; import org.springframework.hateoas.Link; import org.springframework.hateoas.PagedResources; +import org.springframework.hateoas.Resources; import org.springframework.hateoas.hal.Jackson2HalModule; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -33,12 +36,14 @@ import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import pro.taskana.rest.resource.DistributionTargetResource; import pro.taskana.rest.resource.WorkbasketSummaryResource; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @Import(RestConfiguration.class) public class WorkbasketControllerIntTest { + String url = "http://127.0.0.1:"; RestTemplate template; HttpEntity request; @@ -56,7 +61,7 @@ public class WorkbasketControllerIntTest { @Test public void testGetAllWorkbaskets() { ResponseEntity> response = template.exchange( - url + port + "/v1/workbaskets", HttpMethod.GET, request, + url + port + "/v1/workbaskets", HttpMethod.GET, request, new ParameterizedTypeReference>() { }); assertNotNull(response.getBody().getLink(Link.REL_SELF)); @@ -66,7 +71,7 @@ public class WorkbasketControllerIntTest { public void testGetAllWorkbasketsKeepingFilters() { String parameters = "/v1/workbaskets?type=PERSONAL&sort-by=key&order=desc"; ResponseEntity> response = template.exchange( - url + port + parameters, HttpMethod.GET, request, + url + port + parameters, HttpMethod.GET, request, new ParameterizedTypeReference>() { }); assertNotNull(response.getBody().getLink(Link.REL_SELF)); @@ -80,7 +85,7 @@ public class WorkbasketControllerIntTest { public void testThrowsExceptionIfInvalidFilterIsUsed() { try { template.exchange( - url + port + "/v1/workbaskets?invalid=PERSONAL", HttpMethod.GET, request, + url + port + "/v1/workbaskets?invalid=PERSONAL", HttpMethod.GET, request, new ParameterizedTypeReference>() { }); fail(); @@ -95,7 +100,7 @@ public class WorkbasketControllerIntTest { String parameters = "/v1/workbaskets?sort-by=key&order=desc&page=2&page-size=5"; ResponseEntity> response = template.exchange( - url + port + parameters, HttpMethod.GET, request, + url + port + parameters, HttpMethod.GET, request, new ParameterizedTypeReference>() { }); assertEquals(5, response.getBody().getContent().size()); @@ -116,6 +121,26 @@ public class WorkbasketControllerIntTest { assertNotNull(response.getBody().getLink(Link.REL_PREVIOUS)); } + @Test + public void testRemoveWorkbasketAsDistributionTarget() { + String parameters = "/v1/workbaskets/distribution-targets/WBI:100000000000000000000000000000000007"; + ResponseEntity response = template.exchange( + url + port + parameters, HttpMethod.DELETE, request, + Void.class); + assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode()); + + ResponseEntity> response2 = template.exchange( + url + port + "/v1/workbaskets/WBI:100000000000000000000000000000000002/distribution-targets", + HttpMethod.GET, request, + new ParameterizedTypeReference>() { + }); + assertEquals(HttpStatus.OK, response2.getStatusCode()); + Iterator iterator = response2.getBody().getContent().iterator(); + while (iterator.hasNext()) { + assertNotEquals("WBI:100000000000000000000000000000000007", iterator.next().workbasketId); + } + } + /** * Return a REST template which is capable of dealing with responses in HAL format * diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java index 4c9240441..4cf956bb7 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/rest/WorkbasketController.java @@ -212,7 +212,7 @@ public class WorkbasketController extends AbstractPagingController { return new ResponseEntity<>(accessItemListResource, HttpStatus.OK); } - @GetMapping(path = "/{workbasketId}/distributiontargets") + @GetMapping(path = "/{workbasketId}/distribution-targets") @Transactional(readOnly = true, rollbackFor = Exception.class) public ResponseEntity> getDistributionTargets( @PathVariable(value = "workbasketId") String workbasketId) @@ -226,7 +226,7 @@ public class WorkbasketController extends AbstractPagingController { return result; } - @PutMapping(path = "/{workbasketId}/distributiontargets") + @PutMapping(path = "/{workbasketId}/distribution-targets") @Transactional(rollbackFor = Exception.class) public ResponseEntity> setDistributionTargetsForWorkbasketId( @PathVariable(value = "workbasketId") String sourceWorkbasketId, @@ -240,6 +240,19 @@ public class WorkbasketController extends AbstractPagingController { return new ResponseEntity<>(distributionTargetListResource, HttpStatus.OK); } + @DeleteMapping(path = "/distribution-targets/{workbasketId}") + @Transactional(rollbackFor = Exception.class) + public ResponseEntity> setDistributionTargetsForWorkbasketId( + @PathVariable(value = "workbasketId") String targetWorkbasketId) + throws WorkbasketNotFoundException, NotAuthorizedException { + List sourceWorkbaskets = workbasketService.getDistributionSources(targetWorkbasketId); + for (WorkbasketSummary source : sourceWorkbaskets) { + workbasketService.removeDistributionTarget(source.getId(), targetWorkbasketId); + } + + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + private WorkbasketQuery applySortingParams(WorkbasketQuery query, MultiValueMap params) throws IllegalArgumentException { // sorting