From bbb01653f5a26ce2c324e6b90d9b274ad3d1da69 Mon Sep 17 00:00:00 2001 From: Mustapha Zorgati <15628173+mustaphazorgati@users.noreply.github.com> Date: Thu, 11 Aug 2022 16:24:13 +0200 Subject: [PATCH] TSK-1943: added REST endpoint for requesting changes on a Task --- .../main/resources/sql/sample-data/task.sql | 1 + .../src/docs/asciidoc/rest-api.adoc | 1 + .../taskana/common/rest/RestEndpoints.java | 2 ++ .../pro/taskana/task/rest/TaskController.java | 21 ++++++++++++++ .../task/rest/TaskControllerIntTest.java | 28 +++++++++++++++++++ .../task/rest/TaskControllerRestDocTest.java | 11 ++++++++ 6 files changed, 64 insertions(+) diff --git a/common/taskana-common-data/src/main/resources/sql/sample-data/task.sql b/common/taskana-common-data/src/main/resources/sql/sample-data/task.sql index 67f949a4e..9f4a7e1c9 100644 --- a/common/taskana-common-data/src/main/resources/sql/sample-data/task.sql +++ b/common/taskana-common-data/src/main/resources/sql/sample-data/task.sql @@ -38,6 +38,7 @@ INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000032', 'ETI:0000000 INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000033', 'ETI:000000000000000000000000000000000033', RELATIVE_DATE(-1) , null , null , RELATIVE_DATE(0) , null , RELATIVE_DATE(-1) , RELATIVE_DATE(1) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'READY' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000033' , 'DOC_0000000000000000033' , 'user-1-2' , 'DEFG00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , null , null , null , null , null , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000034', 'ETI:000000000000000000000000000000000034', RELATIVE_DATE(-1) , RELATIVE_DATE(-1) , null , RELATIVE_DATE(0) , null , RELATIVE_DATE(-1) , RELATIVE_DATE(2) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'CLAIMED' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000034' , 'DOC_0000000000000000034' , 'user-1-1' , 'GHIJ00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , null , null , null , null , null , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000035', 'ETI:000000000000000000000000000000000035', RELATIVE_DATE(-1) , RELATIVE_DATE(-1) , null , RELATIVE_DATE(0) , null , RELATIVE_DATE(-1) , RELATIVE_DATE(-1) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'CLAIMED' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000035' , 'DOC_0000000000000000035' , 'user-1-1' , '00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , null , null , null , null , null , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); +INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000136', 'ETI:000000000000000000000000000000000136', RELATIVE_DATE(-1) , RELATIVE_DATE(-1) , null , RELATIVE_DATE(0) , null , RELATIVE_DATE(-1) , RELATIVE_DATE(-1) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'IN_REVIEW' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000035' , 'DOC_0000000000000000035' , 'user-1-1' , '00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , null , null , null , null , null , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000100', 'ETI:000000000000000000000000000000000100', RELATIVE_DATE(-1) , RELATIVE_DATE(-1) , null , RELATIVE_DATE(0) , null , RELATIVE_DATE(-1) , RELATIVE_DATE(-1) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'CLAIMED' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000100' , 'DOC_0000000000000000100' , 'user-1-2' , '00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , null , null , null , null , null , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000101', 'ETI:000000000000000000000000000000000101', RELATIVE_DATE(-1) , RELATIVE_DATE(-1) , null , RELATIVE_DATE(0) , null , RELATIVE_DATE(-1) , RELATIVE_DATE(2) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'CLAIMED' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000101' , 'DOC_0000000000000000101' , 'user-1-2' , '00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , null , null , null , null , 'el' , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); INSERT INTO TASK VALUES('TKI:000000000000000000000000000000000102', 'ETI:000000000000000000000000000000000102', RELATIVE_DATE(-2) , RELATIVE_DATE(-1) , null , RELATIVE_DATE(0) , null , RELATIVE_DATE(-2) , RELATIVE_DATE(2) , 'Widerruf' , 'creator_user_id' , 'Widerruf' , null , 2 , -1 , 'CLAIMED' , 'EXTERN' , 'L1050' , 'CLI:100000000000000000000000000000000003', 'WBI:100000000000000000000000000000000007' , 'USER-1-2' , 'DOMAIN_A', 'PI_0000000000102' , 'DOC_0000000000000000102' , 'user-1-2' , '00' , 'PASystem' , '00' , 'SDNR' , '98765432' , true , false , null , 'NONE' , null , null , null , null , null , null , null , null , null , null , null , null , null , null , 'abc' , null , null , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ); diff --git a/rest/taskana-rest-spring/src/docs/asciidoc/rest-api.adoc b/rest/taskana-rest-spring/src/docs/asciidoc/rest-api.adoc index 8d402a1af..b55c488fa 100644 --- a/rest/taskana-rest-spring/src/docs/asciidoc/rest-api.adoc +++ b/rest/taskana-rest-spring/src/docs/asciidoc/rest-api.adoc @@ -105,6 +105,7 @@ include::{snippets}/TaskControllerRestDocTest/selectAndClaimTaskDocTest/auto-sec include::{snippets}/TaskControllerRestDocTest/cancelClaimTaskDocTest/auto-section.adoc[] include::{snippets}/TaskControllerRestDocTest/forceCancelClaimTaskDocTest/auto-section.adoc[] include::{snippets}/TaskControllerRestDocTest/requestReviewTaskDocTest/auto-section.adoc[] +include::{snippets}/TaskControllerRestDocTest/requestChangesTaskDocTest/auto-section.adoc[] include::{snippets}/TaskControllerRestDocTest/completeTaskDocTest/auto-section.adoc[] include::{snippets}/TaskControllerRestDocTest/cancelTaskDocTest/auto-section.adoc[] include::{snippets}/TaskControllerRestDocTest/transferTaskDocTest/auto-section.adoc[] diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/common/rest/RestEndpoints.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/common/rest/RestEndpoints.java index 8f1cea6d8..090ef7c0f 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/common/rest/RestEndpoints.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/common/rest/RestEndpoints.java @@ -47,6 +47,8 @@ public final class RestEndpoints { public static final String URL_TASKS_ID_CLAIM_FORCE = API_V1 + "tasks/{taskId}/claim/force"; public static final String URL_TASKS_ID_SELECT_AND_CLAIM = API_V1 + "tasks/select-and-claim"; public static final String URL_TASKS_ID_REQUEST_REVIEW = API_V1 + "tasks/{taskId}/request-review"; + public static final String URL_TASKS_ID_REQUEST_CHANGES = + API_V1 + "tasks/{taskId}/request-changes"; public static final String URL_TASKS_ID_COMPLETE = API_V1 + "tasks/{taskId}/complete"; public static final String URL_TASKS_ID_CANCEL = API_V1 + "tasks/{taskId}/cancel"; public static final String URL_TASKS_ID_TRANSFER_WORKBASKET_ID = diff --git a/rest/taskana-rest-spring/src/main/java/pro/taskana/task/rest/TaskController.java b/rest/taskana-rest-spring/src/main/java/pro/taskana/task/rest/TaskController.java index 476bda7f0..0d208b6d5 100644 --- a/rest/taskana-rest-spring/src/main/java/pro/taskana/task/rest/TaskController.java +++ b/rest/taskana-rest-spring/src/main/java/pro/taskana/task/rest/TaskController.java @@ -224,6 +224,27 @@ public class TaskController { return ResponseEntity.ok(taskRepresentationModelAssembler.toModel(task)); } + /** + * This endpoint request changes on the specified Task. + * + * @param taskId the id of the relevant Task + * @return the Task after changes have been requested + * @throws InvalidTaskStateException if the state of the Task with taskId is not IN_REVIEW + * @throws TaskNotFoundException if the Task with taskId wasn't found + * @throws InvalidOwnerException if the Task is claimed by another user + * @throws NotAuthorizedException if the current user has no READ permissions for the Workbasket + * the Task is in + * @title Request changes on a Task + */ + @PostMapping(path = RestEndpoints.URL_TASKS_ID_REQUEST_CHANGES) + @Transactional(rollbackFor = Exception.class) + public ResponseEntity requestChanges(@PathVariable String taskId) + throws InvalidTaskStateException, TaskNotFoundException, InvalidOwnerException, + NotAuthorizedException { + Task task = taskService.requestChanges(taskId); + return ResponseEntity.ok(taskRepresentationModelAssembler.toModel(task)); + } + /** * This endpoint selects the first Task returned by the Task Query and claims it. * diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/task/rest/TaskControllerIntTest.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/task/rest/TaskControllerIntTest.java index 25826c8b8..8db0daa70 100644 --- a/rest/taskana-rest-spring/src/test/java/pro/taskana/task/rest/TaskControllerIntTest.java +++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/task/rest/TaskControllerIntTest.java @@ -1420,6 +1420,34 @@ class TaskControllerIntTest { assertThat(repModel.getState()).isEqualTo(TaskState.READY_FOR_REVIEW); } + @Test + void should_RequestChangesOnATask() { + String url = + restHelper.toUrl(RestEndpoints.URL_TASKS_ID, "TKI:000000000000000000000000000000000136"); + HttpEntity auth = new HttpEntity<>(RestHelper.generateHeadersForUser("user-1-1")); + + // retrieve task from Rest Api + ResponseEntity getTaskResponse = + TEMPLATE.exchange(url, HttpMethod.GET, auth, TASK_MODEL_TYPE); + assertThat(getTaskResponse.getBody()).isNotNull(); + TaskRepresentationModel repModel = getTaskResponse.getBody(); + assertThat(repModel.getState()).isEqualTo(TaskState.IN_REVIEW); + assertThat(repModel.getOwner()).isEqualTo("user-1-1"); + + // request changes + String url2 = + restHelper.toUrl( + RestEndpoints.URL_TASKS_ID_REQUEST_CHANGES, "TKI:000000000000000000000000000000000136"); + ResponseEntity requestedChangesResponse = + TEMPLATE.exchange(url2, HttpMethod.POST, auth, TASK_MODEL_TYPE); + + assertThat(requestedChangesResponse.getBody()).isNotNull(); + assertThat(requestedChangesResponse.getStatusCode()).isEqualTo(HttpStatus.OK); + repModel = requestedChangesResponse.getBody(); + assertThat(repModel.getOwner()).isNull(); + assertThat(repModel.getState()).isEqualTo(TaskState.READY); + } + @Test void should_UpdateTaskOwnerOfReadyTask() { final String url = restHelper.toUrl("/api/v1/tasks/TKI:000000000000000000000000000000000025"); diff --git a/rest/taskana-rest-spring/src/test/java/pro/taskana/task/rest/TaskControllerRestDocTest.java b/rest/taskana-rest-spring/src/test/java/pro/taskana/task/rest/TaskControllerRestDocTest.java index 0ca5a1522..2bcd9d478 100644 --- a/rest/taskana-rest-spring/src/test/java/pro/taskana/task/rest/TaskControllerRestDocTest.java +++ b/rest/taskana-rest-spring/src/test/java/pro/taskana/task/rest/TaskControllerRestDocTest.java @@ -91,6 +91,17 @@ class TaskControllerRestDocTest extends BaseRestDocTest { .andExpect(MockMvcResultMatchers.status().isOk()); } + @Test + void requestChangesTaskDocTest() throws Exception { + mockMvc + .perform( + post( + RestEndpoints.URL_TASKS_ID_REQUEST_CHANGES, + "TKI:000000000000000000000000000000000136") + .headers(RestHelper.generateHeadersForUser("user-1-1"))) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + @Test void selectAndClaimTaskDocTest() throws Exception { mockMvc