From 46ccfef97f1996772ec00fdaf24b7aaaaa7603f3 Mon Sep 17 00:00:00 2001 From: Babatunde Adeyemi Date: Wed, 6 May 2026 18:42:26 +0100 Subject: [PATCH] feat: Add getDataApprovalWorkflows fetch support --- src/main/java/org/hisp/dhis/Dhis2.java | 25 +++++++++ .../java/org/hisp/dhis/api/ApiFields.java | 4 ++ .../org/hisp/dhis/model/Dhis2Objects.java | 2 + .../dhis/model/metadata/MetadataEntity.java | 10 ++++ .../dhis/model/DataApprovalWorkflowTest.java | 56 +++++++++++++++++++ .../metadata/data-approval-workflow.json | 20 +++++++ 6 files changed, 117 insertions(+) create mode 100644 src/test/java/org/hisp/dhis/model/DataApprovalWorkflowTest.java create mode 100644 src/test/resources/metadata/data-approval-workflow.json diff --git a/src/main/java/org/hisp/dhis/Dhis2.java b/src/main/java/org/hisp/dhis/Dhis2.java index f025dc0f..6bb9db8a 100644 --- a/src/main/java/org/hisp/dhis/Dhis2.java +++ b/src/main/java/org/hisp/dhis/Dhis2.java @@ -83,6 +83,7 @@ import org.hisp.dhis.model.CategoryOptionGroup; import org.hisp.dhis.model.CategoryOptionGroupSet; import org.hisp.dhis.model.Constant; +import org.hisp.dhis.model.DataApprovalWorkflow; import org.hisp.dhis.model.DataElement; import org.hisp.dhis.model.DataElementGroup; import org.hisp.dhis.model.DataElementGroupSet; @@ -1658,6 +1659,30 @@ public ObjectResponse removeDataElementGroupSet(String id) { return removeMetadataObject(MetadataEntity.DATA_ELEMENT_GROUP_SET, id); } + // ------------------------------------------------------------------------- + // DataApprovalWorkflow + // ------------------------------------------------------------------------- + + /** + * Retrieves a list of {@link DataApprovalWorkflow}. + * + * @param query the {@link Query}. + * @return list of {@link DataApprovalWorkflow}. + */ + public List getDataApprovalWorkflows(Query query) { + return getMetadataList(MetadataEntity.DATA_APPROVAL_WORKFLOW, query); + } + + /** + * Retrieves a {@link Metadata} of type {@link DataApprovalWorkflow}. + * + * @param query the {@link Query}. + * @return a {@link Metadata}. + */ + public Metadata getDataApprovalWorkflowsPaged(Query query) { + return getMetadata(MetadataEntity.DATA_APPROVAL_WORKFLOW, query); + } + // ------------------------------------------------------------------------- // DataSet // ------------------------------------------------------------------------- diff --git a/src/main/java/org/hisp/dhis/api/ApiFields.java b/src/main/java/org/hisp/dhis/api/ApiFields.java index d5d97b5f..9f0a6bec 100644 --- a/src/main/java/org/hisp/dhis/api/ApiFields.java +++ b/src/main/java/org/hisp/dhis/api/ApiFields.java @@ -239,6 +239,10 @@ public class ApiFields { "%1$s,organisationUnits[%2$s],workflow[%2$s],indicators[%2$s],sections[%2$s],legendSets[%2$s]", DATA_SET_FIELDS, NAME_FIELDS); + /** Data approval workflow fields. */ + public static final String DATA_APPROVAL_WORKFLOW_FIELDS = + String.format("%s,periodType,dataSets[%s]", NAME_EXT_FIELDS, NAME_FIELDS); + /** Data entry form fields. */ public static final String DATA_ENTRY_FORM_FIELDS = String.format("%s,htmlCode,style,format", NAME_FIELDS); diff --git a/src/main/java/org/hisp/dhis/model/Dhis2Objects.java b/src/main/java/org/hisp/dhis/model/Dhis2Objects.java index f9341edf..5784ed5d 100644 --- a/src/main/java/org/hisp/dhis/model/Dhis2Objects.java +++ b/src/main/java/org/hisp/dhis/model/Dhis2Objects.java @@ -88,6 +88,8 @@ public class Dhis2Objects implements Serializable { @JsonProperty private List dataEntryForms = new ArrayList<>(); + @JsonProperty private List dataApprovalWorkflows = new ArrayList<>(); + @JsonProperty private List dataSets = new ArrayList<>(); @JsonProperty private List dimensions = new ArrayList<>(); diff --git a/src/main/java/org/hisp/dhis/model/metadata/MetadataEntity.java b/src/main/java/org/hisp/dhis/model/metadata/MetadataEntity.java index 25b1117e..6fa96a34 100644 --- a/src/main/java/org/hisp/dhis/model/metadata/MetadataEntity.java +++ b/src/main/java/org/hisp/dhis/model/metadata/MetadataEntity.java @@ -39,6 +39,7 @@ import static org.hisp.dhis.api.ApiFields.CATEGORY_OPTION_GROUP_SET_FIELDS; import static org.hisp.dhis.api.ApiFields.CONSTANT_FIELDS; import static org.hisp.dhis.api.ApiFields.DASHBOARD_FIELDS; +import static org.hisp.dhis.api.ApiFields.DATA_APPROVAL_WORKFLOW_FIELDS; import static org.hisp.dhis.api.ApiFields.DATA_ELEMENT_EXT_FIELDS; import static org.hisp.dhis.api.ApiFields.DATA_ELEMENT_GROUP_EXT_FIELDS; import static org.hisp.dhis.api.ApiFields.DATA_ELEMENT_GROUP_FIELDS; @@ -95,6 +96,7 @@ import org.hisp.dhis.model.CategoryOptionGroup; import org.hisp.dhis.model.CategoryOptionGroupSet; import org.hisp.dhis.model.Constant; +import org.hisp.dhis.model.DataApprovalWorkflow; import org.hisp.dhis.model.DataElement; import org.hisp.dhis.model.DataElementGroup; import org.hisp.dhis.model.DataElementGroupSet; @@ -199,6 +201,12 @@ public enum MetadataEntity { DASHBOARD_FIELDS, "dashboards", Dhis2Objects::getDashboards), + DATA_APPROVAL_WORKFLOW( + DataApprovalWorkflow.class, + DATA_APPROVAL_WORKFLOW_FIELDS, + DATA_APPROVAL_WORKFLOW_FIELDS, + "dataApprovalWorkflows", + Dhis2Objects::getDataApprovalWorkflows), DATA_ELEMENT( DataElement.class, DATA_ELEMENT_EXT_FIELDS, @@ -447,6 +455,8 @@ public static MetadataEntity from(T object) { return CATEGORY_OPTION_GROUP_SET; } else if (object instanceof Dashboard) { return DASHBOARD; + } else if (object instanceof DataApprovalWorkflow) { + return DATA_APPROVAL_WORKFLOW; } else if (object instanceof DataElement) { return DATA_ELEMENT; } else if (object instanceof DataElementGroup) { diff --git a/src/test/java/org/hisp/dhis/model/DataApprovalWorkflowTest.java b/src/test/java/org/hisp/dhis/model/DataApprovalWorkflowTest.java new file mode 100644 index 00000000..efce9584 --- /dev/null +++ b/src/test/java/org/hisp/dhis/model/DataApprovalWorkflowTest.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2004-2025, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.model; + +import static org.hisp.dhis.support.Assertions.assertSize; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.hisp.dhis.support.JsonClassPathFile; +import org.hisp.dhis.support.TestTags; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +@Tag(TestTags.UNIT) +class DataApprovalWorkflowTest { + @Test + void testDeserialize() { + DataApprovalWorkflow workflow = + JsonClassPathFile.fromJson( + "metadata/data-approval-workflow.json", DataApprovalWorkflow.class); + + assertNotNull(workflow); + assertEquals("wkn0K4gtVHo", workflow.getId()); + assertEquals("Malaria Approval Workflow", workflow.getName()); + assertEquals("Monthly", workflow.getPeriodType()); + assertSize(3, workflow.getDataSets()); + assertEquals("pBOMPrpg1QX", workflow.getDataSets().get(0).getId()); + assertEquals("VTdjfLXXmoi", workflow.getDataSets().get(1).getId()); + assertEquals("Lpw6GcnTrmS", workflow.getDataSets().get(2).getId()); + } +} diff --git a/src/test/resources/metadata/data-approval-workflow.json b/src/test/resources/metadata/data-approval-workflow.json new file mode 100644 index 00000000..63130a4a --- /dev/null +++ b/src/test/resources/metadata/data-approval-workflow.json @@ -0,0 +1,20 @@ +{ + "id": "wkn0K4gtVHo", + "code": "MALARIA_WORKFLOW", + "name": "Malaria Approval Workflow", + "periodType": "Monthly", + "dataSets": [ + { + "id": "pBOMPrpg1QX", + "name": "Mortality < 5 years" + }, + { + "id": "VTdjfLXXmoi", + "name": "Child Health" + }, + { + "id": "Lpw6GcnTrmS", + "name": "Malaria Annual Data" + } + ] +}