From d53317d0c6c3d7dacd0816871d0f4b7d324ab7b0 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 14 Jul 2025 12:39:49 +0300 Subject: [PATCH 1/5] =?UTF-8?q?[MS-1065]=20Adding=20'metadata'=20field=20t?= =?UTF-8?q?o=20the=20ConfirmationCalloutEventV3=CB=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecases/ReportActionRequestEventsUseCase.kt | 8 +++++++- .../event/remote/models/callout/ApiCalloutPayload.kt | 1 + .../remote/models/callout/ApiConfirmationCallout.kt | 1 + .../infra/eventsync/event/EventValidationUtils.kt | 3 ++- .../infra/events/sampledata/EventFactoryUtils.kt | 9 +++++---- .../domain/models/callout/ConfirmationCalloutEvent.kt | 11 ++++++++++- .../events/event/domain/models/EventPayloadTest.kt | 8 +++++++- .../models/callout/ConfirmationCalloutEventTest.kt | 10 +++++++++- 8 files changed, 42 insertions(+), 9 deletions(-) diff --git a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ReportActionRequestEventsUseCase.kt b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ReportActionRequestEventsUseCase.kt index a3f38ea4fe..3efd93d8f5 100644 --- a/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ReportActionRequestEventsUseCase.kt +++ b/feature/login-check/src/main/java/com/simprints/feature/logincheck/usecases/ReportActionRequestEventsUseCase.kt @@ -62,7 +62,13 @@ internal class ReportActionRequestEventsUseCase @Inject constructor( verifyGuid, metadata, ) - is ActionRequest.ConfirmIdentityActionRequest -> ConfirmationCalloutEvent(startTime, projectId, selectedGuid, sessionId) + is ActionRequest.ConfirmIdentityActionRequest -> ConfirmationCalloutEvent( + createdAt = startTime, + projectId = projectId, + selectedGuid = selectedGuid, + sessionId = sessionId, + metadata = metadata + ) is ActionRequest.EnrolLastBiometricActionRequest -> EnrolmentLastBiometricsCalloutEvent( startTime, projectId, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutPayload.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutPayload.kt index 9013cac615..075f620bbd 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutPayload.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutPayload.kt @@ -55,6 +55,7 @@ internal data class ApiCalloutPayload( ApiConfirmationCallout( domainPayload.selectedGuid, domainPayload.sessionId, + domainPayload.metadata, ), ) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiConfirmationCallout.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiConfirmationCallout.kt index 1a48adc5c4..1afac13487 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiConfirmationCallout.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiConfirmationCallout.kt @@ -6,4 +6,5 @@ import androidx.annotation.Keep internal data class ApiConfirmationCallout( val selectedGuid: String, val sessionId: String, + val metadata: String, ) : ApiCallout(ApiCalloutType.Confirmation) diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/EventValidationUtils.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/EventValidationUtils.kt index 06976423a6..c4f750271c 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/EventValidationUtils.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/EventValidationUtils.kt @@ -203,7 +203,8 @@ fun verifyCalloutConfirmationApiModel(json: JSONObject) { assertThat(json.getString("type")).isEqualTo("Confirmation") assertThat(json.getString("selectedGuid")).isNotNull() assertThat(json.getString("sessionId")).isNotNull() - assertThat(json.length()).isEqualTo(3) + assertThat(json.getString("metadata")).isNotNull() + assertThat(json.length()).isEqualTo(4) } fun validateAlertScreenEventApiModel(json: JSONObject) { diff --git a/infra/events/src/debug/java/com/simprints/infra/events/sampledata/EventFactoryUtils.kt b/infra/events/src/debug/java/com/simprints/infra/events/sampledata/EventFactoryUtils.kt index 754919954a..99522f4f40 100644 --- a/infra/events/src/debug/java/com/simprints/infra/events/sampledata/EventFactoryUtils.kt +++ b/infra/events/src/debug/java/com/simprints/infra/events/sampledata/EventFactoryUtils.kt @@ -181,10 +181,11 @@ fun createVerificationCallbackEventV2() = VerificationCallbackEvent( ) fun createConfirmationCalloutEvent() = ConfirmationCalloutEvent( - CREATED_AT, - DEFAULT_PROJECT_ID, - GUID1, - GUID2, + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + selectedGuid = GUID1, + sessionId = GUID2, + metadata = DEFAULT_METADATA, ) fun createEnrolmentCalloutEvent(projectId: String = DEFAULT_PROJECT_ID) = EnrolmentCalloutEvent( diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEvent.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEvent.kt index fbe897a2bf..67aa4939e3 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEvent.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEvent.kt @@ -23,9 +23,17 @@ data class ConfirmationCalloutEvent( projectId: String, selectedGuid: String, sessionId: String, + metadata: String, ) : this( UUID.randomUUID().toString(), - ConfirmationCalloutPayload(createdAt, EVENT_VERSION, projectId, selectedGuid, sessionId), + ConfirmationCalloutPayload( + createdAt = createdAt, + eventVersion = EVENT_VERSION, + projectId = projectId, + selectedGuid = selectedGuid, + sessionId = sessionId, + metadata = metadata + ), CALLOUT_CONFIRMATION, ) @@ -40,6 +48,7 @@ data class ConfirmationCalloutEvent( val projectId: String, val selectedGuid: String, val sessionId: String, + val metadata: String, override val endedAt: Timestamp? = null, override val type: EventType = CALLOUT_CONFIRMATION, ) : EventPayload() { diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/EventPayloadTest.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/EventPayloadTest.kt index 118b4e440f..4197e77cb4 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/EventPayloadTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/EventPayloadTest.kt @@ -83,7 +83,13 @@ class EventPayloadTest { createdAt = CREATED_AT, score = CallbackComparisonScore(GUID1, 1, AppMatchConfidence.NONE), ), - ConfirmationCalloutEvent(CREATED_AT, DEFAULT_PROJECT_ID, GUID1, GUID2), + ConfirmationCalloutEvent( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + selectedGuid = GUID1, + sessionId = GUID2, + metadata = DEFAULT_METADATA + ), EnrolmentCalloutEvent( createdAt = CREATED_AT, projectId = DEFAULT_PROJECT_ID, diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventTest.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventTest.kt index 1ff0722a31..54da8ff5d5 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventTest.kt @@ -5,6 +5,7 @@ import com.google.common.truth.Truth.assertThat import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_CONFIRMATION import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEvent.Companion.EVENT_VERSION import com.simprints.infra.events.sampledata.SampleDefaults.CREATED_AT +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_METADATA import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_PROJECT_ID import com.simprints.infra.events.sampledata.SampleDefaults.GUID1 import com.simprints.infra.events.sampledata.SampleDefaults.GUID2 @@ -14,7 +15,13 @@ import org.junit.Test class ConfirmationCalloutEventTest { @Test fun create_ConfirmationCalloutEvent() { - val event = ConfirmationCalloutEvent(CREATED_AT, DEFAULT_PROJECT_ID, GUID1, GUID2) + val event = ConfirmationCalloutEvent( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + selectedGuid = GUID1, + sessionId = GUID2, + metadata = DEFAULT_METADATA + ) assertThat(event.id).isNotNull() assertThat(event.type).isEqualTo(CALLOUT_CONFIRMATION) @@ -25,6 +32,7 @@ class ConfirmationCalloutEventTest { assertThat(projectId).isEqualTo(DEFAULT_PROJECT_ID) assertThat(selectedGuid).isEqualTo(GUID1) assertThat(sessionId).isEqualTo(GUID2) + assertThat(metadata).isEqualTo(DEFAULT_METADATA) } } } From c25fd06ec376b1d910e4feabec1abcd408f1d8ee Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 21 Jul 2025 17:05:05 +0300 Subject: [PATCH 2/5] [MS-1076] Changing metadata field from `HashMap` to a generic `Map` type. Adding `@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)` annotation to the metadata field to prevent Jackson from treating the `metadata` field as polymorphic. --- .../records/repository/remote/models/face/ApiFaceReference.kt | 2 ++ .../remote/models/fingerprint/ApiFingerprintReference.kt | 2 ++ .../models/subject/biometricref/face/ApiFaceReference.kt | 4 +++- .../biometricref/fingerprint/ApiFingerprintReference.kt | 4 +++- .../events/event/domain/models/subject/BiometricReference.kt | 4 ++-- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt index 6eb6e5f811..ba8e7614b5 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt @@ -1,6 +1,7 @@ package com.simprints.infra.enrolment.records.repository.remote.models.face import androidx.annotation.Keep +import com.fasterxml.jackson.annotation.JsonTypeInfo import com.simprints.core.domain.face.FaceSample import com.simprints.core.tools.utils.EncodingUtils import com.simprints.infra.enrolment.records.repository.remote.models.ApiBiometricReference @@ -10,6 +11,7 @@ internal data class ApiFaceReference( val id: String, val templates: List, val format: String, + @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) val metadata: HashMap? = null, ) : ApiBiometricReference(ApiBiometricReferenceType.FaceReference) diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt index 434f1d9be3..20c3a164db 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt @@ -1,6 +1,7 @@ package com.simprints.infra.enrolment.records.repository.remote.models.fingerprint import androidx.annotation.Keep +import com.fasterxml.jackson.annotation.JsonTypeInfo import com.simprints.core.domain.fingerprint.FingerprintSample import com.simprints.core.tools.utils.EncodingUtils import com.simprints.infra.enrolment.records.repository.remote.models.ApiBiometricReference @@ -10,6 +11,7 @@ internal data class ApiFingerprintReference( val id: String, val templates: List, val format: String, + @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) val metadata: HashMap? = null, ) : ApiBiometricReference(ApiBiometricReferenceType.FingerprintReference) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt index f932252a9e..28c2a9ae25 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt @@ -1,6 +1,7 @@ package com.simprints.infra.eventsync.event.remote.models.subject.biometricref.face import androidx.annotation.Keep +import com.fasterxml.jackson.annotation.JsonTypeInfo import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReference import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReferenceType import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReferenceType.FaceReference @@ -11,7 +12,8 @@ internal data class ApiFaceReference( override val id: String = UUID.randomUUID().toString(), val templates: List, val format: String, - val metadata: HashMap? = null, + @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) + val metadata: Map? = null, ) : ApiBiometricReference { override val type: ApiBiometricReferenceType = FaceReference } diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt index d439d03da3..a587b1f71f 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt @@ -1,6 +1,7 @@ package com.simprints.infra.eventsync.event.remote.models.subject.biometricref.fingerprint import androidx.annotation.Keep +import com.fasterxml.jackson.annotation.JsonTypeInfo import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReference import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReferenceType import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReferenceType.FingerprintReference @@ -11,7 +12,8 @@ internal data class ApiFingerprintReference( override val id: String = UUID.randomUUID().toString(), val templates: List, val format: String, - val metadata: HashMap? = null, + @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) + val metadata: Map? = null, ) : ApiBiometricReference { override val type: ApiBiometricReferenceType = FingerprintReference } diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/BiometricReference.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/BiometricReference.kt index fe5e6b0b09..84f854ec8c 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/BiometricReference.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/BiometricReference.kt @@ -21,14 +21,14 @@ data class FaceReference( override val id: String, val templates: List, val format: String, - val metadata: HashMap? = null, + val metadata: Map? = null, ) : BiometricReference(id, BiometricReferenceType.FACE_REFERENCE) data class FingerprintReference( override val id: String, val templates: List, val format: String, - val metadata: HashMap? = null, + val metadata: Map? = null, ) : BiometricReference(id, BiometricReferenceType.FINGERPRINT_REFERENCE) enum class BiometricReferenceType { From 4c36e2bb5cf0e50071e3a70f8a0481a0ccd64721 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 21 Jul 2025 17:20:30 +0300 Subject: [PATCH 3/5] [MS-1076] Adding descriptive comments for future reference --- .../records/repository/remote/models/face/ApiFaceReference.kt | 3 +++ .../remote/models/fingerprint/ApiFingerprintReference.kt | 3 +++ .../models/subject/biometricref/ApiBiometricReference.kt | 3 +++ .../models/subject/biometricref/face/ApiFaceReference.kt | 3 +++ .../biometricref/fingerprint/ApiFingerprintReference.kt | 3 +++ 5 files changed, 15 insertions(+) diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt index ba8e7614b5..ce94c75ff5 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt @@ -11,6 +11,9 @@ internal data class ApiFaceReference( val id: String, val templates: List, val format: String, + // [MS-1076] The parent 'ApiBiometricReference' class should have its JsonSubTypes annotation updated to + // @JsonSubTypes.Type([...], looseHandling = true) once we update to SDK => 25 and Jackson => 2.16.0. + // Then, this annotation should be removed @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) val metadata: HashMap? = null, ) : ApiBiometricReference(ApiBiometricReferenceType.FaceReference) diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt index 20c3a164db..0e931e5926 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt @@ -11,6 +11,9 @@ internal data class ApiFingerprintReference( val id: String, val templates: List, val format: String, + // [MS-1076] The parent 'ApiBiometricReference' class should have its JsonSubTypes annotation updated to + // @JsonSubTypes.Type([...], looseHandling = true) once we update to SDK => 25 and Jackson => 2.16.0. + // Then, this annotation should be removed @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) val metadata: HashMap? = null, ) : ApiBiometricReference(ApiBiometricReferenceType.FingerprintReference) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt index be36c02770..b125f90556 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt @@ -18,6 +18,9 @@ private const val FINGERPRINT_REFERENCE_KEY = "FingerprintReference" @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type", visible = true) @JsonSubTypes( + // [MS-1076] Annotations should have 'looseHandling' parameter passed to it to allow loose type handling of the nested fields (metadata) + // @JsonSubTypes.Type([...], looseHandling = true) once we update to SDK => 25 and Jackson => 2.16.0. + // Ref: https://github.com/FasterXML/jackson-databind/issues/3877#issuecomment-1508508854 JsonSubTypes.Type(value = ApiFaceReference::class, name = FACE_REFERENCE_KEY), JsonSubTypes.Type(value = ApiFingerprintReference::class, name = FINGERPRINT_REFERENCE_KEY), ) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt index 28c2a9ae25..f06d2bc038 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt @@ -12,6 +12,9 @@ internal data class ApiFaceReference( override val id: String = UUID.randomUUID().toString(), val templates: List, val format: String, + // [MS-1076] The parent 'ApiBiometricReference' class should have its JsonSubTypes annotation updated to + // @JsonSubTypes.Type([...], looseHandling = true) once we update to SDK => 25 and Jackson => 2.16.0. + // Then, this annotation should be removed @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) val metadata: Map? = null, ) : ApiBiometricReference { diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt index a587b1f71f..7f4d6c3b03 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt @@ -12,6 +12,9 @@ internal data class ApiFingerprintReference( override val id: String = UUID.randomUUID().toString(), val templates: List, val format: String, + // [MS-1076] The parent 'ApiBiometricReference' class should have its JsonSubTypes annotation updated to + // @JsonSubTypes.Type([...], looseHandling = true) once we update to SDK => 25 and Jackson => 2.16.0. + // Then, this annotation should be removed @JsonTypeInfo(use = JsonTypeInfo.Id.NONE) val metadata: Map? = null, ) : ApiBiometricReference { From c76f49ebf394a3f706c62fd9b6ee5aa0b6fdf9fa Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 21 Jul 2025 17:49:32 +0300 Subject: [PATCH 4/5] [MS-1076] Marking API data classes with @ExcludedFromGeneratedTestCoverageReports annotation to exclude from Sonar test coverage --- .../records/repository/remote/models/face/ApiFaceReference.kt | 2 ++ .../remote/models/fingerprint/ApiFingerprintReference.kt | 2 ++ .../remote/models/subject/biometricref/ApiBiometricReference.kt | 2 ++ .../remote/models/subject/biometricref/face/ApiFaceReference.kt | 2 ++ .../subject/biometricref/fingerprint/ApiFingerprintReference.kt | 2 ++ 5 files changed, 10 insertions(+) diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt index ce94c75ff5..41d0ac2807 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/face/ApiFaceReference.kt @@ -2,11 +2,13 @@ package com.simprints.infra.enrolment.records.repository.remote.models.face import androidx.annotation.Keep import com.fasterxml.jackson.annotation.JsonTypeInfo +import com.simprints.core.ExcludedFromGeneratedTestCoverageReports import com.simprints.core.domain.face.FaceSample import com.simprints.core.tools.utils.EncodingUtils import com.simprints.infra.enrolment.records.repository.remote.models.ApiBiometricReference @Keep +@ExcludedFromGeneratedTestCoverageReports("API model") internal data class ApiFaceReference( val id: String, val templates: List, diff --git a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt index 0e931e5926..f301bffe29 100644 --- a/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt +++ b/infra/enrolment-records/repository/src/main/java/com/simprints/infra/enrolment/records/repository/remote/models/fingerprint/ApiFingerprintReference.kt @@ -2,11 +2,13 @@ package com.simprints.infra.enrolment.records.repository.remote.models.fingerpri import androidx.annotation.Keep import com.fasterxml.jackson.annotation.JsonTypeInfo +import com.simprints.core.ExcludedFromGeneratedTestCoverageReports import com.simprints.core.domain.fingerprint.FingerprintSample import com.simprints.core.tools.utils.EncodingUtils import com.simprints.infra.enrolment.records.repository.remote.models.ApiBiometricReference @Keep +@ExcludedFromGeneratedTestCoverageReports("API model") internal data class ApiFingerprintReference( val id: String, val templates: List, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt index b125f90556..46e5ba36a6 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/ApiBiometricReference.kt @@ -3,6 +3,7 @@ package com.simprints.infra.eventsync.event.remote.models.subject.biometricref import androidx.annotation.Keep import com.fasterxml.jackson.annotation.JsonSubTypes import com.fasterxml.jackson.annotation.JsonTypeInfo +import com.simprints.core.ExcludedFromGeneratedTestCoverageReports import com.simprints.core.domain.fingerprint.IFingerIdentifier import com.simprints.infra.events.event.domain.models.subject.FaceTemplate import com.simprints.infra.events.event.domain.models.subject.FingerprintTemplate @@ -16,6 +17,7 @@ import com.simprints.infra.events.event.domain.models.subject.FingerprintReferen private const val FACE_REFERENCE_KEY = "FaceReference" private const val FINGERPRINT_REFERENCE_KEY = "FingerprintReference" +@ExcludedFromGeneratedTestCoverageReports("API model") @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type", visible = true) @JsonSubTypes( // [MS-1076] Annotations should have 'looseHandling' parameter passed to it to allow loose type handling of the nested fields (metadata) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt index f06d2bc038..7ffb71250e 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/face/ApiFaceReference.kt @@ -2,12 +2,14 @@ package com.simprints.infra.eventsync.event.remote.models.subject.biometricref.f import androidx.annotation.Keep import com.fasterxml.jackson.annotation.JsonTypeInfo +import com.simprints.core.ExcludedFromGeneratedTestCoverageReports import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReference import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReferenceType import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReferenceType.FaceReference import java.util.UUID @Keep +@ExcludedFromGeneratedTestCoverageReports("API model") internal data class ApiFaceReference( override val id: String = UUID.randomUUID().toString(), val templates: List, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt index 7f4d6c3b03..58fb8243ac 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/subject/biometricref/fingerprint/ApiFingerprintReference.kt @@ -2,12 +2,14 @@ package com.simprints.infra.eventsync.event.remote.models.subject.biometricref.f import androidx.annotation.Keep import com.fasterxml.jackson.annotation.JsonTypeInfo +import com.simprints.core.ExcludedFromGeneratedTestCoverageReports import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReference import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReferenceType import com.simprints.infra.eventsync.event.remote.models.subject.biometricref.ApiBiometricReferenceType.FingerprintReference import java.util.UUID @Keep +@ExcludedFromGeneratedTestCoverageReports("API model") internal data class ApiFingerprintReference( override val id: String = UUID.randomUUID().toString(), val templates: List, From 0f98feaabd86bc987916ccbb575752cf279e6637 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 21 Jul 2025 20:13:30 +0300 Subject: [PATCH 5/5] [MS-1076] Marking domain model classes with @ExcludedFromGeneratedTestCoverageReports annotation to exclude from Sonar test coverage --- .../events/event/domain/models/subject/BiometricReference.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/BiometricReference.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/BiometricReference.kt index 84f854ec8c..c8eed959ce 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/BiometricReference.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/subject/BiometricReference.kt @@ -3,9 +3,11 @@ package com.simprints.infra.events.event.domain.models.subject import androidx.annotation.Keep import com.fasterxml.jackson.annotation.JsonSubTypes import com.fasterxml.jackson.annotation.JsonTypeInfo +import com.simprints.core.ExcludedFromGeneratedTestCoverageReports import com.simprints.infra.events.event.domain.models.subject.BiometricReferenceType.Companion.FACE_REFERENCE_KEY import com.simprints.infra.events.event.domain.models.subject.BiometricReferenceType.Companion.FINGERPRINT_REFERENCE_KEY +@ExcludedFromGeneratedTestCoverageReports("Domain model") @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type") @JsonSubTypes( JsonSubTypes.Type(value = FaceReference::class, name = FACE_REFERENCE_KEY), @@ -17,6 +19,7 @@ sealed class BiometricReference( val type: BiometricReferenceType, ) +@ExcludedFromGeneratedTestCoverageReports("Domain model") data class FaceReference( override val id: String, val templates: List, @@ -24,6 +27,7 @@ data class FaceReference( val metadata: Map? = null, ) : BiometricReference(id, BiometricReferenceType.FACE_REFERENCE) +@ExcludedFromGeneratedTestCoverageReports("Domain model") data class FingerprintReference( override val id: String, val templates: List,