diff --git a/core/src/main/java/org/hisp/dhis/android/core/event/EventDataFilter.java b/core/src/main/java/org/hisp/dhis/android/core/event/EventDataFilter.java index 9f5076703a..5c901e91fa 100644 --- a/core/src/main/java/org/hisp/dhis/android/core/event/EventDataFilter.java +++ b/core/src/main/java/org/hisp/dhis/android/core/event/EventDataFilter.java @@ -32,30 +32,24 @@ import androidx.annotation.Nullable; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; import com.google.auto.value.AutoValue; import org.hisp.dhis.android.core.common.CoreObject; import org.hisp.dhis.android.core.common.FilterOperators; @AutoValue -@JsonDeserialize(builder = $$AutoValue_EventDataFilter.Builder.class) public abstract class EventDataFilter extends FilterOperators implements CoreObject { /** * The related event filter */ @Nullable - @JsonProperty() public abstract String eventFilter(); /** * The data element id or data item */ @Nullable - @JsonProperty() public abstract String dataItem(); public static Builder builder() { @@ -69,7 +63,6 @@ public static EventDataFilter create(Cursor cursor) { public abstract Builder toBuilder(); @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "") public abstract static class Builder extends FilterOperators.Builder { public abstract Builder id(Long id); diff --git a/core/src/main/java/org/hisp/dhis/android/core/event/EventFilter.java b/core/src/main/java/org/hisp/dhis/android/core/event/EventFilter.java index 81042a1dc9..88ad400f30 100644 --- a/core/src/main/java/org/hisp/dhis/android/core/event/EventFilter.java +++ b/core/src/main/java/org/hisp/dhis/android/core/event/EventFilter.java @@ -32,9 +32,6 @@ import androidx.annotation.Nullable; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; import com.gabrielittner.auto.value.cursor.ColumnAdapter; import com.google.auto.value.AutoValue; @@ -43,23 +40,18 @@ import org.hisp.dhis.android.core.common.CoreObject; @AutoValue -@JsonDeserialize(builder = $$AutoValue_EventFilter.Builder.class) public abstract class EventFilter extends BaseIdentifiableObject implements CoreObject { @Nullable - @JsonProperty() public abstract String program(); @Nullable - @JsonProperty() public abstract String programStage(); @Nullable - @JsonProperty() public abstract String description(); @Nullable - @JsonProperty() @ColumnAdapter(EventQueryCriteriaColumnAdapter.class) public abstract EventQueryCriteria eventQueryCriteria(); @@ -74,7 +66,6 @@ public static EventFilter create(Cursor cursor) { public abstract Builder toBuilder(); @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "") public abstract static class Builder extends BaseIdentifiableObject.Builder { public abstract Builder id(Long id); diff --git a/core/src/main/java/org/hisp/dhis/android/core/event/EventQueryCriteria.java b/core/src/main/java/org/hisp/dhis/android/core/event/EventQueryCriteria.java index 7d3a1eba2d..f64e2ede9d 100644 --- a/core/src/main/java/org/hisp/dhis/android/core/event/EventQueryCriteria.java +++ b/core/src/main/java/org/hisp/dhis/android/core/event/EventQueryCriteria.java @@ -32,9 +32,6 @@ import androidx.annotation.Nullable; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; import com.gabrielittner.auto.value.cursor.ColumnAdapter; import com.google.auto.value.AutoValue; @@ -48,26 +45,21 @@ import java.util.List; @AutoValue -@JsonDeserialize(builder = $$AutoValue_EventQueryCriteria.Builder.class) public abstract class EventQueryCriteria extends FilterQueryCriteria implements CoreObject { @Nullable - @JsonProperty() @ColumnAdapter(IgnoreEventDataFilterListColumnAdapter.class) public abstract List dataFilters(); @Nullable - @JsonProperty() @ColumnAdapter(StringListColumnAdapter.class) public abstract List events(); @Nullable - @JsonProperty() @ColumnAdapter(DateFilterPeriodColumnAdapter.class) public abstract DateFilterPeriod dueDate(); @Nullable - @JsonProperty() @ColumnAdapter(DateFilterPeriodColumnAdapter.class) public abstract DateFilterPeriod completedDate(); @@ -82,7 +74,6 @@ public static EventQueryCriteria create(Cursor cursor) { public abstract Builder toBuilder(); @AutoValue.Builder - @JsonPOJOBuilder(withPrefix = "") public abstract static class Builder extends FilterQueryCriteria.Builder { public abstract Builder id(Long id); diff --git a/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterCall.kt b/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterCall.kt index 70a77800b5..77b1cc596f 100644 --- a/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterCall.kt +++ b/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterCall.kt @@ -29,7 +29,6 @@ package org.hisp.dhis.android.core.event.internal import org.hisp.dhis.android.core.arch.api.executors.internal.APIDownloader import org.hisp.dhis.android.core.arch.call.factories.internal.UidsCallCoroutines -import org.hisp.dhis.android.core.common.internal.DataAccessFields import org.hisp.dhis.android.core.event.EventFilter import org.hisp.dhis.android.core.systeminfo.DHISVersion import org.hisp.dhis.android.core.systeminfo.DHISVersionManager @@ -37,7 +36,7 @@ import org.koin.core.annotation.Singleton @Singleton internal class EventFilterCall internal constructor( - private val service: EventFilterService, + private val networkHandler: EventFilterNetworkHandler, val handler: EventFilterHandler, val apiDownloader: APIDownloader, val versionManager: DHISVersionManager, @@ -45,19 +44,12 @@ internal class EventFilterCall internal constructor( override suspend fun download(programUids: Set): List { return if (versionManager.isGreaterThan(DHISVersion.V2_31)) { - val accessDataReadFilter = "access." + DataAccessFields.read.eq(true).generateString() apiDownloader.downloadPartitioned( programUids, MAX_UID_LIST_SIZE, handler, - ) { partitionUids: Set -> - service.getEventFilters( - EventFilterFields.programUid.`in`(partitionUids), - accessDataReadFilter, - EventFilterFields.allFields, - false, - ) - } + networkHandler::getEventFilters, + ) } else { arrayListOf() } diff --git a/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterHandler.kt b/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterHandler.kt index 07eadbd16e..e8f4c9cf11 100644 --- a/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterHandler.kt +++ b/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterHandler.kt @@ -29,7 +29,6 @@ package org.hisp.dhis.android.core.event.internal import org.hisp.dhis.android.core.arch.handlers.internal.HandleAction import org.hisp.dhis.android.core.arch.handlers.internal.IdentifiableHandlerImpl -import org.hisp.dhis.android.core.event.EventDataFilter import org.hisp.dhis.android.core.event.EventFilter import org.koin.core.annotation.Singleton @@ -46,9 +45,7 @@ internal class EventFilterHandler constructor( override fun afterObjectHandled(o: EventFilter, action: HandleAction) { if (action !== HandleAction.Delete && o.eventQueryCriteria() != null) { - eventDataFilterHandler.handleMany( - o.eventQueryCriteria()!!.dataFilters(), - ) { edf: EventDataFilter -> edf.toBuilder().eventFilter(o.uid()).build() } + eventDataFilterHandler.handleMany(o.eventQueryCriteria()!!.dataFilters()) } } } diff --git a/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterNetworkHandler.kt b/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterNetworkHandler.kt new file mode 100644 index 0000000000..257d79b00d --- /dev/null +++ b/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterNetworkHandler.kt @@ -0,0 +1,38 @@ +/* + * 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.android.core.event.internal + +import org.hisp.dhis.android.core.arch.api.payload.internal.Payload +import org.hisp.dhis.android.core.event.EventFilter + +internal fun interface EventFilterNetworkHandler { + suspend fun getEventFilters( + partitionUids: Set, + ): Payload +} diff --git a/core/src/main/java/org/hisp/dhis/android/network/attribute/AttributeDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/attribute/AttributeDTO.kt index cedafc56fc..e1852832a3 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/attribute/AttributeDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/attribute/AttributeDTO.kt @@ -33,7 +33,6 @@ import kotlinx.serialization.Serializable import org.hisp.dhis.android.core.attribute.Attribute import org.hisp.dhis.android.core.common.ValueType import org.hisp.dhis.android.network.common.PayloadJson -import org.hisp.dhis.android.network.common.dto.BaseIdentifiableObjectDTO import org.hisp.dhis.android.network.common.dto.BaseNameableObjectDTO import org.hisp.dhis.android.network.common.dto.PagerDTO import org.hisp.dhis.android.network.common.dto.applyBaseNameableFields @@ -41,28 +40,28 @@ import org.hisp.dhis.android.network.common.dto.applyBaseNameableFields @Serializable internal data class AttributeDTO( @SerialName("id") override val uid: String, - override val code: String? = BaseIdentifiableObjectDTO.CODE, - override val name: String? = BaseIdentifiableObjectDTO.NAME, - override val displayName: String? = BaseIdentifiableObjectDTO.DISPLAY_NAME, - override val created: String? = BaseIdentifiableObjectDTO.CREATED, - override val lastUpdated: String? = BaseIdentifiableObjectDTO.LAST_UPDATED, - override val deleted: Boolean? = BaseIdentifiableObjectDTO.DELETED, - override val shortName: String? = BaseNameableObjectDTO.SHORT_NAME, - override val displayShortName: String? = BaseNameableObjectDTO.DISPLAY_SHORT_NAME, - override val description: String? = BaseNameableObjectDTO.DESCRIPTION, - override val displayDescription: String? = BaseNameableObjectDTO.DISPLAY_DESCRIPTION, - val valueType: String? = null, - val unique: Boolean? = null, - val mandatory: Boolean? = null, - val indicatorAttribute: Boolean? = null, - val indicatorGroupAttribute: Boolean? = null, - val userGroupAttribute: Boolean? = null, - val dataElementAttribute: Boolean? = null, - val constantAttribute: Boolean? = null, - val categoryOptionAttribute: Boolean? = null, - val optionSetAttribute: Boolean? = null, - val sqlViewAttribute: Boolean? = null, - val legendSetAttribute: Boolean? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + override val shortName: String?, + override val displayShortName: String?, + override val description: String?, + override val displayDescription: String?, + val valueType: String?, + val unique: Boolean?, + val mandatory: Boolean?, + val indicatorAttribute: Boolean?, + val indicatorGroupAttribute: Boolean?, + val userGroupAttribute: Boolean?, + val dataElementAttribute: Boolean?, + val constantAttribute: Boolean?, + val categoryOptionAttribute: Boolean?, + val optionSetAttribute: Boolean?, + val sqlViewAttribute: Boolean?, + val legendSetAttribute: Boolean?, val trackedEntityAttributeAttribute: Boolean? = null, val organisationUnitAttribute: Boolean? = null, val dataSetAttribute: Boolean? = null, diff --git a/core/src/main/java/org/hisp/dhis/android/network/category/CategoryDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/category/CategoryDTO.kt index 69c550050c..fb51789a18 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/category/CategoryDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/category/CategoryDTO.kt @@ -41,13 +41,13 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class CategoryDTO( @SerialName("id") override val uid: String, - override val code: String? = BaseIdentifiableObjectDTO.CODE, - override val name: String? = BaseIdentifiableObjectDTO.NAME, - override val displayName: String? = BaseIdentifiableObjectDTO.DISPLAY_NAME, - override val created: String? = BaseIdentifiableObjectDTO.CREATED, - override val lastUpdated: String? = BaseIdentifiableObjectDTO.LAST_UPDATED, - override val deleted: Boolean? = BaseIdentifiableObjectDTO.DELETED, - val dataDimensionType: String? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + val dataDimensionType: String?, val categoryOptions: List = emptyList(), ) : BaseIdentifiableObjectDTO { fun toDomain(): Category { @@ -61,6 +61,6 @@ internal data class CategoryDTO( @Serializable internal class CategoryPayload( - override val pager: PagerDTO? = null, + override val pager: PagerDTO?, @SerialName("categories") override val items: List = emptyList(), ) : PayloadJson(pager, items) diff --git a/core/src/main/java/org/hisp/dhis/android/network/category/CategoryOptionComboDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/category/CategoryOptionComboDTO.kt index c60aa2049e..75ab08dc43 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/category/CategoryOptionComboDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/category/CategoryOptionComboDTO.kt @@ -40,12 +40,12 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class CategoryOptionComboDTO( @SerialName("id") override val uid: String, - override val code: String? = BaseIdentifiableObjectDTO.CODE, - override val name: String? = BaseIdentifiableObjectDTO.NAME, - override val displayName: String? = BaseIdentifiableObjectDTO.DISPLAY_NAME, - override val created: String? = BaseIdentifiableObjectDTO.CREATED, - override val lastUpdated: String? = BaseIdentifiableObjectDTO.LAST_UPDATED, - override val deleted: Boolean? = BaseIdentifiableObjectDTO.DELETED, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, val categoryOptions: List = emptyList(), ) : BaseIdentifiableObjectDTO { fun toDomain(categoryComboUid: String): CategoryOptionCombo { diff --git a/core/src/main/java/org/hisp/dhis/android/network/categorycombo/CategoryComboDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/categorycombo/CategoryComboDTO.kt index ef2a9e80a1..f7914f9ddf 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/categorycombo/CategoryComboDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/categorycombo/CategoryComboDTO.kt @@ -42,13 +42,13 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class CategoryComboDTO( @SerialName("id") override val uid: String, - override val code: String? = BaseIdentifiableObjectDTO.CODE, - override val name: String? = BaseIdentifiableObjectDTO.NAME, - override val displayName: String? = BaseIdentifiableObjectDTO.DISPLAY_NAME, - override val created: String? = BaseIdentifiableObjectDTO.CREATED, - override val lastUpdated: String? = BaseIdentifiableObjectDTO.LAST_UPDATED, - override val deleted: Boolean? = BaseIdentifiableObjectDTO.DELETED, - val isDefault: Boolean? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + val isDefault: Boolean?, val categories: List = emptyList(), val categoryOptionCombos: List = emptyList(), ) : BaseIdentifiableObjectDTO { @@ -64,6 +64,6 @@ internal data class CategoryComboDTO( @Serializable internal class CategoryComboPayload( - override val pager: PagerDTO? = null, + override val pager: PagerDTO?, @SerialName("categoryCombos") override val items: List = emptyList(), ) : PayloadJson(pager, items) diff --git a/core/src/main/java/org/hisp/dhis/android/network/categoryoption/CategoryOptionDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/categoryoption/CategoryOptionDTO.kt index 1dc0594e94..18f095e173 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/categoryoption/CategoryOptionDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/categoryoption/CategoryOptionDTO.kt @@ -34,7 +34,6 @@ import org.hisp.dhis.android.core.arch.helpers.DateUtils import org.hisp.dhis.android.core.category.CategoryOption import org.hisp.dhis.android.network.common.PayloadJson import org.hisp.dhis.android.network.common.dto.AccessDTO -import org.hisp.dhis.android.network.common.dto.BaseIdentifiableObjectDTO import org.hisp.dhis.android.network.common.dto.BaseNameableObjectDTO import org.hisp.dhis.android.network.common.dto.PagerDTO import org.hisp.dhis.android.network.common.dto.applyBaseNameableFields @@ -42,19 +41,19 @@ import org.hisp.dhis.android.network.common.dto.applyBaseNameableFields @Serializable internal data class CategoryOptionDTO( @SerialName("id") override val uid: String, - override val code: String? = BaseIdentifiableObjectDTO.CODE, - override val name: String? = BaseIdentifiableObjectDTO.NAME, - override val displayName: String? = BaseIdentifiableObjectDTO.DISPLAY_NAME, - override val created: String? = BaseIdentifiableObjectDTO.CREATED, - override val lastUpdated: String? = BaseIdentifiableObjectDTO.LAST_UPDATED, - override val deleted: Boolean? = BaseIdentifiableObjectDTO.DELETED, - override val shortName: String? = BaseNameableObjectDTO.SHORT_NAME, - override val displayShortName: String? = BaseNameableObjectDTO.DISPLAY_SHORT_NAME, - override val description: String? = BaseNameableObjectDTO.DESCRIPTION, - override val displayDescription: String? = BaseNameableObjectDTO.DISPLAY_DESCRIPTION, - val startDate: String? = null, - val endDate: String? = null, - val access: AccessDTO? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + override val shortName: String?, + override val displayShortName: String?, + override val description: String?, + override val displayDescription: String?, + val startDate: String?, + val endDate: String?, + val access: AccessDTO?, ) : BaseNameableObjectDTO { fun toDomain(): CategoryOption { return CategoryOption.builder().apply { @@ -68,6 +67,6 @@ internal data class CategoryOptionDTO( @Serializable internal class CategoryOptionPayload( - override val pager: PagerDTO? = null, + override val pager: PagerDTO?, @SerialName("categoryOptions") override val items: List = emptyList(), ) : PayloadJson(pager, items) diff --git a/core/src/main/java/org/hisp/dhis/android/network/common/GeometryDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/common/GeometryDTO.kt index 048c348949..07a9d831e2 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/common/GeometryDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/common/GeometryDTO.kt @@ -34,8 +34,8 @@ import org.hisp.dhis.android.core.common.Geometry @Serializable internal data class GeometryDTO( - val type: FeatureType? = null, - val coordinates: String? = null, + val type: FeatureType?, + val coordinates: String?, ) { fun toDomain(): Geometry { return Geometry.builder() diff --git a/core/src/main/java/org/hisp/dhis/android/network/common/dto/AccessDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/common/dto/AccessDTO.kt index 28ecb3bd10..97c4bbc8d4 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/common/dto/AccessDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/common/dto/AccessDTO.kt @@ -35,7 +35,7 @@ import org.hisp.dhis.android.core.common.Access internal data class AccessDTO( val read: Boolean = true, val write: Boolean = true, - val data: DataAccessDTO? = null, + val data: DataAccessDTO?, ) { fun toDomain(): Access { return Access.builder() diff --git a/core/src/main/java/org/hisp/dhis/android/network/common/dto/BaseIdentifiableObjectDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/common/dto/BaseIdentifiableObjectDTO.kt index 11c11d624a..a0972cf796 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/common/dto/BaseIdentifiableObjectDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/common/dto/BaseIdentifiableObjectDTO.kt @@ -38,15 +38,6 @@ internal interface BaseIdentifiableObjectDTO { val created: String? val lastUpdated: String? val deleted: Boolean? - - companion object { - val CODE = null - val NAME = null - val DISPLAY_NAME = null - val CREATED = null - val LAST_UPDATED = null - val DELETED = null - } } internal fun T.applyBaseIdentifiableFields(item: BaseIdentifiableObjectDTO): T where diff --git a/core/src/main/java/org/hisp/dhis/android/network/common/dto/BaseNameableObjectDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/common/dto/BaseNameableObjectDTO.kt index 7126d4a4bf..98b8ef6816 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/common/dto/BaseNameableObjectDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/common/dto/BaseNameableObjectDTO.kt @@ -35,13 +35,6 @@ internal interface BaseNameableObjectDTO : BaseIdentifiableObjectDTO { val displayShortName: String? val description: String? val displayDescription: String? - - companion object { - val SHORT_NAME = null - val DISPLAY_SHORT_NAME = null - val DESCRIPTION = null - val DISPLAY_DESCRIPTION = null - } } internal fun T.applyBaseNameableFields(item: BaseNameableObjectDTO): T where diff --git a/core/src/main/java/org/hisp/dhis/android/network/common/dto/DateFilterPeriodDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/common/dto/DateFilterPeriodDTO.kt new file mode 100644 index 0000000000..89ee2f1f09 --- /dev/null +++ b/core/src/main/java/org/hisp/dhis/android/network/common/dto/DateFilterPeriodDTO.kt @@ -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.android.network.common.dto + +import kotlinx.serialization.Serializable +import org.hisp.dhis.android.core.arch.helpers.DateUtils +import org.hisp.dhis.android.core.common.DateFilterPeriod +import org.hisp.dhis.android.core.common.DatePeriodType +import org.hisp.dhis.android.core.common.RelativePeriod + +@Serializable +internal data class DateFilterPeriodDTO( + val startBuffer: Int?, + val endBuffer: Int?, + val startDate: String?, + val endDate: String?, + val period: String?, + val type: String?, +) { + fun toDomain(): DateFilterPeriod { + return DateFilterPeriod.builder() + .startBuffer(startBuffer) + .endBuffer(endBuffer) + .startDate(startDate?.let { DateUtils.SIMPLE_DATE_FORMAT.parse(it) }) + .endDate(endDate?.let { DateUtils.SIMPLE_DATE_FORMAT.parse(it) }) + .period(period?.let { RelativePeriod.valueOf(it) }) + .type(type?.let { DatePeriodType.valueOf(it) }) + .build() + } +} diff --git a/core/src/main/java/org/hisp/dhis/android/network/common/dto/ObjectWithStyleDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/common/dto/ObjectWithStyleDTO.kt index d42b8c9936..96e0d4f342 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/common/dto/ObjectWithStyleDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/common/dto/ObjectWithStyleDTO.kt @@ -33,8 +33,8 @@ import org.hisp.dhis.android.core.common.ObjectStyle @Serializable internal data class ObjectWithStyleDTO( - val color: String? = null, - val icon: String? = null, + val color: String?, + val icon: String?, ) { fun toDomain(): ObjectStyle { return ObjectStyle.builder() diff --git a/core/src/main/java/org/hisp/dhis/android/network/constant/ConstantDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/constant/ConstantDTO.kt index aa40c11ef2..91b39a4717 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/constant/ConstantDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/constant/ConstantDTO.kt @@ -39,13 +39,13 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class ConstantDTO( @SerialName("id") override val uid: String, - override val code: String? = BaseIdentifiableObjectDTO.CODE, - override val name: String? = BaseIdentifiableObjectDTO.NAME, - override val displayName: String? = BaseIdentifiableObjectDTO.DISPLAY_NAME, - override val created: String? = BaseIdentifiableObjectDTO.CREATED, - override val lastUpdated: String? = BaseIdentifiableObjectDTO.LAST_UPDATED, - override val deleted: Boolean? = BaseIdentifiableObjectDTO.DELETED, - val value: Double? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + val value: Double?, ) : BaseIdentifiableObjectDTO { fun toDomain(): Constant { return Constant.builder() @@ -57,6 +57,6 @@ internal data class ConstantDTO( @Serializable internal class ConstantPayload( - override val pager: PagerDTO? = null, + override val pager: PagerDTO?, @SerialName("constants") override val items: List = emptyList(), ) : PayloadJson(pager, items) diff --git a/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventDataFilterDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventDataFilterDTO.kt new file mode 100644 index 0000000000..627a1b911e --- /dev/null +++ b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventDataFilterDTO.kt @@ -0,0 +1,54 @@ +/* + * 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.android.network.eventFilter + +import kotlinx.serialization.Serializable +import org.hisp.dhis.android.core.event.EventDataFilter +import org.hisp.dhis.android.network.common.dto.DateFilterPeriodDTO + +@Serializable +internal data class EventDataFilterDTO( + override val le: String?, + override val ge: String?, + override val gt: String?, + override val lt: String?, + override val eq: String?, + override val `in`: Set?, + override val like: String?, + override val dateFilter: DateFilterPeriodDTO?, + val dataItem: String?, +) : FilterOperatorsDTO { + fun toDomain(eventFilter: String): EventDataFilter { + return EventDataFilter.builder() + .applyFilterOperatorsFields(this) + .eventFilter(eventFilter) + .dataItem(dataItem) + .build() + } +} diff --git a/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterDTO.kt new file mode 100644 index 0000000000..ce427efa58 --- /dev/null +++ b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterDTO.kt @@ -0,0 +1,68 @@ +/* + * 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.android.network.eventFilter + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.hisp.dhis.android.core.event.EventFilter +import org.hisp.dhis.android.network.common.PayloadJson +import org.hisp.dhis.android.network.common.dto.BaseIdentifiableObjectDTO +import org.hisp.dhis.android.network.common.dto.PagerDTO +import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields + +@Serializable +internal data class EventFilterDTO( + @SerialName("id") override val uid: String, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + val program: String?, + val programStage: String?, + val description: String?, + val eventQueryCriteria: EventQueryCriteriaDTO?, +) : BaseIdentifiableObjectDTO { + fun toDomain(): EventFilter { + return EventFilter.builder() + .applyBaseIdentifiableFields(this) + .program(program) + .programStage(programStage) + .description(description) + .eventQueryCriteria(eventQueryCriteria?.toDomain(uid)) + .build() + } +} + +@Serializable +internal class EventFilterPayload( + override val pager: PagerDTO?, + @SerialName("eventFilters") override val items: List = emptyList(), +) : PayloadJson(pager, items) diff --git a/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterFields.kt b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterFields.kt similarity index 93% rename from core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterFields.kt rename to core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterFields.kt index cfcb4b0593..5ceb092444 100644 --- a/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterFields.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterFields.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2023, University of Oslo + * Copyright (c) 2004-2025, University of Oslo * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,11 +25,12 @@ * (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.android.core.event.internal +package org.hisp.dhis.android.network.eventFilter import org.hisp.dhis.android.core.event.EventFilter import org.hisp.dhis.android.core.event.EventFilterTableInfo.Columns import org.hisp.dhis.android.core.event.EventQueryCriteria +import org.hisp.dhis.android.core.event.internal.EventQueryCriteriaFields import org.hisp.dhis.android.network.common.fields.BaseFields import org.hisp.dhis.android.network.common.fields.Fields diff --git a/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterNetworkHandlerImpl.kt b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterNetworkHandlerImpl.kt new file mode 100644 index 0000000000..492a70b3fc --- /dev/null +++ b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterNetworkHandlerImpl.kt @@ -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.android.network.eventFilter + +import org.hisp.dhis.android.core.common.internal.DataAccessFields +import org.hisp.dhis.android.core.event.EventFilter +import org.hisp.dhis.android.core.event.internal.EventFilterNetworkHandler +import org.hisp.dhis.android.network.common.HttpServiceClientKotlinx +import org.hisp.dhis.android.network.common.PayloadJson +import org.koin.core.annotation.Singleton + +@Singleton +internal class EventFilterNetworkHandlerImpl( + httpClient: HttpServiceClientKotlinx, +) : EventFilterNetworkHandler { + private val service: EventFilterService = EventFilterService(httpClient) + + override suspend fun getEventFilters( + partitionUids: Set, + ): PayloadJson { + val accessDataReadFilter = "access." + DataAccessFields.read.eq(true).generateString() + val apiPayload = service.getEventFilters( + EventFilterFields.programUid.`in`(partitionUids), + accessDataReadFilter, + EventFilterFields.allFields, + false, + ) + return apiPayload.mapItems(EventFilterDTO::toDomain) + } +} diff --git a/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterService.kt b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterService.kt similarity index 86% rename from core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterService.kt rename to core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterService.kt index fec664af46..74d492824b 100644 --- a/core/src/main/java/org/hisp/dhis/android/core/event/internal/EventFilterService.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventFilterService.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2023, University of Oslo + * Copyright (c) 2004-2025, University of Oslo * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,23 +25,20 @@ * (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.android.core.event.internal +package org.hisp.dhis.android.network.eventFilter -import org.hisp.dhis.android.core.arch.api.HttpServiceClient -import org.hisp.dhis.android.core.arch.api.payload.internal.PayloadJackson import org.hisp.dhis.android.core.event.EventFilter +import org.hisp.dhis.android.network.common.HttpServiceClientKotlinx import org.hisp.dhis.android.network.common.fields.Fields import org.hisp.dhis.android.network.common.filters.Filter -import org.koin.core.annotation.Singleton -@Singleton -internal class EventFilterService(private val client: HttpServiceClient) { +internal class EventFilterService(private val client: HttpServiceClientKotlinx) { suspend fun getEventFilters( uids: Filter, accessDataReadFilter: String, fields: Fields, paging: Boolean, - ): PayloadJackson { + ): EventFilterPayload { return client.get { url("eventFilters") parameters { diff --git a/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventQueryCriteriaDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventQueryCriteriaDTO.kt new file mode 100644 index 0000000000..2060512941 --- /dev/null +++ b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/EventQueryCriteriaDTO.kt @@ -0,0 +1,60 @@ +/* + * 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.android.network.eventFilter + +import kotlinx.serialization.Serializable +import org.hisp.dhis.android.core.event.EventQueryCriteria +import org.hisp.dhis.android.network.common.dto.DateFilterPeriodDTO + +@Serializable +internal data class EventQueryCriteriaDTO( + override val followUp: Boolean?, + override val organisationUnit: String?, + override val ouMode: String?, + override val assignedUserMode: String?, + override val order: String?, + override val displayColumnOrder: List?, + override val eventStatus: String?, + override val eventDate: DateFilterPeriodDTO?, + override val lastUpdatedDate: DateFilterPeriodDTO?, + val dataFilters: List?, + val events: List?, + val dueDate: DateFilterPeriodDTO?, + val completedDate: DateFilterPeriodDTO?, +) : FilterQueryCriteriaDTO { + fun toDomain(eventFilter: String): EventQueryCriteria { + return EventQueryCriteria.builder() + .applyFilterQueryCriteriaFields(this) + .dataFilters(dataFilters?.map { it.toDomain(eventFilter) }) + .events(events) + .dueDate(dueDate?.toDomain()) + .completedDate(completedDate?.toDomain()) + .build() + } +} diff --git a/core/src/main/java/org/hisp/dhis/android/network/eventFilter/FilterOperatorsDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/FilterOperatorsDTO.kt new file mode 100644 index 0000000000..9aed207de9 --- /dev/null +++ b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/FilterOperatorsDTO.kt @@ -0,0 +1,57 @@ +/* + * 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.android.network.eventFilter + +import org.hisp.dhis.android.core.common.FilterOperators +import org.hisp.dhis.android.network.common.dto.DateFilterPeriodDTO + +@Suppress("VariableNaming") +internal interface FilterOperatorsDTO { + val le: String? + val ge: String? + val gt: String? + val lt: String? + val eq: String? + val `in`: Set? + val like: String? + val dateFilter: DateFilterPeriodDTO? +} + +internal fun T.applyFilterOperatorsFields(item: FilterOperatorsDTO): T where + T : FilterOperators.Builder { + le(item.le) + ge(item.ge) + gt(item.gt) + lt(item.lt) + eq(item.eq) + `in`(item.`in`) + like(item.like) + dateFilter(item.dateFilter?.toDomain()) + return this +} diff --git a/core/src/main/java/org/hisp/dhis/android/network/eventFilter/FilterQueryCriteriaDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/FilterQueryCriteriaDTO.kt new file mode 100644 index 0000000000..6ad7e998f1 --- /dev/null +++ b/core/src/main/java/org/hisp/dhis/android/network/eventFilter/FilterQueryCriteriaDTO.kt @@ -0,0 +1,61 @@ +/* + * 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.android.network.eventFilter + +import org.hisp.dhis.android.core.common.AssignedUserMode +import org.hisp.dhis.android.core.common.FilterQueryCriteria +import org.hisp.dhis.android.core.event.EventStatus +import org.hisp.dhis.android.core.organisationunit.OrganisationUnitMode +import org.hisp.dhis.android.network.common.dto.DateFilterPeriodDTO + +internal interface FilterQueryCriteriaDTO { + val followUp: Boolean? + val organisationUnit: String? + val ouMode: String? + val assignedUserMode: String? + val order: String? + val displayColumnOrder: List? + val eventStatus: String? + val eventDate: DateFilterPeriodDTO? + val lastUpdatedDate: DateFilterPeriodDTO? +} + +internal fun T.applyFilterQueryCriteriaFields(item: FilterQueryCriteriaDTO): T where + T : FilterQueryCriteria.Builder { + followUp(item.followUp) + organisationUnit(item.organisationUnit) + item.ouMode?.let { ouMode(OrganisationUnitMode.valueOf(it)) } + item.assignedUserMode?.let { assignedUserMode(AssignedUserMode.valueOf(it)) } + order(item.order) + displayColumnOrder(item.displayColumnOrder) + item.eventStatus?.let { eventStatus(EventStatus.valueOf(it)) } + eventDate(item.eventDate?.toDomain()) + lastUpdatedDate(item.lastUpdatedDate?.toDomain()) + return this +} diff --git a/core/src/main/java/org/hisp/dhis/android/network/legendset/LegendDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/legendset/LegendDTO.kt index 814cf3460e..5a91a4f098 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/legendset/LegendDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/legendset/LegendDTO.kt @@ -38,15 +38,15 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class LegendDTO( @SerialName("id") override val uid: String, - override val code: String? = BaseIdentifiableObjectDTO.CODE, - override val name: String? = BaseIdentifiableObjectDTO.NAME, - override val displayName: String? = BaseIdentifiableObjectDTO.DISPLAY_NAME, - override val created: String? = BaseIdentifiableObjectDTO.CREATED, - override val lastUpdated: String? = BaseIdentifiableObjectDTO.LAST_UPDATED, - override val deleted: Boolean? = BaseIdentifiableObjectDTO.DELETED, - val startValue: Double? = null, - val endValue: Double? = null, - val color: String? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + val startValue: Double?, + val endValue: Double?, + val color: String?, ) : BaseIdentifiableObjectDTO { fun toDomain(legendSetUid: String): Legend { return Legend.builder() diff --git a/core/src/main/java/org/hisp/dhis/android/network/legendset/LegendSetDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/legendset/LegendSetDTO.kt index f00c46cb03..beb8ce102b 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/legendset/LegendSetDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/legendset/LegendSetDTO.kt @@ -39,13 +39,13 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class LegendSetDTO( @SerialName("id") override val uid: String, - override val code: String? = BaseIdentifiableObjectDTO.CODE, - override val name: String? = BaseIdentifiableObjectDTO.NAME, - override val displayName: String? = BaseIdentifiableObjectDTO.DISPLAY_NAME, - override val created: String? = BaseIdentifiableObjectDTO.CREATED, - override val lastUpdated: String? = BaseIdentifiableObjectDTO.LAST_UPDATED, - override val deleted: Boolean? = BaseIdentifiableObjectDTO.DELETED, - val symbolizer: String? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + val symbolizer: String?, val legends: List = emptyList(), ) : BaseIdentifiableObjectDTO { fun toDomain(): LegendSet { @@ -59,6 +59,6 @@ internal data class LegendSetDTO( @Serializable internal class LegendSetPayload( - override val pager: PagerDTO? = null, + override val pager: PagerDTO?, @SerialName("legendSets") override val items: List = emptyList(), ) : PayloadJson(pager, items) diff --git a/core/src/main/java/org/hisp/dhis/android/network/option/OptionDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/option/OptionDTO.kt index c6a3baec29..c97fcee3d0 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/option/OptionDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/option/OptionDTO.kt @@ -41,15 +41,15 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class OptionDTO( @SerialName("id") override val uid: String, - override val code: String? = BaseIdentifiableObjectDTO.CODE, - override val name: String? = BaseIdentifiableObjectDTO.NAME, - override val displayName: String? = BaseIdentifiableObjectDTO.DISPLAY_NAME, - override val created: String? = BaseIdentifiableObjectDTO.CREATED, - override val lastUpdated: String? = BaseIdentifiableObjectDTO.LAST_UPDATED, - override val deleted: Boolean? = BaseIdentifiableObjectDTO.DELETED, - val sortOrder: Int? = null, - val optionSet: ObjectWithUidDTO? = null, - val style: ObjectWithStyleDTO? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + val sortOrder: Int?, + val optionSet: ObjectWithUidDTO?, + val style: ObjectWithStyleDTO?, ) : BaseIdentifiableObjectDTO { fun toDomain(): Option { return Option.builder().apply { @@ -63,6 +63,6 @@ internal data class OptionDTO( @Serializable internal class OptionPayload( - override val pager: PagerDTO? = null, + override val pager: PagerDTO?, @SerialName("options") override val items: List = emptyList(), ) : PayloadJson(pager, items) diff --git a/core/src/main/java/org/hisp/dhis/android/network/optiongroup/OptionGroupDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/optiongroup/OptionGroupDTO.kt index 7a61e7f135..18f79b532e 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/optiongroup/OptionGroupDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/optiongroup/OptionGroupDTO.kt @@ -40,13 +40,13 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class OptionGroupDTO( @SerialName("id") override val uid: String, - override val code: String? = BaseIdentifiableObjectDTO.CODE, - override val name: String? = BaseIdentifiableObjectDTO.NAME, - override val displayName: String? = BaseIdentifiableObjectDTO.DISPLAY_NAME, - override val created: String? = BaseIdentifiableObjectDTO.CREATED, - override val lastUpdated: String? = BaseIdentifiableObjectDTO.LAST_UPDATED, - override val deleted: Boolean? = BaseIdentifiableObjectDTO.DELETED, - val optionSet: ObjectWithUidDTO? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + val optionSet: ObjectWithUidDTO?, val options: List = emptyList(), ) : BaseIdentifiableObjectDTO { fun toDomain(): OptionGroup { @@ -60,6 +60,6 @@ internal data class OptionGroupDTO( @Serializable internal class OptionGroupPayload( - override val pager: PagerDTO? = null, + override val pager: PagerDTO?, @SerialName("optionGroups") override val items: List = emptyList(), ) : PayloadJson(pager, items) diff --git a/core/src/main/java/org/hisp/dhis/android/network/optionset/OptionSetDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/optionset/OptionSetDTO.kt index d5a3beb4ff..63b29838da 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/optionset/OptionSetDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/optionset/OptionSetDTO.kt @@ -40,14 +40,14 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class OptionSetDTO( @SerialName("id") override val uid: String, - override val code: String? = BaseIdentifiableObjectDTO.CODE, - override val name: String? = BaseIdentifiableObjectDTO.NAME, - override val displayName: String? = BaseIdentifiableObjectDTO.DISPLAY_NAME, - override val created: String? = BaseIdentifiableObjectDTO.CREATED, - override val lastUpdated: String? = BaseIdentifiableObjectDTO.LAST_UPDATED, - override val deleted: Boolean? = BaseIdentifiableObjectDTO.DELETED, - val version: Int? = null, - val valueType: String? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + val version: Int?, + val valueType: String?, ) : BaseIdentifiableObjectDTO { fun toDomain(): OptionSet { return OptionSet.builder().apply { @@ -60,6 +60,6 @@ internal data class OptionSetDTO( @Serializable internal class OptionSetPayload( - override val pager: PagerDTO? = null, + override val pager: PagerDTO?, @SerialName("optionSets") override val items: List = emptyList(), ) : PayloadJson(pager, items) diff --git a/core/src/main/java/org/hisp/dhis/android/network/organisationunit/OrganisationUnitDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/organisationunit/OrganisationUnitDTO.kt index 1b94d3bcae..61fe518605 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/organisationunit/OrganisationUnitDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/organisationunit/OrganisationUnitDTO.kt @@ -40,24 +40,24 @@ import org.hisp.dhis.android.network.common.dto.applyBaseNameableFields @Serializable internal data class OrganisationUnitDTO( @SerialName("id") override val uid: String, - override val code: String? = null, - override val name: String? = null, - override val displayName: String? = null, - override val created: String? = null, - override val lastUpdated: String? = null, - override val deleted: Boolean? = null, - override val shortName: String? = null, - override val displayShortName: String? = null, - override val description: String? = null, - override val displayDescription: String? = null, - val parent: ObjectWithUidDTO? = null, - val path: String? = null, - val openingDate: String? = null, - val closedDate: String? = null, - val level: Int? = null, - val coordinates: String? = null, - val featureType: String? = null, - val geometry: GeometryDTO? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + override val shortName: String?, + override val displayShortName: String?, + override val description: String?, + override val displayDescription: String?, + val parent: ObjectWithUidDTO?, + val path: String?, + val openingDate: String?, + val closedDate: String?, + val level: Int?, + val coordinates: String?, + val featureType: String?, + val geometry: GeometryDTO?, val programs: List? = emptyList(), val dataSets: List? = emptyList(), val ancestors: List? = emptyList(), diff --git a/core/src/main/java/org/hisp/dhis/android/network/organisationunit/OrganisationUnitGroupDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/organisationunit/OrganisationUnitGroupDTO.kt index a4fc866f4a..d128e6398f 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/organisationunit/OrganisationUnitGroupDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/organisationunit/OrganisationUnitGroupDTO.kt @@ -37,14 +37,14 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class OrganisationUnitGroupDTO( @SerialName("id") override val uid: String, - override val code: String? = null, - override val name: String? = null, - override val displayName: String? = null, - override val created: String? = null, - override val lastUpdated: String? = null, - override val deleted: Boolean? = null, - val shortname: String? = null, - val displayShortname: String? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + val shortname: String?, + val displayShortname: String?, ) : BaseIdentifiableObjectDTO { fun toDomain(): OrganisationUnitGroup { return OrganisationUnitGroup.builder() diff --git a/core/src/main/java/org/hisp/dhis/android/network/user/UserCredentialsDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/user/UserCredentialsDTO.kt index 3824181710..6098c053a1 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/user/UserCredentialsDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/user/UserCredentialsDTO.kt @@ -33,9 +33,9 @@ import org.hisp.dhis.android.core.user.UserCredentials @Serializable internal data class UserCredentialsDTO( - val username: String? = null, - val name: String? = null, - val displayName: String? = null, + val username: String?, + val name: String?, + val displayName: String?, val userRoles: List? = emptyList(), ) { fun toDomain(): UserCredentials { diff --git a/core/src/main/java/org/hisp/dhis/android/network/user/UserDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/user/UserDTO.kt index 60d5c04ab6..c6aa650a34 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/user/UserDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/user/UserDTO.kt @@ -38,15 +38,15 @@ import org.hisp.dhis.android.network.organisationunit.OrganisationUnitDTO @Serializable internal data class UserDTO( @SerialName("id") override val uid: String, - override val code: String? = null, - override val name: String? = null, - override val displayName: String? = null, - override val created: String? = null, - override val lastUpdated: String? = null, - override val deleted: Boolean? = null, - val username: String? = null, - val birthday: String? = null, - val education: String? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, + val username: String?, + val birthday: String?, + val education: String?, val gender: String? = null, val jobTitle: String? = null, val surname: String? = null, diff --git a/core/src/main/java/org/hisp/dhis/android/network/user/UserGroupDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/user/UserGroupDTO.kt index 1717db244f..69a6c5a640 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/user/UserGroupDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/user/UserGroupDTO.kt @@ -37,12 +37,12 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class UserGroupDTO( @SerialName("id") override val uid: String, - override val code: String? = null, - override val name: String? = null, - override val displayName: String? = null, - override val created: String? = null, - override val lastUpdated: String? = null, - override val deleted: Boolean? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, ) : BaseIdentifiableObjectDTO { fun toDomain(): UserGroup { return UserGroup.builder() diff --git a/core/src/main/java/org/hisp/dhis/android/network/user/UserRoleDTO.kt b/core/src/main/java/org/hisp/dhis/android/network/user/UserRoleDTO.kt index e6c6475a54..85d5ded37c 100644 --- a/core/src/main/java/org/hisp/dhis/android/network/user/UserRoleDTO.kt +++ b/core/src/main/java/org/hisp/dhis/android/network/user/UserRoleDTO.kt @@ -37,12 +37,12 @@ import org.hisp.dhis.android.network.common.dto.applyBaseIdentifiableFields @Serializable internal data class UserRoleDTO( @SerialName("id") override val uid: String, - override val code: String? = null, - override val name: String? = null, - override val displayName: String? = null, - override val created: String? = null, - override val lastUpdated: String? = null, - override val deleted: Boolean? = null, + override val code: String?, + override val name: String?, + override val displayName: String?, + override val created: String?, + override val lastUpdated: String?, + override val deleted: Boolean?, ) : BaseIdentifiableObjectDTO { fun toDomain(): UserRole { return UserRole.builder() diff --git a/core/src/test/java/org/hisp/dhis/android/core/arch/api/fields/internal/FieldsStringGenerationShould.kt b/core/src/test/java/org/hisp/dhis/android/core/arch/api/fields/internal/FieldsStringGenerationShould.kt index 3b158566d3..83da0c8e38 100644 --- a/core/src/test/java/org/hisp/dhis/android/core/arch/api/fields/internal/FieldsStringGenerationShould.kt +++ b/core/src/test/java/org/hisp/dhis/android/core/arch/api/fields/internal/FieldsStringGenerationShould.kt @@ -47,7 +47,6 @@ import org.hisp.dhis.android.core.enrollment.internal.NewEnrollmentFields import org.hisp.dhis.android.core.event.internal.DateFilterPeriodFields import org.hisp.dhis.android.core.event.internal.EventDataFilterFields import org.hisp.dhis.android.core.event.internal.EventFields -import org.hisp.dhis.android.core.event.internal.EventFilterFields import org.hisp.dhis.android.core.event.internal.EventQueryCriteriaFields import org.hisp.dhis.android.core.event.internal.NewEventFields import org.hisp.dhis.android.core.expressiondimensionitem.internal.ExpressionDimensionItemFields @@ -118,6 +117,7 @@ import org.hisp.dhis.android.network.common.fields.Fields import org.hisp.dhis.android.network.common.fields.Property import org.hisp.dhis.android.network.constant.ConstantFields import org.hisp.dhis.android.network.customIcon.CustomIconFields +import org.hisp.dhis.android.network.eventFilter.EventFilterFields import org.hisp.dhis.android.network.legendset.LegendSetFields import org.hisp.dhis.android.network.option.OptionFields import org.hisp.dhis.android.network.optiongroup.OptionGroupFields diff --git a/core/src/test/java/org/hisp/dhis/android/core/event/EventFilterShould.kt b/core/src/test/java/org/hisp/dhis/android/core/event/EventFilterShould.kt index f0dc21efeb..4b4be3fafe 100644 --- a/core/src/test/java/org/hisp/dhis/android/core/event/EventFilterShould.kt +++ b/core/src/test/java/org/hisp/dhis/android/core/event/EventFilterShould.kt @@ -31,14 +31,16 @@ import com.google.common.truth.Truth.assertThat import org.hisp.dhis.android.core.arch.helpers.DateUtils import org.hisp.dhis.android.core.common.* import org.hisp.dhis.android.core.organisationunit.OrganisationUnitMode +import org.hisp.dhis.android.network.eventFilter.EventFilterDTO import org.junit.Test -class EventFilterShould : BaseObjectShould("event/event_filter.json"), ObjectShould { +class EventFilterShould : BaseObjectKotlinxShould("event/event_filter.json"), ObjectShould { @Test @Suppress("LongMethod") override fun map_from_json_string() { - val eventFilter: EventFilter = objectMapper.readValue(jsonStream, EventFilter::class.java) + val eventFilterDTO = deserialize(EventFilterDTO.serializer()) + val eventFilter = eventFilterDTO.toDomain() assertThat(eventFilter.created()).isEqualTo(DateUtils.DATE_FORMAT.parse("2019-09-27T00:19:06.590")) assertThat(eventFilter.lastUpdated()).isEqualTo(DateUtils.DATE_FORMAT.parse("2019-09-27T00:19:06.590")) diff --git a/core/src/test/java/org/hisp/dhis/android/core/event/internal/EventFilterHandlerShould.java b/core/src/test/java/org/hisp/dhis/android/core/event/internal/EventFilterHandlerShould.java deleted file mode 100644 index 1820a4cdf4..0000000000 --- a/core/src/test/java/org/hisp/dhis/android/core/event/internal/EventFilterHandlerShould.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2004-2022, 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.android.core.event.internal; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import com.google.common.collect.Lists; - -import org.hisp.dhis.android.core.arch.handlers.internal.HandleAction; -import org.hisp.dhis.android.core.event.EventDataFilter; -import org.hisp.dhis.android.core.event.EventFilter; -import org.hisp.dhis.android.core.event.EventQueryCriteria; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.ArrayList; -import java.util.List; - -@RunWith(JUnit4.class) -public class EventFilterHandlerShould { - - @Mock - private EventFilterStore eventFilterStore; - - @Mock - private EventDataFilterHandler eventDataFilterHandler; - - @Mock - private EventQueryCriteria eventQueryCriteria; - - @Mock - private EventDataFilter eventDataFilter; - - // object to test - private List eventFilters; - private List eventDataFilters; - private EventFilterHandler eventFilterHandler; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - eventFilterHandler = new EventFilterHandler( - eventFilterStore, - eventDataFilterHandler); - - eventDataFilters = Lists.newArrayList(eventDataFilter); - when(eventQueryCriteria.dataFilters()).thenReturn(eventDataFilters); - - EventFilter eventFilter = EventFilter.builder() - .uid("test_tracked_entity_attribute_uid") - .program("program_uid") - .name("name") - .displayName("display_name") - .eventQueryCriteria(eventQueryCriteria) - .build(); - - when(eventFilterStore.updateOrInsert(any())).thenReturn(HandleAction.Insert); - - eventFilters = new ArrayList<>(); - eventFilters.add(eventFilter); - } - - @Test - public void extend_identifiable_handler_impl() { - EventFilterHandler genericHandler = new EventFilterHandler(eventFilterStore, eventDataFilterHandler); - } - - @Test - public void handle_event_filters() { - eventFilterHandler.handleMany(eventFilters); - verify(eventDataFilterHandler).handleMany(eq(eventDataFilters), any()); - } -} \ No newline at end of file diff --git a/core/src/test/java/org/hisp/dhis/android/core/event/internal/EventFilterHandlerShould.kt b/core/src/test/java/org/hisp/dhis/android/core/event/internal/EventFilterHandlerShould.kt new file mode 100644 index 0000000000..8d8162a616 --- /dev/null +++ b/core/src/test/java/org/hisp/dhis/android/core/event/internal/EventFilterHandlerShould.kt @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2004-2022, 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.android.core.event.internal + +import com.nhaarman.mockitokotlin2.any +import com.nhaarman.mockitokotlin2.doReturn +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.verify +import com.nhaarman.mockitokotlin2.whenever +import org.hisp.dhis.android.core.arch.handlers.internal.HandleAction +import org.hisp.dhis.android.core.event.EventDataFilter +import org.hisp.dhis.android.core.event.EventFilter +import org.hisp.dhis.android.core.event.EventQueryCriteria +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 + +@RunWith(JUnit4::class) +class EventFilterHandlerShould { + private val eventFilterStore: EventFilterStore = mock() + private val eventDataFilterHandler: EventDataFilterHandler = mock() + private val eventQueryCriteria: EventQueryCriteria = mock() + private val eventDataFilter: EventDataFilter = mock() + + // object to test + private lateinit var eventFilters: MutableList + private lateinit var eventDataFilters: List + private lateinit var eventFilterHandler: EventFilterHandler + + @Before + fun setUp() { + eventFilterHandler = EventFilterHandler( + eventFilterStore, + eventDataFilterHandler, + ) + + eventDataFilters = listOf(eventDataFilter) + whenever(eventQueryCriteria.dataFilters()).thenReturn(eventDataFilters) + + val eventFilter = EventFilter.builder() + .uid("test_tracked_entity_attribute_uid") + .program("program_uid") + .name("name") + .displayName("display_name") + .eventQueryCriteria(eventQueryCriteria) + .build() + + whenever(eventFilterStore.updateOrInsert(any())).doReturn(HandleAction.Insert) + + eventFilters = mutableListOf(eventFilter) + } + + @Test + @Suppress("UnusedPrivateMember") + fun extend_identifiable_handler_impl() { + val genericHandler = EventFilterHandler( + eventFilterStore, + eventDataFilterHandler, + ) + } + + @Test + fun handle_event_filters() { + eventFilterHandler.handleMany(eventFilters) + verify(eventDataFilterHandler).handleMany(eventDataFilters.filterNotNull()) + } +}