Skip to content

Commit d07d70c

Browse files
committed
Expose query by case instance IDs for GET cmmn-history/historic-case-instances
This aligns the GET with the POST cmmn-query/historic-case-instances Query
1 parent 8bb8c16 commit d07d70c

File tree

3 files changed

+86
-0
lines changed

3 files changed

+86
-0
lines changed

modules/flowable-cmmn-rest/src/main/java/org/flowable/cmmn/rest/service/api/history/caze/HistoricCaseInstanceCollectionResource.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public class HistoricCaseInstanceCollectionResource extends HistoricCaseInstance
4646
@ApiOperation(value = "List of historic case instances", tags = { "History Case" }, nickname = "listHistoricCaseInstances")
4747
@ApiImplicitParams({
4848
@ApiImplicitParam(name = "caseInstanceId", dataType = "string", value = "An id of the historic case instance.", paramType = "query"),
49+
@ApiImplicitParam(name = "caseInstanceIds", dataType = "string", value = "Only return historic case instances with the given comma-separated ids.", paramType = "query"),
4950
@ApiImplicitParam(name = "caseDefinitionKey", dataType = "string", value = "The case definition key of the historic case instance.", paramType = "query"),
5051
@ApiImplicitParam(name = "caseDefinitionKeyLike", dataType = "string", value = "Only return historic case instances like the given case definition key.", paramType = "query"),
5152
@ApiImplicitParam(name = "caseDefinitionKeyLikeIgnoreCase", dataType = "string", value = "Only return historic case instances like the given case definition key, ignoring case.", paramType = "query"),
@@ -105,6 +106,10 @@ public DataResponse<HistoricCaseInstanceResponse> getHistoricCasenstances(@ApiPa
105106
queryRequest.setCaseInstanceId(allRequestParams.get("caseInstanceId"));
106107
}
107108

109+
if (allRequestParams.get("caseInstanceIds") != null) {
110+
queryRequest.setCaseInstanceIds(RequestUtil.parseToList(allRequestParams.get("caseInstanceIds")));
111+
}
112+
108113
if (allRequestParams.get("caseDefinitionKey") != null) {
109114
queryRequest.setCaseDefinitionKey(allRequestParams.get("caseDefinitionKey"));
110115
}

modules/flowable-cmmn-rest/src/test/java/org/flowable/cmmn/rest/service/api/history/HistoricCaseInstanceCollectionResourceTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,23 @@ public void testQueryByParentCaseInstanceId() throws IOException {
665665
+ "}");
666666
}
667667

668+
@Test
669+
@CmmnDeployment(resources = "org/flowable/cmmn/rest/service/api/runtime/oneTaskCase.cmmn")
670+
public void testQueryByCaseInstanceIds() throws IOException {
671+
CaseInstance caseInstance1 = runtimeService.createCaseInstanceBuilder().caseDefinitionKey("oneTaskCase").start();
672+
CaseInstance caseInstance2 = runtimeService.createCaseInstanceBuilder().caseDefinitionKey("oneTaskCase").start();
673+
CaseInstance caseInstance3 = runtimeService.createCaseInstanceBuilder().caseDefinitionKey("oneTaskCase").start();
674+
675+
String url = CmmnRestUrls.createRelativeResourceUrl(CmmnRestUrls.URL_HISTORIC_CASE_INSTANCES);
676+
assertResultsPresentInDataResponse(url, caseInstance1.getId(), caseInstance2.getId(), caseInstance3.getId());
677+
678+
url = CmmnRestUrls.createRelativeResourceUrl(CmmnRestUrls.URL_HISTORIC_CASE_INSTANCES) + "?caseInstanceIds=" + caseInstance1.getId() + "," + caseInstance3.getId();
679+
assertResultsPresentInDataResponse(url, caseInstance1.getId(), caseInstance3.getId());
680+
681+
url = CmmnRestUrls.createRelativeResourceUrl(CmmnRestUrls.URL_HISTORIC_CASE_INSTANCES) + "?caseInstanceIds=dummy1,dummy2";
682+
assertEmptyResultsPresentInDataResponse(url);
683+
}
684+
668685
private void assertVariablesPresentInPostDataResponse(String url, String queryParameters, String caseInstanceId, Map<String, Object> expectedVariables)
669686
throws IOException {
670687

modules/flowable-cmmn-rest/src/test/java/org/flowable/cmmn/rest/service/api/history/HistoricCaseInstanceQueryResourceTest.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,4 +620,68 @@ public void testQueryHistoricCaseInstancesByExcludeCaseDefinitionKeys() throws E
620620
+ " }"
621621
+ "]");
622622
}
623+
624+
@Test
625+
@CmmnDeployment(resources = "org/flowable/cmmn/rest/service/api/repository/oneHumanTaskCase.cmmn")
626+
public void testQueryHistoricCaseInstancesByCaseInstanceIds() throws Exception {
627+
CaseInstance caseInstance = runtimeService.createCaseInstanceBuilder().caseDefinitionKey("oneHumanTaskCase").start();
628+
CaseInstance caseInstance2 = runtimeService.createCaseInstanceBuilder().caseDefinitionKey("oneHumanTaskCase").start();
629+
CaseInstance caseInstance3 = runtimeService.createCaseInstanceBuilder().caseDefinitionKey("oneHumanTaskCase").start();
630+
631+
ObjectNode requestNode = objectMapper.createObjectNode();
632+
633+
String url = CmmnRestUrls.createRelativeResourceUrl(CmmnRestUrls.URL_HISTORIC_CASE_INSTANCE_QUERY);
634+
HttpPost httpPost = new HttpPost(SERVER_URL_PREFIX + url);
635+
httpPost.setEntity(new StringEntity(requestNode.toString()));
636+
CloseableHttpResponse response = executeRequest(httpPost, HttpStatus.SC_OK);
637+
638+
JsonNode rootNode = objectMapper.readTree(response.getEntity().getContent());
639+
closeResponse(response);
640+
assertThatJson(rootNode)
641+
.when(Option.IGNORING_EXTRA_FIELDS)
642+
.inPath("data")
643+
.isEqualTo("""
644+
[
645+
{ id: '%s' },
646+
{ id: '%s' },
647+
{ id: '%s' }
648+
]
649+
""".formatted(caseInstance.getId(), caseInstance2.getId(), caseInstance3.getId()));
650+
651+
requestNode = objectMapper.createObjectNode();
652+
ArrayNode itemArrayNode = requestNode.putArray("caseInstanceIds");
653+
itemArrayNode.add(caseInstance.getId());
654+
itemArrayNode.add(caseInstance3.getId());
655+
656+
httpPost = new HttpPost(SERVER_URL_PREFIX + url);
657+
httpPost.setEntity(new StringEntity(requestNode.toString()));
658+
response = executeRequest(httpPost, HttpStatus.SC_OK);
659+
660+
rootNode = objectMapper.readTree(response.getEntity().getContent());
661+
closeResponse(response);
662+
assertThatJson(rootNode)
663+
.when(Option.IGNORING_EXTRA_FIELDS)
664+
.inPath("data")
665+
.isEqualTo("""
666+
[
667+
{ id: '%s' },
668+
{ id: '%s' }
669+
]
670+
""".formatted(caseInstance.getId(), caseInstance3.getId()));
671+
672+
requestNode = objectMapper.createObjectNode();
673+
itemArrayNode = requestNode.putArray("caseInstanceIds");
674+
itemArrayNode.add("notExisting");
675+
676+
httpPost = new HttpPost(SERVER_URL_PREFIX + url);
677+
httpPost.setEntity(new StringEntity(requestNode.toString()));
678+
response = executeRequest(httpPost, HttpStatus.SC_OK);
679+
680+
rootNode = objectMapper.readTree(response.getEntity().getContent());
681+
closeResponse(response);
682+
683+
assertThatJson(rootNode)
684+
.inPath("data")
685+
.isEqualTo("[]");
686+
}
623687
}

0 commit comments

Comments
 (0)