TSK-1635: Make forceCancelClaim of a task available in the REST-API

This commit is contained in:
Joerg Heffner 2021-05-07 14:06:56 +02:00 committed by gitgoodjhe
parent 59b598a7e3
commit 3d27f54e0f
5 changed files with 72 additions and 0 deletions

View File

@ -22,6 +22,7 @@ include::{snippets}/TaskControllerRestDocTest/updateTaskDocTest/auto-section.ado
include::{snippets}/TaskControllerRestDocTest/claimTaskDocTest/auto-section.adoc[] include::{snippets}/TaskControllerRestDocTest/claimTaskDocTest/auto-section.adoc[]
include::{snippets}/TaskControllerRestDocTest/selectAndClaimTaskDocTest/auto-section.adoc[] include::{snippets}/TaskControllerRestDocTest/selectAndClaimTaskDocTest/auto-section.adoc[]
include::{snippets}/TaskControllerRestDocTest/cancelClaimTaskDocTest/auto-section.adoc[] include::{snippets}/TaskControllerRestDocTest/cancelClaimTaskDocTest/auto-section.adoc[]
include::{snippets}/TaskControllerRestDocTest/forceCancelClaimTaskDocTest/auto-section.adoc[]
include::{snippets}/TaskControllerRestDocTest/completeTaskDocTest/auto-section.adoc[] include::{snippets}/TaskControllerRestDocTest/completeTaskDocTest/auto-section.adoc[]
include::{snippets}/TaskControllerRestDocTest/cancelTaskDocTest/auto-section.adoc[] include::{snippets}/TaskControllerRestDocTest/cancelTaskDocTest/auto-section.adoc[]
include::{snippets}/TaskControllerRestDocTest/transferTaskDocTest/auto-section.adoc[] include::{snippets}/TaskControllerRestDocTest/transferTaskDocTest/auto-section.adoc[]

View File

@ -42,6 +42,7 @@ public final class RestEndpoints {
public static final String URL_TASKS = API_V1 + "tasks"; public static final String URL_TASKS = API_V1 + "tasks";
public static final String URL_TASKS_ID = API_V1 + "tasks/{taskId}"; public static final String URL_TASKS_ID = API_V1 + "tasks/{taskId}";
public static final String URL_TASKS_ID_CLAIM = API_V1 + "tasks/{taskId}/claim"; public static final String URL_TASKS_ID_CLAIM = API_V1 + "tasks/{taskId}/claim";
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_SELECT_AND_CLAIM = API_V1 + "tasks/select-and-claim";
public static final String URL_TASKS_ID_COMPLETE = API_V1 + "tasks/{taskId}/complete"; 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_CANCEL = API_V1 + "tasks/{taskId}/cancel";

View File

@ -275,6 +275,36 @@ public class TaskController {
return result; return result;
} }
/**
* This endpoint force cancels the claim of an existing Task.
*
* @param taskId the Id of the requested Task.
* @return the unclaimed Task.
* @throws TaskNotFoundException if the requested Task does not exist.
* @throws InvalidStateException if the Task is already in an end state.
* @throws InvalidOwnerException if the Task is claimed by a different user.
* @throws NotAuthorizedException if the current user has no read permission for the Workbasket
* the Task is in
* @title Force cancel a claimed Task
*/
@DeleteMapping(path = RestEndpoints.URL_TASKS_ID_CLAIM_FORCE)
@Transactional(rollbackFor = Exception.class)
public ResponseEntity<TaskRepresentationModel> forceCancelClaimTask(@PathVariable String taskId)
throws TaskNotFoundException, InvalidStateException, InvalidOwnerException,
NotAuthorizedException {
LOGGER.debug("Entry to forceCancelClaimTask(taskId= {}", taskId);
Task updatedTask = taskService.forceCancelClaim(taskId);
ResponseEntity<TaskRepresentationModel> result =
ResponseEntity.ok(taskRepresentationModelAssembler.toModel(updatedTask));
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Exit from forceCancelClaimTask(), returning {}", result);
}
return result;
}
/** /**
* This endpoint completes a Task. * This endpoint completes a Task.
* *

View File

@ -730,6 +730,35 @@ class TaskControllerIntTest {
assertThat(cancelClaimedtaskRepresentationModel.getState()).isEqualTo(TaskState.READY); assertThat(cancelClaimedtaskRepresentationModel.getState()).isEqualTo(TaskState.READY);
} }
@Test
void should_ForceCancelClaim_When_TaskIsClaimedByDifferentOwner() {
String url =
restHelper.toUrl(RestEndpoints.URL_TASKS_ID, "TKI:000000000000000000000000000000000027");
HttpEntity<Object> auth = new HttpEntity<>(restHelper.getHeadersUser_1_1());
// retrieve task from Rest Api
ResponseEntity<TaskRepresentationModel> getTaskResponse =
TEMPLATE.exchange(url, HttpMethod.GET, auth, TASK_MODEL_TYPE);
assertThat(getTaskResponse.getBody()).isNotNull();
TaskRepresentationModel claimedTaskRepresentationModel = getTaskResponse.getBody();
assertThat(claimedTaskRepresentationModel.getState()).isEqualTo(TaskState.CLAIMED);
assertThat(claimedTaskRepresentationModel.getOwner()).isEqualTo("user-1-2");
// force cancel claim
String url2 =
restHelper.toUrl(
RestEndpoints.URL_TASKS_ID_CLAIM_FORCE, "TKI:000000000000000000000000000000000027");
ResponseEntity<TaskRepresentationModel> cancelClaimResponse =
TEMPLATE.exchange(url2, HttpMethod.DELETE, auth, TASK_MODEL_TYPE);
assertThat(cancelClaimResponse.getBody()).isNotNull();
assertThat(cancelClaimResponse.getStatusCode().is2xxSuccessful()).isTrue();
TaskRepresentationModel cancelClaimedtaskRepresentationModel = cancelClaimResponse.getBody();
assertThat(cancelClaimedtaskRepresentationModel.getOwner()).isNull();
assertThat(cancelClaimedtaskRepresentationModel.getClaimed()).isNull();
assertThat(cancelClaimedtaskRepresentationModel.getState()).isEqualTo(TaskState.READY);
}
@Test @Test
void testCancelClaimOfClaimedTaskByAnotherUserShouldThrowException() { void testCancelClaimOfClaimedTaskByAnotherUserShouldThrowException() {
String url = String url =

View File

@ -68,6 +68,17 @@ class TaskControllerRestDocTest extends BaseRestDocTest {
.andExpect(MockMvcResultMatchers.status().isOk()); .andExpect(MockMvcResultMatchers.status().isOk());
} }
@Test
void forceCancelClaimTaskDocTest() throws Exception {
mockMvc
.perform(
delete(
RestEndpoints.URL_TASKS_ID_CLAIM_FORCE,
"TKI:000000000000000000000000000000000035")
.headers(restHelper.getHeadersUser_1_2()))
.andExpect(MockMvcResultMatchers.status().isOk());
}
@Test @Test
void selectAndClaimTaskDocTest() throws Exception { void selectAndClaimTaskDocTest() throws Exception {
mockMvc mockMvc