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..55411098f5 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 @@ -5,11 +5,12 @@ import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.utils.SimNetworkUtils import com.simprints.infra.events.event.domain.models.ConnectivitySnapshotEvent import com.simprints.infra.events.event.domain.models.SuspiciousIntentEvent -import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEvent +import com.simprints.infra.events.event.domain.models.callout.BiometricDataSource +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV3 import com.simprints.infra.events.session.SessionEventRepository import com.simprints.infra.orchestration.data.ActionRequest import com.simprints.infra.recent.user.activity.RecentUserActivityManager @@ -52,18 +53,33 @@ internal class ReportActionRequestEventsUseCase @Inject constructor( val startTime = timeHelper.now() val event = with(request) { when (this) { - is ActionRequest.EnrolActionRequest -> EnrolmentCalloutEvent(startTime, projectId, userId, moduleId, metadata) - is ActionRequest.IdentifyActionRequest -> IdentificationCalloutEvent(startTime, projectId, userId, moduleId, metadata) - is ActionRequest.VerifyActionRequest -> VerificationCalloutEvent( + is ActionRequest.EnrolActionRequest -> EnrolmentCalloutEventV3( + startTime, + projectId, + userId, + moduleId, + metadata, + BiometricDataSource.fromString(biometricDataSource), + ) + is ActionRequest.IdentifyActionRequest -> IdentificationCalloutEventV3( + startTime, + projectId, + userId, + moduleId, + metadata, + BiometricDataSource.fromString(biometricDataSource), + ) + is ActionRequest.VerifyActionRequest -> VerificationCalloutEventV3( startTime, projectId, userId, moduleId, verifyGuid, metadata, + BiometricDataSource.fromString(biometricDataSource), ) - is ActionRequest.ConfirmIdentityActionRequest -> ConfirmationCalloutEvent(startTime, projectId, selectedGuid, sessionId) - is ActionRequest.EnrolLastBiometricActionRequest -> EnrolmentLastBiometricsCalloutEvent( + is ActionRequest.ConfirmIdentityActionRequest -> ConfirmationCalloutEventV3(startTime, projectId, selectedGuid, sessionId) + is ActionRequest.EnrolLastBiometricActionRequest -> EnrolmentLastBiometricsCalloutEventV3( startTime, projectId, userId, diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/LoginCheckViewModelTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/LoginCheckViewModelTest.kt index 729ba63dad..24f91f5d58 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/LoginCheckViewModelTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/LoginCheckViewModelTest.kt @@ -116,7 +116,7 @@ internal class LoginCheckViewModelTest { @Test fun `Reports action event and extracts analytics for valid action`() = runTest { - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) coVerify { reportActionRequestEventsUseCase.invoke(any()) @@ -128,7 +128,7 @@ internal class LoginCheckViewModelTest { fun `Triggers alert if mismatched project IDs`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.MISMATCHED_PROJECT_ID - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.showAlert .test() @@ -139,7 +139,7 @@ internal class LoginCheckViewModelTest { fun `Returns error response if not signed in and followup action`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN - viewModel.validateSignInAndProceed(ActionFactory.getFolowUpRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getConfirmationRequest()) viewModel.returnLoginNotComplete.test().assertHasValue() } @@ -148,8 +148,8 @@ internal class LoginCheckViewModelTest { fun `Returns error response if there are several login attempts`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.returnLoginNotComplete.test().assertHasValue() } @@ -158,7 +158,7 @@ internal class LoginCheckViewModelTest { fun `Triggers login flow if not signed in and flow action`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) coVerify { addAuthorizationEventUseCase.invoke(any(), eq(false)) @@ -166,14 +166,14 @@ internal class LoginCheckViewModelTest { } viewModel.showLoginFlow .test() - .assertValue { it.peekContent() == ActionFactory.getFlowRequest() } + .assertValue { it.peekContent() == ActionFactory.getIdentifyRequest() } } @Test fun `Returns error response if login attempt not complete`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.handleLoginResult(LoginResult(false, LoginError.LoginNotCompleted)) viewModel.returnLoginNotComplete.test().assertHasValue() @@ -194,7 +194,7 @@ internal class LoginCheckViewModelTest { fun `Triggers alert if login attempt failed with integrity error`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.handleLoginResult(LoginResult(false, LoginError.IntegrityServiceError)) viewModel.showAlert @@ -206,7 +206,7 @@ internal class LoginCheckViewModelTest { fun `Triggers alert if login attempt failed with missing play services`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.handleLoginResult(LoginResult(false, LoginError.MissingPlayServices)) viewModel.showAlert @@ -218,7 +218,7 @@ internal class LoginCheckViewModelTest { fun `Triggers alert if login attempt failed with outdated play services`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.handleLoginResult(LoginResult(false, LoginError.OutdatedPlayServices)) viewModel.showAlert @@ -230,7 +230,7 @@ internal class LoginCheckViewModelTest { fun `Triggers alert if login attempt failed with missing or outdated play services`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.handleLoginResult( LoginResult( false, @@ -247,7 +247,7 @@ internal class LoginCheckViewModelTest { fun `Triggers alert if login attempt failed with unknown error`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.handleLoginResult(LoginResult(false, LoginError.Unknown)) viewModel.showAlert @@ -259,7 +259,7 @@ internal class LoginCheckViewModelTest { fun `Correctly handles successful login attempt`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.NOT_SIGNED_IN - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.handleLoginResult(LoginResult(true, null)) coVerify { configManager.getProject(any()) } @@ -269,7 +269,7 @@ internal class LoginCheckViewModelTest { fun `Correctly handles signed in users`() = runTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) coVerify { configManager.getProject(any()) } } @@ -279,7 +279,7 @@ internal class LoginCheckViewModelTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN coEvery { configManager.getProject(any()).state } returns ProjectState.PROJECT_PAUSED - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.showAlert .test() @@ -291,7 +291,7 @@ internal class LoginCheckViewModelTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN coEvery { configManager.getProject(any()).state } returns ProjectState.PROJECT_ENDING - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.showAlert .test() @@ -303,11 +303,11 @@ internal class LoginCheckViewModelTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN coEvery { configManager.getProject(any()).state } returns ProjectState.PROJECT_ENDED - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) viewModel.showLoginFlow .test() - .assertValue { it.peekContent() == ActionFactory.getFlowRequest() } + .assertValue { it.peekContent() == ActionFactory.getIdentifyRequest() } } @Test @@ -315,7 +315,7 @@ internal class LoginCheckViewModelTest { coEvery { isUserSignedInUseCase.invoke(any()) } returns IsUserSignedInUseCase.SignedInState.SIGNED_IN coEvery { configManager.getProject(any()).state } returns ProjectState.RUNNING - viewModel.validateSignInAndProceed(ActionFactory.getFlowRequest()) + viewModel.validateSignInAndProceed(ActionFactory.getIdentifyRequest()) coVerify { updateProjectStateUseCase.invoke() @@ -329,6 +329,6 @@ internal class LoginCheckViewModelTest { viewModel.proceedWithAction .test() - .assertValue { it.peekContent() == ActionFactory.getFlowRequest() } + .assertValue { it.peekContent() == ActionFactory.getIdentifyRequest() } } } diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ActionFactory.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ActionFactory.kt index 7ad15a5d9e..bd38747545 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ActionFactory.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ActionFactory.kt @@ -6,7 +6,7 @@ import com.simprints.infra.orchestration.data.ActionRequest import com.simprints.infra.orchestration.data.ActionRequestIdentifier internal object ActionFactory { - fun getFlowRequest(extras: Map = emptyMap()) = ActionRequest.EnrolActionRequest( + fun getEnrolRequest(extras: Map = emptyMap()) = ActionRequest.EnrolActionRequest( actionIdentifier = ActionRequestIdentifier( packageName = "com.simprints.id", actionName = ActionConstants.ACTION_ENROL, @@ -22,7 +22,56 @@ internal object ActionFactory { metadata = "", ) - fun getFolowUpRequest() = ActionRequest.ConfirmIdentityActionRequest( + fun getIdentifyRequest(extras: Map = emptyMap()) = ActionRequest.IdentifyActionRequest( + actionIdentifier = ActionRequestIdentifier( + packageName = "com.simprints.id", + actionName = ActionConstants.ACTION_IDENTIFY, + callerPackageName = "", + contractVersion = 1, + timestampMs = 0L, + ), + projectId = MOCK_PROJECT_ID, + userId = MOCK_USER_ID, + moduleId = MOCK_MODULE_ID, + unknownExtras = extras, + biometricDataSource = MOCK_BIOMETRIC_DATA_SOURCE, + metadata = "", + ) + + fun getVerifyRequest(extras: Map = emptyMap()) = ActionRequest.VerifyActionRequest( + actionIdentifier = ActionRequestIdentifier( + packageName = "com.simprints.id", + actionName = ActionConstants.ACTION_VERIFY, + callerPackageName = "", + contractVersion = 1, + timestampMs = 0L, + ), + projectId = MOCK_PROJECT_ID, + userId = MOCK_USER_ID, + moduleId = MOCK_MODULE_ID, + unknownExtras = extras, + biometricDataSource = MOCK_BIOMETRIC_DATA_SOURCE, + metadata = "", + verifyGuid = MOCK_GUID + ) + + fun getEnrolLastRequest() = ActionRequest.EnrolLastBiometricActionRequest( + actionIdentifier = ActionRequestIdentifier( + packageName = "com.simprints.id", + actionName = ActionConstants.ACTION_ENROL_LAST_BIOMETRICS, + callerPackageName = "", + contractVersion = 1, + timestampMs = 0L, + ), + projectId = MOCK_PROJECT_ID, + userId = MOCK_USER_ID, + moduleId = MOCK_MODULE_ID, + sessionId = "sessionId", + metadata = "", + unknownExtras = emptyMap(), + ) + + fun getConfirmationRequest() = ActionRequest.ConfirmIdentityActionRequest( actionIdentifier = ActionRequestIdentifier( packageName = "com.simprints.id", actionName = ActionConstants.ACTION_CONFIRM_IDENTITY, @@ -42,4 +91,5 @@ internal object ActionFactory { val MOCK_MODULE_ID = "moduleId".asTokenizableRaw() const val MOCK_PROJECT_ID = "projectId" private const val MOCK_BIOMETRIC_DATA_SOURCE = "" + private const val MOCK_GUID = "123e4567-e89b-12d3-a456-426614174000" } diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/AddAuthorizationEventUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/AddAuthorizationEventUseCaseTest.kt index 8504d0bb97..68b57ea9b1 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/AddAuthorizationEventUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/AddAuthorizationEventUseCaseTest.kt @@ -35,7 +35,7 @@ class AddAuthorizationEventUseCaseTest { @Test fun `Adds not authorised event`() = runTest { // When - useCase(ActionFactory.getFlowRequest(), false) + useCase(ActionFactory.getIdentifyRequest(), false) // Then coVerify { coreEventRepository.addOrUpdateEvent( @@ -52,7 +52,7 @@ class AddAuthorizationEventUseCaseTest { @Test fun `Adds authorised event`() = runTest { // When - useCase(ActionFactory.getFlowRequest(), true) + useCase(ActionFactory.getIdentifyRequest(), true) // Then coVerify { coreEventRepository.addOrUpdateEvent( diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt index acc4adbd02..c7cd2aa3a3 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractCrashKeysUseCaseTest.kt @@ -53,7 +53,7 @@ class ExtractCrashKeysUseCaseTest { } every { authStore.signedInProjectId } returns "projectId" - useCase(ActionFactory.getFlowRequest()) + useCase(ActionFactory.getIdentifyRequest()) verify { Simber.setUserProperty(any(), "projectId") diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractParametersForAnalyticsUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractParametersForAnalyticsUseCaseTest.kt index 33fe893e44..469957f0ad 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractParametersForAnalyticsUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ExtractParametersForAnalyticsUseCaseTest.kt @@ -29,7 +29,7 @@ internal class ExtractParametersForAnalyticsUseCaseTest { @Test fun `Logs analytics keys in flow actions`() = runTest { - useCase(ActionFactory.getFlowRequest()) + useCase(ActionFactory.getIdentifyRequest()) verify { Simber.setUserProperty(any(), ActionFactory.MOCK_USER_ID.toString()) @@ -41,7 +41,7 @@ internal class ExtractParametersForAnalyticsUseCaseTest { @Test fun `Does not log analytics keys in follow up actions`() = runTest { - useCase(ActionFactory.getFolowUpRequest()) + useCase(ActionFactory.getConfirmationRequest()) verify(exactly = 0) { Simber.setUserProperty(any(), any()) diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/IsUserSignedInUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/IsUserSignedInUseCaseTest.kt index 836504b13b..e88f5589de 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/IsUserSignedInUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/IsUserSignedInUseCaseTest.kt @@ -19,7 +19,7 @@ internal class IsUserSignedInUseCaseTest { private lateinit var useCase: IsUserSignedInUseCase - private val request = ActionFactory.getFlowRequest() + private val request = ActionFactory.getIdentifyRequest() @Before fun setUp() { diff --git a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ReportActionRequestEventsUseCaseTest.kt b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ReportActionRequestEventsUseCaseTest.kt index 18b495d791..e2e6ddd869 100644 --- a/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ReportActionRequestEventsUseCaseTest.kt +++ b/feature/login-check/src/test/java/com/simprints/feature/logincheck/usecases/ReportActionRequestEventsUseCaseTest.kt @@ -5,7 +5,11 @@ import com.simprints.core.tools.time.TimeHelper import com.simprints.core.tools.utils.SimNetworkUtils import com.simprints.infra.events.event.domain.models.ConnectivitySnapshotEvent import com.simprints.infra.events.event.domain.models.SuspiciousIntentEvent -import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEvent +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV3 import com.simprints.infra.events.session.SessionEventRepository import com.simprints.infra.recent.user.activity.RecentUserActivityManager import com.simprints.infra.recent.user.activity.domain.RecentUserActivity @@ -61,42 +65,65 @@ internal class ReportActionRequestEventsUseCaseTest { @Test fun `Adds event if there are unknown extras`() = runTest { // When - useCase.invoke(ActionFactory.getFlowRequest(extras = mapOf("key" to "value"))) + useCase.invoke(ActionFactory.getIdentifyRequest(extras = mapOf("key" to "value"))) // Then - coVerify { - sessionEventRepository.addOrUpdateEvent(withArg { it is SuspiciousIntentEvent }) + coVerify(exactly = 1) { + sessionEventRepository.addOrUpdateEvent(withArg { assert(it is SuspiciousIntentEvent) }) } } @Test fun `Does not add event if no extras`() = runTest { // When - useCase.invoke(ActionFactory.getFlowRequest(extras = emptyMap())) + useCase.invoke(ActionFactory.getIdentifyRequest(extras = emptyMap())) // Then - coVerify { sessionEventRepository.addOrUpdateEvent(withArg { it !is SuspiciousIntentEvent }) } + coVerify(exactly = 0) { + sessionEventRepository.addOrUpdateEvent(withArg { assert(it is SuspiciousIntentEvent) }) + } } @Test - fun `Adds all required events for flow action`() = runTest { - useCase(ActionFactory.getFlowRequest()) + fun `Adds all required events for enrol action`() = runTest { + useCase(ActionFactory.getEnrolRequest()) + + coVerify(exactly = 1) { sessionEventRepository.addOrUpdateEvent(withArg { assert(it is ConnectivitySnapshotEvent) }) } + coVerify(exactly = 1) { sessionEventRepository.addOrUpdateEvent(withArg { assert(it is EnrolmentCalloutEventV3) }) } + coVerify(exactly = 1) { recentUserActivityManager.updateRecentUserActivity(any()) } + } + + @Test + fun `Adds all required events for confirmation action`() = runTest { + useCase(ActionFactory.getConfirmationRequest()) + + coVerify(exactly = 0) { sessionEventRepository.addOrUpdateEvent(withArg { assert(it is ConnectivitySnapshotEvent) }) } + coVerify(exactly = 1) { sessionEventRepository.addOrUpdateEvent(withArg { assert(it is ConfirmationCalloutEventV3) }) } + coVerify(exactly = 1) { recentUserActivityManager.updateRecentUserActivity(any()) } + } - coVerify { - sessionEventRepository.addOrUpdateEvent(withArg { it is ConnectivitySnapshotEvent }) - sessionEventRepository.addOrUpdateEvent(withArg { it is EnrolmentCalloutEvent }) - recentUserActivityManager.updateRecentUserActivity(any()) + @Test + fun `Adds callout for identify action`() = runTest { + useCase(ActionFactory.getIdentifyRequest()) + + coVerify(exactly = 1) { + sessionEventRepository.addOrUpdateEvent(withArg { assert(it is IdentificationCalloutEventV3) }) } } @Test - fun `Adds all required events for follow up action`() = runTest { - useCase(ActionFactory.getFolowUpRequest()) + fun `Adds callout for verify action`() = runTest { + useCase(ActionFactory.getVerifyRequest()) - coVerify { - sessionEventRepository.addOrUpdateEvent(withArg { it is EnrolmentCalloutEvent }) - recentUserActivityManager.updateRecentUserActivity(any()) + coVerify(exactly = 1) { + sessionEventRepository.addOrUpdateEvent(withArg { assert(it is VerificationCalloutEventV3) }) } - coVerify { - sessionEventRepository.addOrUpdateEvent(withArg { it !is ConnectivitySnapshotEvent }) + } + + @Test + fun `Adds callout for enrol last action`() = runTest { + useCase(ActionFactory.getEnrolLastRequest()) + + coVerify(exactly = 1) { + sessionEventRepository.addOrUpdateEvent(withArg { assert(it is EnrolmentLastBiometricsCalloutEventV3) }) } } diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiEventPayload.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiEventPayload.kt index c226ab7e1d..f5c37dd2c5 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiEventPayload.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiEventPayload.kt @@ -26,10 +26,15 @@ import com.simprints.infra.events.event.domain.models.EventType.CALLBACK_IDENTIF import com.simprints.infra.events.event.domain.models.EventType.CALLBACK_REFUSAL import com.simprints.infra.events.event.domain.models.EventType.CALLBACK_VERIFICATION import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_CONFIRMATION +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_CONFIRMATION_V3 import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_ENROLMENT +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_ENROLMENT_V3 import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_IDENTIFICATION +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_IDENTIFICATION_V3 import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_LAST_BIOMETRICS +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_LAST_BIOMETRICS_V3 import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_VERIFICATION +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_VERIFICATION_V3 import com.simprints.infra.events.event.domain.models.EventType.CANDIDATE_READ import com.simprints.infra.events.event.domain.models.EventType.COMPLETION_CHECK import com.simprints.infra.events.event.domain.models.EventType.CONNECTIVITY_SNAPSHOT @@ -75,11 +80,16 @@ import com.simprints.infra.events.event.domain.models.callback.ErrorCallbackEven import com.simprints.infra.events.event.domain.models.callback.IdentificationCallbackEvent.IdentificationCallbackPayload import com.simprints.infra.events.event.domain.models.callback.RefusalCallbackEvent.RefusalCallbackPayload import com.simprints.infra.events.event.domain.models.callback.VerificationCallbackEvent.VerificationCallbackPayload -import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEvent.ConfirmationCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEvent.EnrolmentCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEvent.EnrolmentLastBiometricsCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEvent.IdentificationCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEvent.VerificationCalloutPayload +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV3 import com.simprints.infra.events.event.domain.models.downsync.EventDownSyncRequestEvent import com.simprints.infra.events.event.domain.models.face.FaceCaptureBiometricsEvent import com.simprints.infra.events.event.domain.models.face.FaceCaptureConfirmationEvent.FaceCaptureConfirmationPayload @@ -90,7 +100,8 @@ import com.simprints.infra.events.event.domain.models.fingerprint.FingerprintCap import com.simprints.infra.events.event.domain.models.fingerprint.FingerprintCaptureEvent import com.simprints.infra.events.event.domain.models.upsync.EventUpSyncRequestEvent import com.simprints.infra.eventsync.event.remote.models.callback.ApiCallbackPayload -import com.simprints.infra.eventsync.event.remote.models.callout.ApiCalloutPayload +import com.simprints.infra.eventsync.event.remote.models.callout.ApiCalloutPayloadV2 +import com.simprints.infra.eventsync.event.remote.models.callout.ApiCalloutPayloadV3 import com.simprints.infra.eventsync.event.remote.models.downsync.ApiEventDownSyncRequestPayload import com.simprints.infra.eventsync.event.remote.models.face.ApiFaceCaptureBiometricsPayload import com.simprints.infra.eventsync.event.remote.models.face.ApiFaceCaptureConfirmationPayload @@ -132,11 +143,16 @@ internal fun EventPayload.fromDomainToApi(): ApiEventPayload = when (this.type) FACE_CAPTURE -> ApiFaceCapturePayload(this as FaceCaptureEvent.FaceCapturePayload) FACE_CAPTURE_CONFIRMATION -> ApiFaceCaptureConfirmationPayload(this as FaceCaptureConfirmationPayload) SCANNER_FIRMWARE_UPDATE -> ApiScannerFirmwareUpdatePayload(this as ScannerFirmwareUpdatePayload) - CALLOUT_CONFIRMATION -> ApiCalloutPayload(this as ConfirmationCalloutPayload) - CALLOUT_IDENTIFICATION -> ApiCalloutPayload(this as IdentificationCalloutPayload) - CALLOUT_ENROLMENT -> ApiCalloutPayload(this as EnrolmentCalloutPayload) - CALLOUT_VERIFICATION -> ApiCalloutPayload(this as VerificationCalloutPayload) - CALLOUT_LAST_BIOMETRICS -> ApiCalloutPayload(this as EnrolmentLastBiometricsCalloutPayload) + CALLOUT_CONFIRMATION -> ApiCalloutPayloadV2(this as ConfirmationCalloutEventV2.ConfirmationCalloutPayload) + CALLOUT_CONFIRMATION_V3 -> ApiCalloutPayloadV3(this as ConfirmationCalloutEventV3.ConfirmationCalloutPayload) + CALLOUT_IDENTIFICATION -> ApiCalloutPayloadV2(this as IdentificationCalloutEventV2.IdentificationCalloutPayload) + CALLOUT_IDENTIFICATION_V3 -> ApiCalloutPayloadV3(this as IdentificationCalloutEventV3.IdentificationCalloutPayload) + CALLOUT_ENROLMENT -> ApiCalloutPayloadV2(this as EnrolmentCalloutEventV2.EnrolmentCalloutPayload) + CALLOUT_ENROLMENT_V3 -> ApiCalloutPayloadV3(this as EnrolmentCalloutEventV3.EnrolmentCalloutPayload) + CALLOUT_VERIFICATION -> ApiCalloutPayloadV2(this as VerificationCalloutEventV2.VerificationCalloutPayload) + CALLOUT_VERIFICATION_V3 -> ApiCalloutPayloadV3(this as VerificationCalloutEventV3.VerificationCalloutPayload) + CALLOUT_LAST_BIOMETRICS -> ApiCalloutPayloadV2(this as EnrolmentLastBiometricsCalloutEventV2.EnrolmentLastBiometricsCalloutPayload) + CALLOUT_LAST_BIOMETRICS_V3 -> ApiCalloutPayloadV3(this as EnrolmentLastBiometricsCalloutEventV3.EnrolmentLastBiometricsCalloutPayload) CALLBACK_IDENTIFICATION -> ApiCallbackPayload(this as IdentificationCallbackPayload) CALLBACK_ENROLMENT -> ApiCallbackPayload(this as EnrolmentCallbackPayload) CALLBACK_REFUSAL -> ApiCallbackPayload(this as RefusalCallbackPayload) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiEventPayloadType.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiEventPayloadType.kt index 40ebd9f5b2..b52998bb12 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiEventPayloadType.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/ApiEventPayloadType.kt @@ -14,10 +14,15 @@ import com.simprints.infra.events.event.domain.models.EventType.CALLBACK_IDENTIF import com.simprints.infra.events.event.domain.models.EventType.CALLBACK_REFUSAL import com.simprints.infra.events.event.domain.models.EventType.CALLBACK_VERIFICATION import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_CONFIRMATION +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_CONFIRMATION_V3 import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_ENROLMENT +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_ENROLMENT_V3 import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_IDENTIFICATION +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_IDENTIFICATION_V3 import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_LAST_BIOMETRICS +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_LAST_BIOMETRICS_V3 import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_VERIFICATION +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_VERIFICATION_V3 import com.simprints.infra.events.event.domain.models.EventType.CANDIDATE_READ import com.simprints.infra.events.event.domain.models.EventType.COMPLETION_CHECK import com.simprints.infra.events.event.domain.models.EventType.CONNECTIVITY_SNAPSHOT @@ -103,10 +108,15 @@ internal fun EventType.fromDomainToApi(): ApiEventPayloadType = when (this) { SCANNER_FIRMWARE_UPDATE -> ApiEventPayloadType.ScannerFirmwareUpdate INVALID_INTENT -> ApiEventPayloadType.InvalidIntent CALLOUT_CONFIRMATION, + CALLOUT_CONFIRMATION_V3, CALLOUT_IDENTIFICATION, + CALLOUT_IDENTIFICATION_V3, CALLOUT_ENROLMENT, + CALLOUT_ENROLMENT_V3, CALLOUT_VERIFICATION, + CALLOUT_VERIFICATION_V3, CALLOUT_LAST_BIOMETRICS, + CALLOUT_LAST_BIOMETRICS_V3, -> ApiEventPayloadType.Callout CALLBACK_IDENTIFICATION, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiBiometricDataSource.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiBiometricDataSource.kt new file mode 100644 index 0000000000..0597707f77 --- /dev/null +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiBiometricDataSource.kt @@ -0,0 +1,15 @@ +package com.simprints.infra.eventsync.event.remote.models.callout + +import androidx.annotation.Keep +import com.simprints.infra.events.event.domain.models.callout.BiometricDataSource + +@Keep +internal enum class ApiBiometricDataSource { + SIMPRINTS, + COMMCARE +} + +internal fun BiometricDataSource.fromDomainToApi(): ApiBiometricDataSource = when (this) { + BiometricDataSource.SIMPRINTS -> ApiBiometricDataSource.SIMPRINTS + BiometricDataSource.COMMCARE -> ApiBiometricDataSource.COMMCARE +} diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutIntegrationInfo.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutIntegrationInfo.kt deleted file mode 100644 index 16539b5597..0000000000 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutIntegrationInfo.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.simprints.infra.eventsync.event.remote.models.callout - -import androidx.annotation.Keep - -@Keep -internal enum class ApiCalloutIntegrationInfo { - ODK, - STANDARD, -} 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/ApiCalloutPayloadV2.kt similarity index 80% rename from infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutPayload.kt rename to infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutPayloadV2.kt index 9013cac615..b034ed0ac3 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/ApiCalloutPayloadV2.kt @@ -4,55 +4,55 @@ import androidx.annotation.Keep import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonInclude.Include import com.simprints.infra.config.store.models.TokenKeyType -import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEvent.ConfirmationCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEvent.EnrolmentCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEvent.EnrolmentLastBiometricsCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEvent.IdentificationCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEvent.VerificationCalloutPayload +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV2.ConfirmationCalloutPayload +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV2.EnrolmentCalloutPayload +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV2.EnrolmentLastBiometricsCalloutPayload +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV2.IdentificationCalloutPayload +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV2.VerificationCalloutPayload import com.simprints.infra.eventsync.event.remote.models.ApiEventPayload import com.simprints.infra.eventsync.event.remote.models.ApiTimestamp import com.simprints.infra.eventsync.event.remote.models.fromDomainToApi @Keep @JsonInclude(Include.NON_NULL) -internal data class ApiCalloutPayload( +internal data class ApiCalloutPayloadV2( override val startTime: ApiTimestamp, val callout: ApiCallout, ) : ApiEventPayload(startTime) { constructor(domainPayload: EnrolmentCalloutPayload) : this( domainPayload.createdAt.fromDomainToApi(), - ApiEnrolmentCallout( + ApiEnrolmentCalloutV2( domainPayload.projectId, domainPayload.userId.value, domainPayload.moduleId.value, - domainPayload.metadata, + domainPayload.metadata ), ) constructor(domainPayload: IdentificationCalloutPayload) : this( domainPayload.createdAt.fromDomainToApi(), - ApiIdentificationCallout( + ApiIdentificationCalloutV2( domainPayload.projectId, domainPayload.userId.value, domainPayload.moduleId.value, - domainPayload.metadata, + domainPayload.metadata ), ) constructor(domainPayload: VerificationCalloutPayload) : this( domainPayload.createdAt.fromDomainToApi(), - ApiVerificationCallout( + ApiVerificationCalloutV2( domainPayload.projectId, domainPayload.userId.value, domainPayload.moduleId.value, domainPayload.metadata, - domainPayload.verifyGuid, + domainPayload.verifyGuid ), ) constructor(domainPayload: ConfirmationCalloutPayload) : this( domainPayload.createdAt.fromDomainToApi(), - ApiConfirmationCallout( + ApiConfirmationCalloutV2( domainPayload.selectedGuid, domainPayload.sessionId, ), @@ -60,7 +60,7 @@ internal data class ApiCalloutPayload( constructor(domainPayload: EnrolmentLastBiometricsCalloutPayload) : this( domainPayload.createdAt.fromDomainToApi(), - ApiEnrolmentLastBiometricsCallout( + ApiEnrolmentLastBiometricsCalloutV2( domainPayload.projectId, domainPayload.userId.value, domainPayload.moduleId.value, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutPayloadV3.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutPayloadV3.kt new file mode 100644 index 0000000000..123a1586ce --- /dev/null +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiCalloutPayloadV3.kt @@ -0,0 +1,80 @@ +package com.simprints.infra.eventsync.event.remote.models.callout + +import androidx.annotation.Keep +import com.fasterxml.jackson.annotation.JsonInclude +import com.fasterxml.jackson.annotation.JsonInclude.Include +import com.simprints.infra.config.store.models.TokenKeyType +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV3.ConfirmationCalloutPayload +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV3.EnrolmentCalloutPayload +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV3.EnrolmentLastBiometricsCalloutPayload +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV3.IdentificationCalloutPayload +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV3.VerificationCalloutPayload +import com.simprints.infra.eventsync.event.remote.models.ApiEventPayload +import com.simprints.infra.eventsync.event.remote.models.ApiTimestamp +import com.simprints.infra.eventsync.event.remote.models.fromDomainToApi + +@Keep +@JsonInclude(Include.NON_NULL) +internal data class ApiCalloutPayloadV3( + override val startTime: ApiTimestamp, + val callout: ApiCallout, +) : ApiEventPayload(startTime) { + constructor(domainPayload: EnrolmentCalloutPayload) : this( + domainPayload.createdAt.fromDomainToApi(), + ApiEnrolmentCalloutV3( + domainPayload.projectId, + domainPayload.userId.value, + domainPayload.moduleId.value, + domainPayload.metadata, + domainPayload.biometricDataSource.fromDomainToApi() + ), + ) + + constructor(domainPayload: IdentificationCalloutPayload) : this( + domainPayload.createdAt.fromDomainToApi(), + ApiIdentificationCalloutV3( + domainPayload.projectId, + domainPayload.userId.value, + domainPayload.moduleId.value, + domainPayload.metadata, + domainPayload.biometricDataSource.fromDomainToApi() + ), + ) + + constructor(domainPayload: VerificationCalloutPayload) : this( + domainPayload.createdAt.fromDomainToApi(), + ApiVerificationCalloutV3( + domainPayload.projectId, + domainPayload.userId.value, + domainPayload.moduleId.value, + domainPayload.metadata, + domainPayload.verifyGuid, + domainPayload.biometricDataSource.fromDomainToApi() + ), + ) + + constructor(domainPayload: ConfirmationCalloutPayload) : this( + domainPayload.createdAt.fromDomainToApi(), + ApiConfirmationCalloutV3( + domainPayload.selectedGuid, + domainPayload.sessionId, + ), + ) + + constructor(domainPayload: EnrolmentLastBiometricsCalloutPayload) : this( + domainPayload.createdAt.fromDomainToApi(), + ApiEnrolmentLastBiometricsCalloutV3( + domainPayload.projectId, + domainPayload.userId.value, + domainPayload.moduleId.value, + domainPayload.metadata, + domainPayload.sessionId, + ), + ) + + override fun getTokenizedFieldJsonPath(tokenKeyType: TokenKeyType): String? = when (tokenKeyType) { + TokenKeyType.AttendantId -> "callout.userId" + TokenKeyType.ModuleId -> "callout.moduleId" + TokenKeyType.Unknown -> null + } +} 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/ApiConfirmationCalloutV2.kt similarity index 81% rename from infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiConfirmationCallout.kt rename to infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiConfirmationCalloutV2.kt index 1a48adc5c4..3e30f2e5fd 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/ApiConfirmationCalloutV2.kt @@ -3,7 +3,7 @@ package com.simprints.infra.eventsync.event.remote.models.callout import androidx.annotation.Keep @Keep -internal data class ApiConfirmationCallout( +internal data class ApiConfirmationCalloutV2( val selectedGuid: String, val sessionId: String, ) : ApiCallout(ApiCalloutType.Confirmation) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiConfirmationCalloutV3.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiConfirmationCalloutV3.kt new file mode 100644 index 0000000000..e462780288 --- /dev/null +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiConfirmationCalloutV3.kt @@ -0,0 +1,9 @@ +package com.simprints.infra.eventsync.event.remote.models.callout + +import androidx.annotation.Keep + +@Keep +internal data class ApiConfirmationCalloutV3( + val selectedGuid: String, + val sessionId: String, +) : ApiCallout(ApiCalloutType.Confirmation) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentCallout.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentCalloutV2.kt similarity index 85% rename from infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentCallout.kt rename to infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentCalloutV2.kt index eb1b979adc..7d594a8950 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentCallout.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentCalloutV2.kt @@ -3,7 +3,7 @@ package com.simprints.infra.eventsync.event.remote.models.callout import androidx.annotation.Keep @Keep -internal data class ApiEnrolmentCallout( +internal data class ApiEnrolmentCalloutV2( val projectId: String, val userId: String, val moduleId: String, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentCalloutV3.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentCalloutV3.kt new file mode 100644 index 0000000000..0827b5803d --- /dev/null +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentCalloutV3.kt @@ -0,0 +1,12 @@ +package com.simprints.infra.eventsync.event.remote.models.callout + +import androidx.annotation.Keep + +@Keep +internal data class ApiEnrolmentCalloutV3( + val projectId: String, + val userId: String, + val moduleId: String, + val metadata: String?, + val biometricDataSource: ApiBiometricDataSource, +) : ApiCallout(ApiCalloutType.Enrolment) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentLastBiometricsCallout.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentLastBiometricsCalloutV2.kt similarity index 88% rename from infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentLastBiometricsCallout.kt rename to infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentLastBiometricsCalloutV2.kt index 9fddaaad2b..85b689531a 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentLastBiometricsCallout.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentLastBiometricsCalloutV2.kt @@ -6,7 +6,7 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include @Keep @JsonInclude(Include.NON_NULL) -internal data class ApiEnrolmentLastBiometricsCallout( +internal data class ApiEnrolmentLastBiometricsCalloutV2( val projectId: String, val userId: String, val moduleId: String, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentLastBiometricsCalloutV3.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentLastBiometricsCalloutV3.kt new file mode 100644 index 0000000000..34771ae4c4 --- /dev/null +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiEnrolmentLastBiometricsCalloutV3.kt @@ -0,0 +1,15 @@ +package com.simprints.infra.eventsync.event.remote.models.callout + +import androidx.annotation.Keep +import com.fasterxml.jackson.annotation.JsonInclude +import com.fasterxml.jackson.annotation.JsonInclude.Include + +@Keep +@JsonInclude(Include.NON_NULL) +internal data class ApiEnrolmentLastBiometricsCalloutV3( + val projectId: String, + val userId: String, + val moduleId: String, + val metadata: String?, + val sessionId: String, +) : ApiCallout(ApiCalloutType.EnrolmentLastBiometrics) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiIdentificationCallout.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiIdentificationCalloutV2.kt similarity index 84% rename from infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiIdentificationCallout.kt rename to infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiIdentificationCalloutV2.kt index 01046cb314..42b97457ce 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiIdentificationCallout.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiIdentificationCalloutV2.kt @@ -3,7 +3,7 @@ package com.simprints.infra.eventsync.event.remote.models.callout import androidx.annotation.Keep @Keep -internal data class ApiIdentificationCallout( +internal data class ApiIdentificationCalloutV2( val projectId: String, val userId: String, val moduleId: String, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiIdentificationCalloutV3.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiIdentificationCalloutV3.kt new file mode 100644 index 0000000000..826cdf3429 --- /dev/null +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiIdentificationCalloutV3.kt @@ -0,0 +1,12 @@ +package com.simprints.infra.eventsync.event.remote.models.callout + +import androidx.annotation.Keep + +@Keep +internal data class ApiIdentificationCalloutV3( + val projectId: String, + val userId: String, + val moduleId: String, + val metadata: String?, + val biometricDataSource: ApiBiometricDataSource, +) : ApiCallout(ApiCalloutType.Identification) diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiVerificationCallout.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiVerificationCalloutV2.kt similarity index 85% rename from infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiVerificationCallout.kt rename to infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiVerificationCalloutV2.kt index d9d2fea485..1d26f650c5 100644 --- a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiVerificationCallout.kt +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiVerificationCalloutV2.kt @@ -3,7 +3,7 @@ package com.simprints.infra.eventsync.event.remote.models.callout import androidx.annotation.Keep @Keep -internal data class ApiVerificationCallout( +internal data class ApiVerificationCalloutV2( val projectId: String, val userId: String, val moduleId: String, diff --git a/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiVerificationCalloutV3.kt b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiVerificationCalloutV3.kt new file mode 100644 index 0000000000..131960745e --- /dev/null +++ b/infra/event-sync/src/main/java/com/simprints/infra/eventsync/event/remote/models/callout/ApiVerificationCalloutV3.kt @@ -0,0 +1,13 @@ +package com.simprints.infra.eventsync.event.remote.models.callout + +import androidx.annotation.Keep + +@Keep +internal data class ApiVerificationCalloutV3( + val projectId: String, + val userId: String, + val moduleId: String, + val metadata: String, + val verifyGuid: String, + val biometricDataSource: ApiBiometricDataSource, +) : ApiCallout(ApiCalloutType.Verification) 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..69e6298a4e 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 @@ -142,26 +142,41 @@ fun verifyCallbackErrorApiModel(json: JSONObject) { assertThat(json.length()).isEqualTo(2) } -fun validateCalloutEventApiModel(json: JSONObject) { +fun validateCalloutEventApiModelV2(json: JSONObject) { validateCommonParams(json, "Callout", 2) with(json.getJSONObject("payload")) { validateTimestamp(getJSONObject("startTime")) with(getJSONObject("callout")) { when (ApiCalloutType.valueOf(getString("type"))) { - ApiCalloutType.Confirmation -> verifyCalloutConfirmationApiModel(this) - ApiCalloutType.Enrolment -> verifyCalloutEnrolmentApiModel(this) - ApiCalloutType.Identification -> verifyCalloutIdentificationApiModel(this) - ApiCalloutType.Verification -> verifyCalloutVerificationApiModel(this) - ApiCalloutType.EnrolmentLastBiometrics -> verifyCalloutLastEnrolmentBiometricsApiModel( - this, - ) + ApiCalloutType.Confirmation -> verifyCalloutConfirmationApiModelV2(this) + ApiCalloutType.Enrolment -> verifyCalloutEnrolmentApiModelV2(this) + ApiCalloutType.Identification -> verifyCalloutIdentificationApiModelV2(this) + ApiCalloutType.Verification -> verifyCalloutVerificationApiModelV2(this) + ApiCalloutType.EnrolmentLastBiometrics -> verifyCalloutLastEnrolmentBiometricsApiModelV2(this) } } assertThat(length()).isEqualTo(2) } } -fun verifyCalloutLastEnrolmentBiometricsApiModel(json: JSONObject) { +fun validateCalloutEventApiModelV3(json: JSONObject) { + validateCommonParams(json, "Callout", 3) + with(json.getJSONObject("payload")) { + validateTimestamp(getJSONObject("startTime")) + with(getJSONObject("callout")) { + when (ApiCalloutType.valueOf(getString("type"))) { + ApiCalloutType.Confirmation -> verifyCalloutConfirmationApiModelV3(this) + ApiCalloutType.Enrolment -> verifyCalloutEnrolmentApiModelV3(this) + ApiCalloutType.Identification -> verifyCalloutIdentificationApiModelV3(this) + ApiCalloutType.Verification -> verifyCalloutVerificationApiModelV3(this) + ApiCalloutType.EnrolmentLastBiometrics -> verifyCalloutLastEnrolmentBiometricsApiModelV3(this) + } + } + assertThat(length()).isEqualTo(2) + } +} + +fun verifyCalloutLastEnrolmentBiometricsApiModelV2(json: JSONObject) { assertThat(json.getString("type")).isEqualTo("EnrolmentLastBiometrics") assertThat(json.getString("projectId")).isNotNull() assertThat(json.getString("userId")).isNotNull() @@ -171,7 +186,17 @@ fun verifyCalloutLastEnrolmentBiometricsApiModel(json: JSONObject) { assertThat(json.length()).isEqualTo(6) } -fun verifyCalloutVerificationApiModel(json: JSONObject) { +fun verifyCalloutLastEnrolmentBiometricsApiModelV3(json: JSONObject) { + assertThat(json.getString("type")).isEqualTo("EnrolmentLastBiometrics") + assertThat(json.getString("projectId")).isNotNull() + assertThat(json.getString("userId")).isNotNull() + assertThat(json.getString("moduleId")).isNotNull() + assertThat(json.getString("metadata")).isNotNull() + assertThat(json.getString("sessionId")).isNotNull() + assertThat(json.length()).isEqualTo(6) +} + +fun verifyCalloutVerificationApiModelV2(json: JSONObject) { assertThat(json.getString("type")).isEqualTo("Verification") assertThat(json.getString("projectId")).isNotNull() assertThat(json.getString("userId")).isNotNull() @@ -181,7 +206,18 @@ fun verifyCalloutVerificationApiModel(json: JSONObject) { assertThat(json.length()).isEqualTo(6) } -fun verifyCalloutIdentificationApiModel(json: JSONObject) { +fun verifyCalloutVerificationApiModelV3(json: JSONObject) { + assertThat(json.getString("type")).isEqualTo("Verification") + assertThat(json.getString("projectId")).isNotNull() + assertThat(json.getString("userId")).isNotNull() + assertThat(json.getString("moduleId")).isNotNull() + assertThat(json.getString("verifyGuid")).isNotNull() + assertThat(json.getString("metadata")).isNotNull() + assertThat(json.getString("biometricDataSource")).isNotNull() + assertThat(json.length()).isEqualTo(7) +} + +fun verifyCalloutIdentificationApiModelV2(json: JSONObject) { assertThat(json.getString("type")).isEqualTo("Identification") assertThat(json.getString("projectId")).isNotNull() assertThat(json.getString("userId")).isNotNull() @@ -190,7 +226,17 @@ fun verifyCalloutIdentificationApiModel(json: JSONObject) { assertThat(json.length()).isEqualTo(5) } -fun verifyCalloutEnrolmentApiModel(json: JSONObject) { +fun verifyCalloutIdentificationApiModelV3(json: JSONObject) { + assertThat(json.getString("type")).isEqualTo("Identification") + assertThat(json.getString("projectId")).isNotNull() + assertThat(json.getString("userId")).isNotNull() + assertThat(json.getString("moduleId")).isNotNull() + assertThat(json.getString("metadata")).isNotNull() + assertThat(json.getString("biometricDataSource")).isNotNull() + assertThat(json.length()).isEqualTo(6) +} + +fun verifyCalloutEnrolmentApiModelV2(json: JSONObject) { assertThat(json.getString("type")).isEqualTo("Enrolment") assertThat(json.getString("projectId")).isNotNull() assertThat(json.getString("userId")).isNotNull() @@ -199,7 +245,24 @@ fun verifyCalloutEnrolmentApiModel(json: JSONObject) { assertThat(json.length()).isEqualTo(5) } -fun verifyCalloutConfirmationApiModel(json: JSONObject) { +fun verifyCalloutEnrolmentApiModelV3(json: JSONObject) { + assertThat(json.getString("type")).isEqualTo("Enrolment") + assertThat(json.getString("projectId")).isNotNull() + assertThat(json.getString("userId")).isNotNull() + assertThat(json.getString("moduleId")).isNotNull() + assertThat(json.getString("metadata")).isNotNull() + assertThat(json.getString("biometricDataSource")).isNotNull() + assertThat(json.length()).isEqualTo(6) +} + +fun verifyCalloutConfirmationApiModelV2(json: JSONObject) { + assertThat(json.getString("type")).isEqualTo("Confirmation") + assertThat(json.getString("selectedGuid")).isNotNull() + assertThat(json.getString("sessionId")).isNotNull() + assertThat(json.length()).isEqualTo(3) +} + +fun verifyCalloutConfirmationApiModelV3(json: JSONObject) { assertThat(json.getString("type")).isEqualTo("Confirmation") assertThat(json.getString("selectedGuid")).isNotNull() assertThat(json.getString("sessionId")).isNotNull() diff --git a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/usecases/MapDomainEventToApiUseCaseTest.kt b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/usecases/MapDomainEventToApiUseCaseTest.kt index c35cbcdf72..76692fa06d 100644 --- a/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/usecases/MapDomainEventToApiUseCaseTest.kt +++ b/infra/event-sync/src/test/java/com/simprints/infra/eventsync/event/usecases/MapDomainEventToApiUseCaseTest.kt @@ -19,11 +19,13 @@ import com.simprints.infra.events.sampledata.createBiometricReferenceCreationEve import com.simprints.infra.events.sampledata.createCandidateReadEvent import com.simprints.infra.events.sampledata.createCompletionCheckEvent import com.simprints.infra.events.sampledata.createConfirmationCallbackEvent -import com.simprints.infra.events.sampledata.createConfirmationCalloutEvent +import com.simprints.infra.events.sampledata.createConfirmationCalloutEventV2 +import com.simprints.infra.events.sampledata.createConfirmationCalloutEventV3 import com.simprints.infra.events.sampledata.createConnectivitySnapshotEvent import com.simprints.infra.events.sampledata.createConsentEvent import com.simprints.infra.events.sampledata.createEnrolmentCallbackEvent -import com.simprints.infra.events.sampledata.createEnrolmentCalloutEvent +import com.simprints.infra.events.sampledata.createEnrolmentCalloutEventV2 +import com.simprints.infra.events.sampledata.createEnrolmentCalloutEventV3 import com.simprints.infra.events.sampledata.createEnrolmentEventV2 import com.simprints.infra.events.sampledata.createEnrolmentEventV4 import com.simprints.infra.events.sampledata.createEventDownSyncRequestEvent @@ -37,10 +39,12 @@ import com.simprints.infra.events.sampledata.createFingerprintCaptureBiometricsE import com.simprints.infra.events.sampledata.createFingerprintCaptureEvent import com.simprints.infra.events.sampledata.createGuidSelectionEvent import com.simprints.infra.events.sampledata.createIdentificationCallbackEvent -import com.simprints.infra.events.sampledata.createIdentificationCalloutEvent +import com.simprints.infra.events.sampledata.createIdentificationCalloutEventV2 +import com.simprints.infra.events.sampledata.createIdentificationCalloutEventV3 import com.simprints.infra.events.sampledata.createIntentParsingEvent import com.simprints.infra.events.sampledata.createInvalidIntentEvent -import com.simprints.infra.events.sampledata.createLastBiometricsEnrolmentCalloutEvent +import com.simprints.infra.events.sampledata.createLastBiometricsEnrolmentCalloutEventV2 +import com.simprints.infra.events.sampledata.createLastBiometricsEnrolmentCalloutEventV3 import com.simprints.infra.events.sampledata.createLicenseCheckEvent import com.simprints.infra.events.sampledata.createOneToManyMatchEvent import com.simprints.infra.events.sampledata.createOneToOneMatchEvent @@ -52,7 +56,8 @@ import com.simprints.infra.events.sampledata.createScannerFirmwareUpdateEvent import com.simprints.infra.events.sampledata.createSuspiciousIntentEvent import com.simprints.infra.events.sampledata.createVerificationCallbackEventV1 import com.simprints.infra.events.sampledata.createVerificationCallbackEventV2 -import com.simprints.infra.events.sampledata.createVerificationCalloutEvent +import com.simprints.infra.events.sampledata.createVerificationCalloutEventV2 +import com.simprints.infra.events.sampledata.createVerificationCalloutEventV3 import com.simprints.infra.events.sampledata.createVero2InfoSnapshotEvent import com.simprints.infra.eventsync.event.remote.models.ApiEventPayloadType import com.simprints.infra.eventsync.event.remote.models.ApiEventPayloadType.AgeGroupSelection @@ -95,7 +100,8 @@ import com.simprints.infra.eventsync.event.validateAuthorizationEventApiModel import com.simprints.infra.eventsync.event.validateBiometricReferenceCreationEventApiModel import com.simprints.infra.eventsync.event.validateCallbackV1EventApiModel import com.simprints.infra.eventsync.event.validateCallbackV2EventApiModel -import com.simprints.infra.eventsync.event.validateCalloutEventApiModel +import com.simprints.infra.eventsync.event.validateCalloutEventApiModelV2 +import com.simprints.infra.eventsync.event.validateCalloutEventApiModelV3 import com.simprints.infra.eventsync.event.validateCandidateReadEventApiModel import com.simprints.infra.eventsync.event.validateCommonParams import com.simprints.infra.eventsync.event.validateCompletionCheckEventApiModel @@ -183,48 +189,93 @@ internal class MapDomainEventToApiUseCaseTest { } @Test - fun validate_calloutEventForVerificationApiModel() { - val event = createVerificationCalloutEvent() + fun validate_calloutEventForVerificationApiModelV2() { + val event = createVerificationCalloutEventV2() val apiEvent = useCase(event, project) val json = JSONObject(jackson.writeValueAsString(apiEvent)) - validateCalloutEventApiModel(json) + validateCalloutEventApiModelV2(json) } @Test - fun validate_calloutEventForIdentificationApiModel() { - val event = createIdentificationCalloutEvent() + fun validate_calloutEventForVerificationApiModelV3() { + val event = createVerificationCalloutEventV3() val apiEvent = useCase(event, project) val json = JSONObject(jackson.writeValueAsString(apiEvent)) - validateCalloutEventApiModel(json) + validateCalloutEventApiModelV3(json) } @Test - fun validate_calloutEventForEnrolLastBiometricsModel() { - val event = createLastBiometricsEnrolmentCalloutEvent() + fun validate_calloutEventForIdentificationApiModelV2() { + val event = createIdentificationCalloutEventV2() val apiEvent = useCase(event, project) val json = JSONObject(jackson.writeValueAsString(apiEvent)) - validateCalloutEventApiModel(json) + validateCalloutEventApiModelV2(json) } @Test - fun validate_calloutEventForConfirmationApiModel() { - val event = createConfirmationCalloutEvent() + fun validate_calloutEventForIdentificationApiModelV3() { + val event = createIdentificationCalloutEventV3() val apiEvent = useCase(event, project) val json = JSONObject(jackson.writeValueAsString(apiEvent)) - validateCalloutEventApiModel(json) + validateCalloutEventApiModelV3(json) } @Test - fun validate_calloutEventForEnrolmentApiModel() { - val event = createEnrolmentCalloutEvent() + fun validate_calloutEventForEnrolLastBiometricsModelV2() { + val event = createLastBiometricsEnrolmentCalloutEventV2() val apiEvent = useCase(event, project) val json = JSONObject(jackson.writeValueAsString(apiEvent)) - validateCalloutEventApiModel(json) + validateCalloutEventApiModelV2(json) + } + + @Test + fun validate_calloutEventForEnrolLastBiometricsModelV3() { + val event = createLastBiometricsEnrolmentCalloutEventV3() + val apiEvent = useCase(event, project) + val json = JSONObject(jackson.writeValueAsString(apiEvent)) + + validateCalloutEventApiModelV3(json) + } + + @Test + fun validate_calloutEventForConfirmationApiModelV2() { + val event = createConfirmationCalloutEventV2() + val apiEvent = useCase(event, project) + val json = JSONObject(jackson.writeValueAsString(apiEvent)) + + validateCalloutEventApiModelV2(json) + } + + @Test + fun validate_calloutEventForConfirmationApiModelV3() { + val event = createConfirmationCalloutEventV3() + val apiEvent = useCase(event, project) + val json = JSONObject(jackson.writeValueAsString(apiEvent)) + + validateCalloutEventApiModelV3(json) + } + + @Test + fun validate_calloutEventForEnrolmentApiModelV2() { + val event = createEnrolmentCalloutEventV2() + val apiEvent = useCase(event, project) + val json = JSONObject(jackson.writeValueAsString(apiEvent)) + + validateCalloutEventApiModelV2(json) + } + + @Test + fun validate_calloutEventForEnrolmentApiModelV3() { + val event = createEnrolmentCalloutEventV3() + val apiEvent = useCase(event, project) + val json = JSONObject(jackson.writeValueAsString(apiEvent)) + + validateCalloutEventApiModelV3(json) } @Test 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..7bf3c3694c 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 @@ -59,11 +59,16 @@ import com.simprints.infra.events.event.domain.models.callback.ErrorCallbackEven import com.simprints.infra.events.event.domain.models.callback.IdentificationCallbackEvent import com.simprints.infra.events.event.domain.models.callback.RefusalCallbackEvent import com.simprints.infra.events.event.domain.models.callback.VerificationCallbackEvent -import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEvent +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV3 import com.simprints.infra.events.event.domain.models.downsync.EventDownSyncRequestEvent import com.simprints.infra.events.event.domain.models.face.FaceCaptureBiometricsEvent import com.simprints.infra.events.event.domain.models.face.FaceCaptureConfirmationEvent @@ -81,6 +86,7 @@ import com.simprints.infra.events.event.domain.models.scope.EventScopeType import com.simprints.infra.events.event.domain.models.scope.Location import com.simprints.infra.events.event.domain.models.upsync.EventUpSyncRequestEvent import com.simprints.infra.events.sampledata.SampleDefaults.CREATED_AT +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_BIOMETRIC_DATA_SOURCE import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_METADATA import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_MODULE_ID import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_PROJECT_ID @@ -180,14 +186,21 @@ fun createVerificationCallbackEventV2() = VerificationCallbackEvent( CallbackComparisonScore(GUID1, 1, MEDIUM), ) -fun createConfirmationCalloutEvent() = ConfirmationCalloutEvent( +fun createConfirmationCalloutEventV2() = ConfirmationCalloutEventV2( CREATED_AT, DEFAULT_PROJECT_ID, GUID1, GUID2, ) -fun createEnrolmentCalloutEvent(projectId: String = DEFAULT_PROJECT_ID) = EnrolmentCalloutEvent( +fun createConfirmationCalloutEventV3() = ConfirmationCalloutEventV3( + CREATED_AT, + DEFAULT_PROJECT_ID, + GUID1, + GUID2, +) + +fun createEnrolmentCalloutEventV2(projectId: String = DEFAULT_PROJECT_ID) = EnrolmentCalloutEventV2( CREATED_AT, projectId, DEFAULT_USER_ID, @@ -196,7 +209,17 @@ fun createEnrolmentCalloutEvent(projectId: String = DEFAULT_PROJECT_ID) = Enrolm projectId, ) -fun createIdentificationCalloutEvent() = IdentificationCalloutEvent( +fun createEnrolmentCalloutEventV3(projectId: String = DEFAULT_PROJECT_ID) = EnrolmentCalloutEventV3( + CREATED_AT, + projectId, + DEFAULT_USER_ID, + DEFAULT_MODULE_ID, + DEFAULT_METADATA, + DEFAULT_BIOMETRIC_DATA_SOURCE, + projectId, +) + +fun createIdentificationCalloutEventV2() = IdentificationCalloutEventV2( CREATED_AT, DEFAULT_PROJECT_ID, DEFAULT_USER_ID, @@ -204,7 +227,25 @@ fun createIdentificationCalloutEvent() = IdentificationCalloutEvent( DEFAULT_METADATA, ) -fun createLastBiometricsEnrolmentCalloutEvent() = EnrolmentLastBiometricsCalloutEvent( +fun createIdentificationCalloutEventV3() = IdentificationCalloutEventV3( + CREATED_AT, + DEFAULT_PROJECT_ID, + DEFAULT_USER_ID, + DEFAULT_MODULE_ID, + DEFAULT_METADATA, + DEFAULT_BIOMETRIC_DATA_SOURCE, +) + +fun createLastBiometricsEnrolmentCalloutEventV2() = EnrolmentLastBiometricsCalloutEventV2( + CREATED_AT, + DEFAULT_PROJECT_ID, + DEFAULT_USER_ID, + DEFAULT_MODULE_ID, + DEFAULT_METADATA, + GUID2, +) + +fun createLastBiometricsEnrolmentCalloutEventV3() = EnrolmentLastBiometricsCalloutEventV3( CREATED_AT, DEFAULT_PROJECT_ID, DEFAULT_USER_ID, @@ -213,13 +254,23 @@ fun createLastBiometricsEnrolmentCalloutEvent() = EnrolmentLastBiometricsCallout GUID2, ) -fun createVerificationCalloutEvent() = VerificationCalloutEvent( +fun createVerificationCalloutEventV2() = VerificationCalloutEventV2( CREATED_AT, DEFAULT_PROJECT_ID, DEFAULT_USER_ID, DEFAULT_MODULE_ID, + GUID2, DEFAULT_METADATA, +) + +fun createVerificationCalloutEventV3() = VerificationCalloutEventV3( + CREATED_AT, + DEFAULT_PROJECT_ID, + DEFAULT_USER_ID, + DEFAULT_MODULE_ID, GUID2, + DEFAULT_METADATA, + DEFAULT_BIOMETRIC_DATA_SOURCE, ) fun createFaceCaptureBiometricsEvent() = FaceCaptureBiometricsEvent( diff --git a/infra/events/src/debug/java/com/simprints/infra/events/sampledata/SampleDefaults.kt b/infra/events/src/debug/java/com/simprints/infra/events/sampledata/SampleDefaults.kt index 555aa66bd2..8f208db76e 100644 --- a/infra/events/src/debug/java/com/simprints/infra/events/sampledata/SampleDefaults.kt +++ b/infra/events/src/debug/java/com/simprints/infra/events/sampledata/SampleDefaults.kt @@ -3,6 +3,7 @@ package com.simprints.infra.events.sampledata import com.simprints.core.domain.modality.Modes import com.simprints.core.domain.tokenization.asTokenizableRaw import com.simprints.core.tools.time.Timestamp +import com.simprints.infra.events.event.domain.models.callout.BiometricDataSource import java.util.UUID object SampleDefaults { @@ -14,6 +15,7 @@ object SampleDefaults { val DEFAULT_USER_ID = "user_id".asTokenizableRaw() val DEFAULT_USER_ID_2 = "user_id_2".asTokenizableRaw() const val DEFAULT_METADATA = "DEFAULT_METADATA" + val DEFAULT_BIOMETRIC_DATA_SOURCE = BiometricDataSource.SIMPRINTS val CREATED_AT: Timestamp = Timestamp(1234L) val ENDED_AT: Timestamp = Timestamp(4567L) diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/Event.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/Event.kt index 9c143ed770..dde7444623 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/Event.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/Event.kt @@ -17,10 +17,15 @@ import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLBA import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLBACK_REFUSAL_KEY import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLBACK_VERIFICATION_KEY import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLOUT_CONFIRMATION_KEY +import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLOUT_CONFIRMATION_V3_KEY import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLOUT_ENROLMENT_KEY +import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLOUT_ENROLMENT_V3_KEY import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLOUT_IDENTIFICATION_KEY +import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLOUT_IDENTIFICATION_V3_KEY import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLOUT_LAST_BIOMETRICS_KEY +import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLOUT_LAST_BIOMETRICS_V3_KEY import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLOUT_VERIFICATION_KEY +import com.simprints.infra.events.event.domain.models.EventType.Companion.CALLOUT_VERIFICATION_V3_KEY import com.simprints.infra.events.event.domain.models.EventType.Companion.CANDIDATE_READ_KEY import com.simprints.infra.events.event.domain.models.EventType.Companion.COMPLETION_CHECK_KEY import com.simprints.infra.events.event.domain.models.EventType.Companion.CONNECTIVITY_SNAPSHOT_KEY @@ -54,11 +59,16 @@ import com.simprints.infra.events.event.domain.models.callback.ErrorCallbackEven import com.simprints.infra.events.event.domain.models.callback.IdentificationCallbackEvent import com.simprints.infra.events.event.domain.models.callback.RefusalCallbackEvent import com.simprints.infra.events.event.domain.models.callback.VerificationCallbackEvent -import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEvent +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV3 import com.simprints.infra.events.event.domain.models.downsync.EventDownSyncRequestEvent import com.simprints.infra.events.event.domain.models.face.FaceCaptureBiometricsEvent import com.simprints.infra.events.event.domain.models.face.FaceCaptureConfirmationEvent @@ -79,34 +89,24 @@ import com.simprints.infra.events.event.domain.models.upsync.EventUpSyncRequestE JsonSubTypes.Type(value = ConfirmationCallbackEvent::class, name = CALLBACK_CONFIRMATION_KEY), JsonSubTypes.Type(value = EnrolmentCallbackEvent::class, name = CALLBACK_ENROLMENT_KEY), JsonSubTypes.Type(value = ErrorCallbackEvent::class, name = CALLBACK_ERROR_KEY), - JsonSubTypes.Type( - value = IdentificationCallbackEvent::class, - name = CALLBACK_IDENTIFICATION_KEY, - ), + JsonSubTypes.Type(value = IdentificationCallbackEvent::class, name = CALLBACK_IDENTIFICATION_KEY), JsonSubTypes.Type(value = RefusalCallbackEvent::class, name = CALLBACK_REFUSAL_KEY), JsonSubTypes.Type(value = VerificationCallbackEvent::class, name = CALLBACK_VERIFICATION_KEY), - JsonSubTypes.Type(value = ConfirmationCalloutEvent::class, name = CALLOUT_CONFIRMATION_KEY), - JsonSubTypes.Type(value = EnrolmentCalloutEvent::class, name = CALLOUT_ENROLMENT_KEY), - JsonSubTypes.Type( - value = EnrolmentLastBiometricsCalloutEvent::class, - name = CALLOUT_LAST_BIOMETRICS_KEY, - ), - JsonSubTypes.Type(value = IdentificationCalloutEvent::class, name = CALLOUT_IDENTIFICATION_KEY), - JsonSubTypes.Type(value = VerificationCalloutEvent::class, name = CALLOUT_VERIFICATION_KEY), - JsonSubTypes.Type( - value = FaceCaptureConfirmationEvent::class, - name = FACE_CAPTURE_CONFIRMATION_KEY, - ), + JsonSubTypes.Type(value = ConfirmationCalloutEventV2::class, name = CALLOUT_CONFIRMATION_KEY), + JsonSubTypes.Type(value = ConfirmationCalloutEventV3::class, name = CALLOUT_CONFIRMATION_V3_KEY), + JsonSubTypes.Type(value = EnrolmentCalloutEventV2::class, name = CALLOUT_ENROLMENT_KEY), + JsonSubTypes.Type(value = EnrolmentCalloutEventV3::class, name = CALLOUT_ENROLMENT_V3_KEY), + JsonSubTypes.Type(value = EnrolmentLastBiometricsCalloutEventV2::class, name = CALLOUT_LAST_BIOMETRICS_KEY), + JsonSubTypes.Type(value = EnrolmentLastBiometricsCalloutEventV3::class, name = CALLOUT_LAST_BIOMETRICS_V3_KEY), + JsonSubTypes.Type(value = IdentificationCalloutEventV2::class, name = CALLOUT_IDENTIFICATION_KEY), + JsonSubTypes.Type(value = IdentificationCalloutEventV3::class, name = CALLOUT_IDENTIFICATION_V3_KEY), + JsonSubTypes.Type(value = VerificationCalloutEventV2::class, name = CALLOUT_VERIFICATION_KEY), + JsonSubTypes.Type(value = VerificationCalloutEventV3::class, name = CALLOUT_VERIFICATION_V3_KEY), + JsonSubTypes.Type(value = FaceCaptureConfirmationEvent::class, name = FACE_CAPTURE_CONFIRMATION_KEY), JsonSubTypes.Type(value = FaceCaptureEvent::class, name = FACE_CAPTURE_KEY), - JsonSubTypes.Type( - value = FaceCaptureBiometricsEvent::class, - name = FACE_CAPTURE_BIOMETRICS_KEY, - ), + JsonSubTypes.Type(value = FaceCaptureBiometricsEvent::class, name = FACE_CAPTURE_BIOMETRICS_KEY), JsonSubTypes.Type(value = FaceFallbackCaptureEvent::class, name = FACE_FALLBACK_CAPTURE_KEY), - JsonSubTypes.Type( - value = FaceOnboardingCompleteEvent::class, - name = FACE_ONBOARDING_COMPLETE_KEY, - ), + JsonSubTypes.Type(value = FaceOnboardingCompleteEvent::class, name = FACE_ONBOARDING_COMPLETE_KEY), JsonSubTypes.Type(value = AlertScreenEvent::class, name = ALERT_SCREEN_KEY), JsonSubTypes.Type(value = AuthenticationEvent::class, name = AUTHENTICATION_KEY), JsonSubTypes.Type(value = AuthorizationEvent::class, name = AUTHORIZATION_KEY), @@ -117,10 +117,7 @@ import com.simprints.infra.events.event.domain.models.upsync.EventUpSyncRequestE JsonSubTypes.Type(value = EnrolmentEventV2::class, name = ENROLMENT_V2_KEY), JsonSubTypes.Type(value = EnrolmentEventV4::class, name = ENROLMENT_V4_KEY), JsonSubTypes.Type(value = FingerprintCaptureEvent::class, name = FINGERPRINT_CAPTURE_KEY), - JsonSubTypes.Type( - value = FingerprintCaptureBiometricsEvent::class, - name = FINGERPRINT_CAPTURE_BIOMETRICS_KEY, - ), + JsonSubTypes.Type(value = FingerprintCaptureBiometricsEvent::class, name = FINGERPRINT_CAPTURE_BIOMETRICS_KEY), JsonSubTypes.Type(value = GuidSelectionEvent::class, name = GUID_SELECTION_KEY), JsonSubTypes.Type(value = IntentParsingEvent::class, name = INTENT_PARSING_KEY), JsonSubTypes.Type(value = InvalidIntentEvent::class, name = INVALID_INTENT_KEY), @@ -129,10 +126,7 @@ import com.simprints.infra.events.event.domain.models.upsync.EventUpSyncRequestE JsonSubTypes.Type(value = PersonCreationEvent::class, name = PERSON_CREATION_KEY), JsonSubTypes.Type(value = RefusalEvent::class, name = REFUSAL_KEY), JsonSubTypes.Type(value = ScannerConnectionEvent::class, name = SCANNER_CONNECTION_KEY), - JsonSubTypes.Type( - value = ScannerFirmwareUpdateEvent::class, - name = SCANNER_FIRMWARE_UPDATE_KEY, - ), + JsonSubTypes.Type(value = ScannerFirmwareUpdateEvent::class, name = SCANNER_FIRMWARE_UPDATE_KEY), JsonSubTypes.Type(value = SuspiciousIntentEvent::class, name = SUSPICIOUS_INTENT_KEY), JsonSubTypes.Type(value = Vero2InfoSnapshotEvent::class, name = VERO_2_INFO_SNAPSHOT_KEY), JsonSubTypes.Type(value = EventDownSyncRequestEvent::class, name = EVENT_DOWN_SYNC_REQUEST_KEY), diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/EventPayload.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/EventPayload.kt index 8018878ee1..12c1fd5f1d 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/EventPayload.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/EventPayload.kt @@ -31,11 +31,16 @@ import com.simprints.infra.events.event.domain.models.callback.ErrorCallbackEven import com.simprints.infra.events.event.domain.models.callback.IdentificationCallbackEvent.IdentificationCallbackPayload import com.simprints.infra.events.event.domain.models.callback.RefusalCallbackEvent.RefusalCallbackPayload import com.simprints.infra.events.event.domain.models.callback.VerificationCallbackEvent.VerificationCallbackPayload -import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEvent.ConfirmationCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEvent.EnrolmentCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEvent.EnrolmentLastBiometricsCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEvent.IdentificationCalloutPayload -import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEvent.VerificationCalloutPayload +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV2 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV3 import com.simprints.infra.events.event.domain.models.downsync.EventDownSyncRequestEvent.EventDownSyncRequestPayload import com.simprints.infra.events.event.domain.models.face.FaceCaptureBiometricsEvent.FaceCaptureBiometricsPayload import com.simprints.infra.events.event.domain.models.face.FaceCaptureConfirmationEvent.FaceCaptureConfirmationPayload @@ -54,11 +59,16 @@ import com.simprints.infra.events.event.domain.models.upsync.EventUpSyncRequestE JsonSubTypes.Type(value = IdentificationCallbackPayload::class, name = EventType.CALLBACK_IDENTIFICATION_KEY), JsonSubTypes.Type(value = RefusalCallbackPayload::class, name = EventType.CALLBACK_REFUSAL_KEY), JsonSubTypes.Type(value = VerificationCallbackPayload::class, name = EventType.CALLBACK_VERIFICATION_KEY), - JsonSubTypes.Type(value = ConfirmationCalloutPayload::class, name = EventType.CALLOUT_CONFIRMATION_KEY), - JsonSubTypes.Type(value = EnrolmentCalloutPayload::class, name = EventType.CALLOUT_ENROLMENT_KEY), - JsonSubTypes.Type(value = EnrolmentLastBiometricsCalloutPayload::class, name = EventType.CALLOUT_LAST_BIOMETRICS_KEY), - JsonSubTypes.Type(value = IdentificationCalloutPayload::class, name = EventType.CALLOUT_IDENTIFICATION_KEY), - JsonSubTypes.Type(value = VerificationCalloutPayload::class, name = EventType.CALLOUT_VERIFICATION_KEY), + JsonSubTypes.Type(value = ConfirmationCalloutEventV2.ConfirmationCalloutPayload::class, name = EventType.CALLOUT_CONFIRMATION_KEY), + JsonSubTypes.Type(value = ConfirmationCalloutEventV3.ConfirmationCalloutPayload::class, name = EventType.CALLOUT_CONFIRMATION_V3_KEY), + JsonSubTypes.Type(value = EnrolmentCalloutEventV2.EnrolmentCalloutPayload::class, name = EventType.CALLOUT_ENROLMENT_KEY), + JsonSubTypes.Type(value = EnrolmentCalloutEventV3.EnrolmentCalloutPayload::class, name = EventType.CALLOUT_ENROLMENT_V3_KEY), + JsonSubTypes.Type(value = EnrolmentLastBiometricsCalloutEventV2.EnrolmentLastBiometricsCalloutPayload::class, name = EventType.CALLOUT_LAST_BIOMETRICS_KEY), + JsonSubTypes.Type(value = EnrolmentLastBiometricsCalloutEventV3.EnrolmentLastBiometricsCalloutPayload::class, name = EventType.CALLOUT_LAST_BIOMETRICS_V3_KEY), + JsonSubTypes.Type(value = IdentificationCalloutEventV2.IdentificationCalloutPayload::class, name = EventType.CALLOUT_IDENTIFICATION_KEY), + JsonSubTypes.Type(value = IdentificationCalloutEventV3.IdentificationCalloutPayload::class, name = EventType.CALLOUT_IDENTIFICATION_V3_KEY), + JsonSubTypes.Type(value = VerificationCalloutEventV2.VerificationCalloutPayload::class, name = EventType.CALLOUT_VERIFICATION_KEY), + JsonSubTypes.Type(value = VerificationCalloutEventV3.VerificationCalloutPayload::class, name = EventType.CALLOUT_VERIFICATION_V3_KEY), JsonSubTypes.Type(value = FaceCaptureConfirmationPayload::class, name = EventType.FACE_CAPTURE_CONFIRMATION_KEY), JsonSubTypes.Type(value = FaceCapturePayload::class, name = EventType.FACE_CAPTURE_KEY), JsonSubTypes.Type(value = FaceCaptureBiometricsPayload::class, name = EventType.FACE_CAPTURE_BIOMETRICS_KEY), diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/EventType.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/EventType.kt index c67dd9f77d..aa7bf0ff56 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/EventType.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/EventType.kt @@ -65,18 +65,33 @@ enum class EventType { // key added: CALLOUT_CONFIRMATION_KEY CALLOUT_CONFIRMATION, + // key added: CALLOUT_CONFIRMATION_V3_KEY + CALLOUT_CONFIRMATION_V3, + // key added: CALLOUT_IDENTIFICATION_KEY CALLOUT_IDENTIFICATION, + // key added: CALLOUT_IDENTIFICATION_V3_KEY + CALLOUT_IDENTIFICATION_V3, + // key added: CALLOUT_ENROLMENT_KEY CALLOUT_ENROLMENT, + // key added: CALLOUT_ENROLMENT_V3_KEY + CALLOUT_ENROLMENT_V3, + // key added: CALLOUT_VERIFICATION_KEY CALLOUT_VERIFICATION, + // key added: CALLOUT_VERIFICATION_V3_KEY + CALLOUT_VERIFICATION_V3, + // key added: CALLOUT_LAST_BIOMETRICS_KEY CALLOUT_LAST_BIOMETRICS, + // key added: CALLOUT_LAST_BIOMETRICS_V3_KEY + CALLOUT_LAST_BIOMETRICS_V3, + // key added: CALLBACK_IDENTIFICATION_KEY CALLBACK_IDENTIFICATION, @@ -145,10 +160,15 @@ enum class EventType { const val CALLBACK_ERROR_KEY = "CALLBACK_ERROR" const val CALLBACK_CONFIRMATION_KEY = "CALLBACK_CONFIRMATION" const val CALLOUT_CONFIRMATION_KEY = "CALLOUT_CONFIRMATION" + const val CALLOUT_CONFIRMATION_V3_KEY = "CALLOUT_CONFIRMATION_V3" const val CALLOUT_IDENTIFICATION_KEY = "CALLOUT_IDENTIFICATION" + const val CALLOUT_IDENTIFICATION_V3_KEY = "CALLOUT_IDENTIFICATION_V3" const val CALLOUT_ENROLMENT_KEY = "CALLOUT_ENROLMENT" + const val CALLOUT_ENROLMENT_V3_KEY = "CALLOUT_ENROLMENT_V3" const val CALLOUT_VERIFICATION_KEY = "CALLOUT_VERIFICATION" + const val CALLOUT_VERIFICATION_V3_KEY = "CALLOUT_VERIFICATION_V3" const val CALLOUT_LAST_BIOMETRICS_KEY = "CALLOUT_LAST_BIOMETRICS" + const val CALLOUT_LAST_BIOMETRICS_V3_KEY = "CALLOUT_LAST_BIOMETRICS_V3" const val CALLBACK_IDENTIFICATION_KEY = "CALLBACK_IDENTIFICATION" const val FACE_ONBOARDING_COMPLETE_KEY = "FACE_ONBOARDING_COMPLETE" const val FACE_FALLBACK_CAPTURE_KEY = "FACE_FALLBACK_CAPTURE" diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/BiometricDataSource.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/BiometricDataSource.kt new file mode 100644 index 0000000000..558061fed6 --- /dev/null +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/BiometricDataSource.kt @@ -0,0 +1,17 @@ +package com.simprints.infra.events.event.domain.models.callout + +import androidx.annotation.Keep + +@Keep +enum class BiometricDataSource { + SIMPRINTS, + COMMCARE; + + companion object { + fun fromString(value: String) = + when (value.uppercase()) { + "COMMCARE" -> COMMCARE + else -> SIMPRINTS + } + } +} 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/ConfirmationCalloutEventV2.kt similarity index 95% rename from infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEvent.kt rename to infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventV2.kt index fbe897a2bf..51630b8c2a 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/ConfirmationCalloutEventV2.kt @@ -11,7 +11,8 @@ import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_CONFIRMA import java.util.UUID @Keep -data class ConfirmationCalloutEvent( +@Deprecated("Replaced by v3 in 2025.2.0") +data class ConfirmationCalloutEventV2( override val id: String = UUID.randomUUID().toString(), override val payload: ConfirmationCalloutPayload, override val type: EventType, diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventV3.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventV3.kt new file mode 100644 index 0000000000..10fc9893ee --- /dev/null +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventV3.kt @@ -0,0 +1,52 @@ +package com.simprints.infra.events.event.domain.models.callout + +import androidx.annotation.Keep +import com.simprints.core.domain.tokenization.TokenizableString +import com.simprints.core.tools.time.Timestamp +import com.simprints.infra.config.store.models.TokenKeyType +import com.simprints.infra.events.event.domain.models.Event +import com.simprints.infra.events.event.domain.models.EventPayload +import com.simprints.infra.events.event.domain.models.EventType +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_CONFIRMATION_V3 +import java.util.UUID + +@Keep +data class ConfirmationCalloutEventV3( + override val id: String = UUID.randomUUID().toString(), + override val payload: ConfirmationCalloutPayload, + override val type: EventType, + override var scopeId: String? = null, + override var projectId: String? = null, +) : Event() { + constructor( + createdAt: Timestamp, + projectId: String, + selectedGuid: String, + sessionId: String, + ) : this( + UUID.randomUUID().toString(), + ConfirmationCalloutPayload(createdAt, EVENT_VERSION, projectId, selectedGuid, sessionId), + CALLOUT_CONFIRMATION_V3, + ) + + override fun getTokenizableFields(): Map = emptyMap() + + override fun setTokenizedFields(map: Map) = this // No tokenized fields + + @Keep + data class ConfirmationCalloutPayload( + override val createdAt: Timestamp, + override val eventVersion: Int, + val projectId: String, + val selectedGuid: String, + val sessionId: String, + override val endedAt: Timestamp? = null, + override val type: EventType = CALLOUT_CONFIRMATION_V3, + ) : EventPayload() { + override fun toSafeString(): String = "guid: $selectedGuid, session ID: $sessionId" + } + + companion object { + const val EVENT_VERSION = 3 + } +} diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEvent.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV2.kt similarity index 96% rename from infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEvent.kt rename to infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV2.kt index 985e2ad0b4..be2f5fb8d3 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEvent.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV2.kt @@ -11,7 +11,8 @@ import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_ENROLMEN import java.util.UUID @Keep -data class EnrolmentCalloutEvent( +@Deprecated("Replaced by v3 in 2025.2.0") +data class EnrolmentCalloutEventV2( override val id: String = UUID.randomUUID().toString(), override val payload: EnrolmentCalloutPayload, override val type: EventType, diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV3.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV3.kt new file mode 100644 index 0000000000..e6959dc088 --- /dev/null +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV3.kt @@ -0,0 +1,73 @@ +package com.simprints.infra.events.event.domain.models.callout + +import androidx.annotation.Keep +import com.simprints.core.domain.tokenization.TokenizableString +import com.simprints.core.tools.time.Timestamp +import com.simprints.infra.config.store.models.TokenKeyType +import com.simprints.infra.events.event.domain.models.Event +import com.simprints.infra.events.event.domain.models.EventPayload +import com.simprints.infra.events.event.domain.models.EventType +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_ENROLMENT_V3 +import java.util.UUID + +@Keep +data class EnrolmentCalloutEventV3( + override val id: String = UUID.randomUUID().toString(), + override val payload: EnrolmentCalloutPayload, + override val type: EventType, + override var scopeId: String? = null, + override var projectId: String? = null, +) : Event() { + constructor( + createdAt: Timestamp, + projectId: String, + userId: TokenizableString, + moduleId: TokenizableString, + metadata: String?, + biometricDataSource: BiometricDataSource, + id: String = UUID.randomUUID().toString(), + ) : this( + id, + EnrolmentCalloutPayload( + createdAt = createdAt, + eventVersion = EVENT_VERSION, + projectId = projectId, + userId = userId, + moduleId = moduleId, + metadata = metadata, + biometricDataSource = biometricDataSource, + ), + CALLOUT_ENROLMENT_V3, + ) + + override fun getTokenizableFields(): Map = mapOf( + TokenKeyType.AttendantId to payload.userId, + TokenKeyType.ModuleId to payload.moduleId, + ) + + override fun setTokenizedFields(map: Map) = this.copy( + payload = payload.copy( + userId = map[TokenKeyType.AttendantId] ?: payload.userId, + moduleId = map[TokenKeyType.ModuleId] ?: payload.moduleId, + ), + ) + + @Keep + data class EnrolmentCalloutPayload( + override val createdAt: Timestamp, + override val eventVersion: Int, + val projectId: String, + val userId: TokenizableString, + val moduleId: TokenizableString, + val metadata: String?, + val biometricDataSource: BiometricDataSource, + override val endedAt: Timestamp? = null, + override val type: EventType = CALLOUT_ENROLMENT_V3, + ) : EventPayload() { + override fun toSafeString(): String = "module: $moduleId, metadata: $metadata, biometricDataSource: $biometricDataSource" + } + + companion object { + const val EVENT_VERSION = 3 + } +} diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEvent.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV2.kt similarity index 96% rename from infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEvent.kt rename to infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV2.kt index 247fa27968..283c7d5e6d 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEvent.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV2.kt @@ -11,7 +11,8 @@ import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_LAST_BIO import java.util.UUID @Keep -data class EnrolmentLastBiometricsCalloutEvent( +@Deprecated("Replaced by v3 in 2025.2.0") +data class EnrolmentLastBiometricsCalloutEventV2( override val id: String = UUID.randomUUID().toString(), override val payload: EnrolmentLastBiometricsCalloutPayload, override val type: EventType, diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV3.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV3.kt new file mode 100644 index 0000000000..8112787ce8 --- /dev/null +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV3.kt @@ -0,0 +1,72 @@ +package com.simprints.infra.events.event.domain.models.callout + +import androidx.annotation.Keep +import com.simprints.core.domain.tokenization.TokenizableString +import com.simprints.core.tools.time.Timestamp +import com.simprints.infra.config.store.models.TokenKeyType +import com.simprints.infra.events.event.domain.models.Event +import com.simprints.infra.events.event.domain.models.EventPayload +import com.simprints.infra.events.event.domain.models.EventType +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_LAST_BIOMETRICS_V3 +import java.util.UUID + +@Keep +data class EnrolmentLastBiometricsCalloutEventV3( + override val id: String = UUID.randomUUID().toString(), + override val payload: EnrolmentLastBiometricsCalloutPayload, + override val type: EventType, + override var scopeId: String? = null, + override var projectId: String? = null, +) : Event() { + constructor( + createdAt: Timestamp, + projectId: String, + userId: TokenizableString, + moduleId: TokenizableString, + metadata: String?, + sessionId: String, + ) : this( + UUID.randomUUID().toString(), + EnrolmentLastBiometricsCalloutPayload( + createdAt = createdAt, + eventVersion = EVENT_VERSION, + projectId = projectId, + userId = userId, + moduleId = moduleId, + metadata = metadata, + sessionId = sessionId, + ), + CALLOUT_LAST_BIOMETRICS_V3, + ) + + override fun getTokenizableFields(): Map = mapOf( + TokenKeyType.AttendantId to payload.userId, + TokenKeyType.ModuleId to payload.moduleId, + ) + + override fun setTokenizedFields(map: Map) = this.copy( + payload = payload.copy( + userId = map[TokenKeyType.AttendantId] ?: payload.userId, + moduleId = map[TokenKeyType.ModuleId] ?: payload.moduleId, + ), + ) + + @Keep + data class EnrolmentLastBiometricsCalloutPayload( + override val createdAt: Timestamp, + override val eventVersion: Int, + val projectId: String, + val userId: TokenizableString, + val moduleId: TokenizableString, + val metadata: String?, + val sessionId: String, + override val endedAt: Timestamp? = null, + override val type: EventType = CALLOUT_LAST_BIOMETRICS_V3, + ) : EventPayload() { + override fun toSafeString(): String = "metadata: $metadata, session ID: $sessionId" + } + + companion object { + const val EVENT_VERSION = 3 + } +} diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEvent.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV2.kt similarity index 96% rename from infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEvent.kt rename to infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV2.kt index 27af5a714a..87113448d0 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEvent.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV2.kt @@ -11,7 +11,8 @@ import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_IDENTIFI import java.util.UUID @Keep -data class IdentificationCalloutEvent( +@Deprecated("Replaced by v3 in 2025.2.0") +data class IdentificationCalloutEventV2( override val id: String = UUID.randomUUID().toString(), override val payload: IdentificationCalloutPayload, override val type: EventType, diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV3.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV3.kt new file mode 100644 index 0000000000..1855358614 --- /dev/null +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV3.kt @@ -0,0 +1,72 @@ +package com.simprints.infra.events.event.domain.models.callout + +import androidx.annotation.Keep +import com.simprints.core.domain.tokenization.TokenizableString +import com.simprints.core.tools.time.Timestamp +import com.simprints.infra.config.store.models.TokenKeyType +import com.simprints.infra.events.event.domain.models.Event +import com.simprints.infra.events.event.domain.models.EventPayload +import com.simprints.infra.events.event.domain.models.EventType +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_IDENTIFICATION_V3 +import java.util.UUID + +@Keep +data class IdentificationCalloutEventV3( + override val id: String = UUID.randomUUID().toString(), + override val payload: IdentificationCalloutPayload, + override val type: EventType, + override var scopeId: String? = null, + override var projectId: String? = null, +) : Event() { + constructor( + createdAt: Timestamp, + projectId: String, + userId: TokenizableString, + moduleId: TokenizableString, + metadata: String?, + biometricDataSource: BiometricDataSource, + ) : this( + UUID.randomUUID().toString(), + IdentificationCalloutPayload( + createdAt = createdAt, + eventVersion = EVENT_VERSION, + projectId = projectId, + userId = userId, + moduleId = moduleId, + metadata = metadata, + biometricDataSource = biometricDataSource, + ), + CALLOUT_IDENTIFICATION_V3, + ) + + override fun getTokenizableFields(): Map = mapOf( + TokenKeyType.AttendantId to payload.userId, + TokenKeyType.ModuleId to payload.moduleId, + ) + + override fun setTokenizedFields(map: Map) = this.copy( + payload = payload.copy( + userId = map[TokenKeyType.AttendantId] ?: payload.userId, + moduleId = map[TokenKeyType.ModuleId] ?: payload.moduleId, + ), + ) + + @Keep + data class IdentificationCalloutPayload( + override val createdAt: Timestamp, + override val eventVersion: Int, + val projectId: String, + val userId: TokenizableString, + val moduleId: TokenizableString, + val metadata: String?, + val biometricDataSource: BiometricDataSource, + override val endedAt: Timestamp? = null, + override val type: EventType = CALLOUT_IDENTIFICATION_V3, + ) : EventPayload() { + override fun toSafeString(): String = "module ID: $moduleId, metadata: $metadata, biometricDataSource: $biometricDataSource" + } + + companion object { + const val EVENT_VERSION = 3 + } +} diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEvent.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV2.kt similarity index 96% rename from infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEvent.kt rename to infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV2.kt index e6c3f6ffa0..b4edb7abf6 100644 --- a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEvent.kt +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV2.kt @@ -11,7 +11,8 @@ import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_VERIFICA import java.util.UUID @Keep -data class VerificationCalloutEvent( +@Deprecated("Replaced by v3 in 2025.2.0") +data class VerificationCalloutEventV2( override val id: String = UUID.randomUUID().toString(), override val payload: VerificationCalloutPayload, override val type: EventType, diff --git a/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV3.kt b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV3.kt new file mode 100644 index 0000000000..b4f9f4e303 --- /dev/null +++ b/infra/events/src/main/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV3.kt @@ -0,0 +1,75 @@ +package com.simprints.infra.events.event.domain.models.callout + +import androidx.annotation.Keep +import com.simprints.core.domain.tokenization.TokenizableString +import com.simprints.core.tools.time.Timestamp +import com.simprints.infra.config.store.models.TokenKeyType +import com.simprints.infra.events.event.domain.models.Event +import com.simprints.infra.events.event.domain.models.EventPayload +import com.simprints.infra.events.event.domain.models.EventType +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_VERIFICATION_V3 +import java.util.UUID + +@Keep +data class VerificationCalloutEventV3( + override val id: String = UUID.randomUUID().toString(), + override val payload: VerificationCalloutPayload, + override val type: EventType, + override var scopeId: String? = null, + override var projectId: String? = null, +) : Event() { + constructor( + createdAt: Timestamp, + projectId: String, + userId: TokenizableString, + moduleId: TokenizableString, + verifyGuid: String, + metadata: String, + biometricDataSource: BiometricDataSource, + ) : this( + UUID.randomUUID().toString(), + VerificationCalloutPayload( + createdAt = createdAt, + eventVersion = EVENT_VERSION, + projectId = projectId, + userId = userId, + moduleId = moduleId, + verifyGuid = verifyGuid, + metadata = metadata, + biometricDataSource = biometricDataSource, + ), + CALLOUT_VERIFICATION_V3, + ) + + override fun getTokenizableFields(): Map = mapOf( + TokenKeyType.AttendantId to payload.userId, + TokenKeyType.ModuleId to payload.moduleId, + ) + + override fun setTokenizedFields(map: Map) = this.copy( + payload = payload.copy( + userId = map[TokenKeyType.AttendantId] ?: payload.userId, + moduleId = map[TokenKeyType.ModuleId] ?: payload.moduleId, + ), + ) + + @Keep + data class VerificationCalloutPayload( + override val createdAt: Timestamp, + override val eventVersion: Int, + val projectId: String, + val userId: TokenizableString, + val moduleId: TokenizableString, + val verifyGuid: String, + val metadata: String, + val biometricDataSource: BiometricDataSource, + override val endedAt: Timestamp? = null, + override val type: EventType = CALLOUT_VERIFICATION_V3, + ) : EventPayload() { + override fun toSafeString(): String = "module ID: $moduleId, guid: $verifyGuid, metadata: $metadata, biometricDataSource: $biometricDataSource" + } + + companion object { + const val EVENT_VERSION = 3 + } +} 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..0692b9176a 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 @@ -26,11 +26,11 @@ import com.simprints.infra.events.event.domain.models.callback.ErrorCallbackEven import com.simprints.infra.events.event.domain.models.callback.IdentificationCallbackEvent import com.simprints.infra.events.event.domain.models.callback.RefusalCallbackEvent import com.simprints.infra.events.event.domain.models.callback.VerificationCallbackEvent -import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEvent -import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEvent +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV3 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV3 import com.simprints.infra.events.event.domain.models.downsync.EventDownSyncRequestEvent import com.simprints.infra.events.event.domain.models.downsync.EventDownSyncRequestEvent.QueryParameters import com.simprints.infra.events.event.domain.models.face.FaceCaptureBiometricsEvent @@ -43,6 +43,7 @@ import com.simprints.infra.events.event.domain.models.fingerprint.FingerprintCap import com.simprints.infra.events.event.domain.models.fingerprint.FingerprintCaptureEvent import com.simprints.infra.events.sampledata.FACE_TEMPLATE_FORMAT import com.simprints.infra.events.sampledata.SampleDefaults.CREATED_AT +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_BIOMETRIC_DATA_SOURCE import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_METADATA import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_MODULE_ID import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_PROJECT_ID @@ -83,15 +84,16 @@ class EventPayloadTest { createdAt = CREATED_AT, score = CallbackComparisonScore(GUID1, 1, AppMatchConfidence.NONE), ), - ConfirmationCalloutEvent(CREATED_AT, DEFAULT_PROJECT_ID, GUID1, GUID2), - EnrolmentCalloutEvent( + ConfirmationCalloutEventV3(CREATED_AT, DEFAULT_PROJECT_ID, GUID1, GUID2), + EnrolmentCalloutEventV3( createdAt = CREATED_AT, projectId = DEFAULT_PROJECT_ID, userId = DEFAULT_USER_ID, moduleId = DEFAULT_MODULE_ID, metadata = DEFAULT_METADATA, + biometricDataSource = DEFAULT_BIOMETRIC_DATA_SOURCE, ), - EnrolmentLastBiometricsCalloutEvent( + EnrolmentLastBiometricsCalloutEventV3( createdAt = CREATED_AT, projectId = DEFAULT_PROJECT_ID, userId = DEFAULT_USER_ID, @@ -99,20 +101,22 @@ class EventPayloadTest { metadata = DEFAULT_METADATA, sessionId = GUID1, ), - IdentificationCalloutEvent( + IdentificationCalloutEventV3( createdAt = CREATED_AT, projectId = DEFAULT_PROJECT_ID, userId = DEFAULT_USER_ID, moduleId = DEFAULT_MODULE_ID, metadata = DEFAULT_METADATA, + biometricDataSource = DEFAULT_BIOMETRIC_DATA_SOURCE, ), - VerificationCalloutEvent( + VerificationCalloutEventV3( createdAt = CREATED_AT, projectId = DEFAULT_PROJECT_ID, userId = DEFAULT_USER_ID, moduleId = DEFAULT_MODULE_ID, verifyGuid = GUID1, metadata = DEFAULT_METADATA, + biometricDataSource = DEFAULT_BIOMETRIC_DATA_SOURCE, ), EventDownSyncRequestEvent( createdAt = CREATED_AT, 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/ConfirmationCalloutEventV2Test.kt similarity index 74% rename from infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventTest.kt rename to infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventV2Test.kt index 1ff0722a31..270fea4498 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/ConfirmationCalloutEventV2Test.kt @@ -3,7 +3,7 @@ package com.simprints.infra.events.event.domain.models.callout import androidx.annotation.Keep 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.event.domain.models.callout.ConfirmationCalloutEventV2.Companion.EVENT_VERSION import com.simprints.infra.events.sampledata.SampleDefaults.CREATED_AT import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_PROJECT_ID import com.simprints.infra.events.sampledata.SampleDefaults.GUID1 @@ -11,10 +11,10 @@ import com.simprints.infra.events.sampledata.SampleDefaults.GUID2 import org.junit.Test @Keep -class ConfirmationCalloutEventTest { +class ConfirmationCalloutEventV2Test { @Test fun create_ConfirmationCalloutEvent() { - val event = ConfirmationCalloutEvent(CREATED_AT, DEFAULT_PROJECT_ID, GUID1, GUID2) + val event = ConfirmationCalloutEventV2(CREATED_AT, DEFAULT_PROJECT_ID, GUID1, GUID2) assertThat(event.id).isNotNull() assertThat(event.type).isEqualTo(CALLOUT_CONFIRMATION) @@ -27,4 +27,11 @@ class ConfirmationCalloutEventTest { assertThat(sessionId).isEqualTo(GUID2) } } + + @Test + fun getTokenizableFields_returnsEmptyMap() { + val event = ConfirmationCalloutEventV2(CREATED_AT, DEFAULT_PROJECT_ID, GUID1, GUID2) + + assertThat(event.getTokenizableFields()).isEmpty() + } } diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventV3Test.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventV3Test.kt new file mode 100644 index 0000000000..b7c863b6df --- /dev/null +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/ConfirmationCalloutEventV3Test.kt @@ -0,0 +1,37 @@ +package com.simprints.infra.events.event.domain.models.callout + +import androidx.annotation.Keep +import com.google.common.truth.Truth.assertThat +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_CONFIRMATION_V3 +import com.simprints.infra.events.event.domain.models.callout.ConfirmationCalloutEventV3.Companion.EVENT_VERSION +import com.simprints.infra.events.sampledata.SampleDefaults.CREATED_AT +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 +import org.junit.Test + +@Keep +class ConfirmationCalloutEventV3Test { + @Test + fun create_ConfirmationCalloutEvent() { + val event = ConfirmationCalloutEventV3(CREATED_AT, DEFAULT_PROJECT_ID, GUID1, GUID2) + + assertThat(event.id).isNotNull() + assertThat(event.type).isEqualTo(CALLOUT_CONFIRMATION_V3) + with(event.payload) { + assertThat(createdAt).isEqualTo(CREATED_AT) + assertThat(eventVersion).isEqualTo(EVENT_VERSION) + assertThat(type).isEqualTo(CALLOUT_CONFIRMATION_V3) + assertThat(projectId).isEqualTo(DEFAULT_PROJECT_ID) + assertThat(selectedGuid).isEqualTo(GUID1) + assertThat(sessionId).isEqualTo(GUID2) + } + } + + @Test + fun getTokenizableFields_returnsEmptyMap() { + val event = ConfirmationCalloutEventV3(CREATED_AT, DEFAULT_PROJECT_ID, GUID1, GUID2) + + assertThat(event.getTokenizableFields()).isEmpty() + } +} diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventTest.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV2Test.kt similarity index 65% rename from infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventTest.kt rename to infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV2Test.kt index 88f12720a2..33af3b1b9f 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV2Test.kt @@ -2,8 +2,9 @@ package com.simprints.infra.events.event.domain.models.callout import androidx.annotation.Keep import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_ENROLMENT -import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEvent.Companion.EVENT_VERSION +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV2.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_MODULE_ID @@ -12,10 +13,10 @@ import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_USER_ID import org.junit.Test @Keep -class EnrolmentCalloutEventTest { +class EnrolmentCalloutEventV2Test { @Test fun create_EnrolmentCalloutEvent() { - val event = EnrolmentCalloutEvent( + val event = EnrolmentCalloutEventV2( createdAt = CREATED_AT, projectId = DEFAULT_PROJECT_ID, userId = DEFAULT_USER_ID, @@ -35,4 +36,20 @@ class EnrolmentCalloutEventTest { assertThat(metadata).isEqualTo(DEFAULT_METADATA) } } + + @Test + fun getTokenizableFields_returnsMapWithAttendantAndModuleId() { + val event = EnrolmentCalloutEventV2( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + metadata = DEFAULT_METADATA, + ) + val tokenizableFields = event.getTokenizableFields() + + assertThat(tokenizableFields).hasSize(2) + assertThat(tokenizableFields[TokenKeyType.AttendantId]).isEqualTo(DEFAULT_USER_ID) + assertThat(tokenizableFields[TokenKeyType.ModuleId]).isEqualTo(DEFAULT_MODULE_ID) + } } diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV3Test.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV3Test.kt new file mode 100644 index 0000000000..a9f7a6e1ee --- /dev/null +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentCalloutEventV3Test.kt @@ -0,0 +1,59 @@ +package com.simprints.infra.events.event.domain.models.callout + +import androidx.annotation.Keep +import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.models.TokenKeyType +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_ENROLMENT_V3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentCalloutEventV3.Companion.EVENT_VERSION +import com.simprints.infra.events.sampledata.SampleDefaults.CREATED_AT +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_BIOMETRIC_DATA_SOURCE +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_METADATA +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_MODULE_ID +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_PROJECT_ID +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_USER_ID +import org.junit.Test + +@Keep +class EnrolmentCalloutEventV3Test { + @Test + fun create_EnrolmentCalloutEvent() { + val event = EnrolmentCalloutEventV3( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + metadata = DEFAULT_METADATA, + biometricDataSource = DEFAULT_BIOMETRIC_DATA_SOURCE, + ) + + assertThat(event.id).isNotNull() + assertThat(event.type).isEqualTo(CALLOUT_ENROLMENT_V3) + with(event.payload) { + assertThat(createdAt).isEqualTo(CREATED_AT) + assertThat(eventVersion).isEqualTo(EVENT_VERSION) + assertThat(type).isEqualTo(CALLOUT_ENROLMENT_V3) + assertThat(projectId).isEqualTo(DEFAULT_PROJECT_ID) + assertThat(userId).isEqualTo(DEFAULT_USER_ID) + assertThat(moduleId).isEqualTo(DEFAULT_MODULE_ID) + assertThat(metadata).isEqualTo(DEFAULT_METADATA) + assertThat(biometricDataSource).isEqualTo(DEFAULT_BIOMETRIC_DATA_SOURCE) + } + } + + @Test + fun getTokenizableFields_returnsMapWithAttendantAndModuleId() { + val event = EnrolmentCalloutEventV3( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + metadata = DEFAULT_METADATA, + biometricDataSource = DEFAULT_BIOMETRIC_DATA_SOURCE, + ) + val tokenizableFields = event.getTokenizableFields() + + assertThat(tokenizableFields).hasSize(2) + assertThat(tokenizableFields[TokenKeyType.AttendantId]).isEqualTo(DEFAULT_USER_ID) + assertThat(tokenizableFields[TokenKeyType.ModuleId]).isEqualTo(DEFAULT_MODULE_ID) + } +} diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventTest.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV2Test.kt similarity index 64% rename from infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventTest.kt rename to infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV2Test.kt index 49bd9571a1..882043b9d9 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV2Test.kt @@ -2,8 +2,9 @@ package com.simprints.infra.events.event.domain.models.callout import androidx.annotation.Keep import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_LAST_BIOMETRICS -import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEvent.Companion.EVENT_VERSION +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV2.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_MODULE_ID @@ -13,10 +14,10 @@ import com.simprints.infra.events.sampledata.SampleDefaults.GUID1 import org.junit.Test @Keep -class EnrolmentLastBiometricsCalloutEventTest { +class EnrolmentLastBiometricsCalloutEventV2Test { @Test fun create_EnrolmentLastBiometricsCalloutEvent() { - val event = EnrolmentLastBiometricsCalloutEvent( + val event = EnrolmentLastBiometricsCalloutEventV2( createdAt = CREATED_AT, projectId = DEFAULT_PROJECT_ID, userId = DEFAULT_USER_ID, @@ -37,4 +38,21 @@ class EnrolmentLastBiometricsCalloutEventTest { assertThat(metadata).isEqualTo(DEFAULT_METADATA) } } + + @Test + fun getTokenizableFields_returnsMapWithAttendantAndModuleId() { + val event = EnrolmentLastBiometricsCalloutEventV2( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + metadata = DEFAULT_METADATA, + sessionId = GUID1, + ) + val tokenizableFields = event.getTokenizableFields() + + assertThat(tokenizableFields).hasSize(2) + assertThat(tokenizableFields[TokenKeyType.AttendantId]).isEqualTo(DEFAULT_USER_ID) + assertThat(tokenizableFields[TokenKeyType.ModuleId]).isEqualTo(DEFAULT_MODULE_ID) + } } diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV3Test.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV3Test.kt new file mode 100644 index 0000000000..dd3d30fd87 --- /dev/null +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/EnrolmentLastBiometricsCalloutEventV3Test.kt @@ -0,0 +1,58 @@ +package com.simprints.infra.events.event.domain.models.callout + +import androidx.annotation.Keep +import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.models.TokenKeyType +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_LAST_BIOMETRICS_V3 +import com.simprints.infra.events.event.domain.models.callout.EnrolmentLastBiometricsCalloutEventV3.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_MODULE_ID +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_PROJECT_ID +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_USER_ID +import com.simprints.infra.events.sampledata.SampleDefaults.GUID1 +import org.junit.Test + +@Keep +class EnrolmentLastBiometricsCalloutEventV3Test { + @Test + fun create_EnrolmentLastBiometricsCalloutEvent() { + val event = EnrolmentLastBiometricsCalloutEventV3( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + metadata = DEFAULT_METADATA, + sessionId = GUID1, + ) + + assertThat(event.id).isNotNull() + assertThat(event.type).isEqualTo(CALLOUT_LAST_BIOMETRICS_V3) + with(event.payload) { + assertThat(createdAt).isEqualTo(CREATED_AT) + assertThat(eventVersion).isEqualTo(EVENT_VERSION) + assertThat(type).isEqualTo(CALLOUT_LAST_BIOMETRICS_V3) + assertThat(projectId).isEqualTo(DEFAULT_PROJECT_ID) + assertThat(userId).isEqualTo(DEFAULT_USER_ID) + assertThat(moduleId).isEqualTo(DEFAULT_MODULE_ID) + assertThat(metadata).isEqualTo(DEFAULT_METADATA) + } + } + + @Test + fun getTokenizableFields_returnsMapWithAttendantAndModuleId() { + val event = EnrolmentLastBiometricsCalloutEventV3( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + metadata = DEFAULT_METADATA, + sessionId = GUID1, + ) + val tokenizableFields = event.getTokenizableFields() + + assertThat(tokenizableFields).hasSize(2) + assertThat(tokenizableFields[TokenKeyType.AttendantId]).isEqualTo(DEFAULT_USER_ID) + assertThat(tokenizableFields[TokenKeyType.ModuleId]).isEqualTo(DEFAULT_MODULE_ID) + } +} diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventTest.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV2Test.kt similarity index 64% rename from infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventTest.kt rename to infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV2Test.kt index 8b9b21cb2d..9e2ed788bd 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV2Test.kt @@ -2,8 +2,9 @@ package com.simprints.infra.events.event.domain.models.callout import androidx.annotation.Keep import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_IDENTIFICATION -import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEvent.Companion.EVENT_VERSION +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV2.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_MODULE_ID @@ -12,10 +13,10 @@ import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_USER_ID import org.junit.Test @Keep -class IdentificationCalloutEventTest { +class IdentificationCalloutEventV2Test { @Test fun create_IdentificationCalloutEvent() { - val event = IdentificationCalloutEvent( + val event = IdentificationCalloutEventV2( createdAt = CREATED_AT, projectId = DEFAULT_PROJECT_ID, userId = DEFAULT_USER_ID, @@ -35,4 +36,20 @@ class IdentificationCalloutEventTest { assertThat(metadata).isEqualTo(DEFAULT_METADATA) } } + + @Test + fun getTokenizableFields_returnsMapWithAttendantAndModuleId() { + val event = IdentificationCalloutEventV2( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + metadata = DEFAULT_METADATA, + ) + val tokenizableFields = event.getTokenizableFields() + + assertThat(tokenizableFields).hasSize(2) + assertThat(tokenizableFields[TokenKeyType.AttendantId]).isEqualTo(DEFAULT_USER_ID) + assertThat(tokenizableFields[TokenKeyType.ModuleId]).isEqualTo(DEFAULT_MODULE_ID) + } } diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV3Test.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV3Test.kt new file mode 100644 index 0000000000..a8f75828c1 --- /dev/null +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/IdentificationCalloutEventV3Test.kt @@ -0,0 +1,59 @@ +package com.simprints.infra.events.event.domain.models.callout + +import androidx.annotation.Keep +import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.models.TokenKeyType +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_IDENTIFICATION_V3 +import com.simprints.infra.events.event.domain.models.callout.IdentificationCalloutEventV3.Companion.EVENT_VERSION +import com.simprints.infra.events.sampledata.SampleDefaults.CREATED_AT +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_BIOMETRIC_DATA_SOURCE +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_METADATA +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_MODULE_ID +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_PROJECT_ID +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_USER_ID +import org.junit.Test + +@Keep +class IdentificationCalloutEventV3Test { + @Test + fun create_IdentificationCalloutEvent() { + val event = IdentificationCalloutEventV3( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + metadata = DEFAULT_METADATA, + biometricDataSource = DEFAULT_BIOMETRIC_DATA_SOURCE, + ) + + assertThat(event.id).isNotNull() + assertThat(event.type).isEqualTo(CALLOUT_IDENTIFICATION_V3) + with(event.payload) { + assertThat(createdAt).isEqualTo(CREATED_AT) + assertThat(eventVersion).isEqualTo(EVENT_VERSION) + assertThat(type).isEqualTo(CALLOUT_IDENTIFICATION_V3) + assertThat(projectId).isEqualTo(DEFAULT_PROJECT_ID) + assertThat(userId).isEqualTo(DEFAULT_USER_ID) + assertThat(moduleId).isEqualTo(DEFAULT_MODULE_ID) + assertThat(metadata).isEqualTo(DEFAULT_METADATA) + assertThat(biometricDataSource).isEqualTo(DEFAULT_BIOMETRIC_DATA_SOURCE) + } + } + + @Test + fun getTokenizableFields_returnsMapWithAttendantAndModuleId() { + val event = IdentificationCalloutEventV3( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + metadata = DEFAULT_METADATA, + biometricDataSource = DEFAULT_BIOMETRIC_DATA_SOURCE, + ) + val tokenizableFields = event.getTokenizableFields() + + assertThat(tokenizableFields).hasSize(2) + assertThat(tokenizableFields[TokenKeyType.AttendantId]).isEqualTo(DEFAULT_USER_ID) + assertThat(tokenizableFields[TokenKeyType.ModuleId]).isEqualTo(DEFAULT_MODULE_ID) + } +} diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventTest.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV2Test.kt similarity index 66% rename from infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventTest.kt rename to infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV2Test.kt index d55585552a..abf4ceb591 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV2Test.kt @@ -2,8 +2,9 @@ package com.simprints.infra.events.event.domain.models.callout import androidx.annotation.Keep import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.models.TokenKeyType import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_VERIFICATION -import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEvent.Companion.EVENT_VERSION +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV2.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_MODULE_ID @@ -13,10 +14,10 @@ import com.simprints.infra.events.sampledata.SampleDefaults.GUID1 import org.junit.Test @Keep -class VerificationCalloutEventTest { +class VerificationCalloutEventV2Test { @Test fun create_VerificationCalloutEvent() { - val event = VerificationCalloutEvent( + val event = VerificationCalloutEventV2( createdAt = CREATED_AT, projectId = DEFAULT_PROJECT_ID, userId = DEFAULT_USER_ID, @@ -38,4 +39,21 @@ class VerificationCalloutEventTest { assertThat(metadata).isEqualTo(DEFAULT_METADATA) } } + + @Test + fun getTokenizableFields_returnsMapWithAttendantAndModuleId() { + val event = VerificationCalloutEventV2( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + verifyGuid = GUID1, + metadata = DEFAULT_METADATA, + ) + val tokenizableFields = event.getTokenizableFields() + + assertThat(tokenizableFields).hasSize(2) + assertThat(tokenizableFields[TokenKeyType.AttendantId]).isEqualTo(DEFAULT_USER_ID) + assertThat(tokenizableFields[TokenKeyType.ModuleId]).isEqualTo(DEFAULT_MODULE_ID) + } } diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV3Test.kt b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV3Test.kt new file mode 100644 index 0000000000..f164359703 --- /dev/null +++ b/infra/events/src/test/java/com/simprints/infra/events/event/domain/models/callout/VerificationCalloutEventV3Test.kt @@ -0,0 +1,63 @@ +package com.simprints.infra.events.event.domain.models.callout + +import androidx.annotation.Keep +import com.google.common.truth.Truth.assertThat +import com.simprints.infra.config.store.models.TokenKeyType +import com.simprints.infra.events.event.domain.models.EventType.CALLOUT_VERIFICATION_V3 +import com.simprints.infra.events.event.domain.models.callout.VerificationCalloutEventV3.Companion.EVENT_VERSION +import com.simprints.infra.events.sampledata.SampleDefaults.CREATED_AT +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_BIOMETRIC_DATA_SOURCE +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_METADATA +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_MODULE_ID +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_PROJECT_ID +import com.simprints.infra.events.sampledata.SampleDefaults.DEFAULT_USER_ID +import com.simprints.infra.events.sampledata.SampleDefaults.GUID1 +import org.junit.Test + +@Keep +class VerificationCalloutEventV3Test { + @Test + fun create_VerificationCalloutEvent() { + val event = VerificationCalloutEventV3( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + verifyGuid = GUID1, + metadata = DEFAULT_METADATA, + biometricDataSource = DEFAULT_BIOMETRIC_DATA_SOURCE, + ) + + assertThat(event.id).isNotNull() + assertThat(event.type).isEqualTo(CALLOUT_VERIFICATION_V3) + with(event.payload) { + assertThat(createdAt).isEqualTo(CREATED_AT) + assertThat(eventVersion).isEqualTo(EVENT_VERSION) + assertThat(type).isEqualTo(CALLOUT_VERIFICATION_V3) + assertThat(projectId).isEqualTo(DEFAULT_PROJECT_ID) + assertThat(userId).isEqualTo(DEFAULT_USER_ID) + assertThat(moduleId).isEqualTo(DEFAULT_MODULE_ID) + assertThat(verifyGuid).isEqualTo(GUID1) + assertThat(metadata).isEqualTo(DEFAULT_METADATA) + assertThat(biometricDataSource).isEqualTo(DEFAULT_BIOMETRIC_DATA_SOURCE) + } + } + + @Test + fun getTokenizableFields_returnsMapWithAttendantAndModuleId() { + val event = VerificationCalloutEventV3( + createdAt = CREATED_AT, + projectId = DEFAULT_PROJECT_ID, + userId = DEFAULT_USER_ID, + moduleId = DEFAULT_MODULE_ID, + verifyGuid = GUID1, + metadata = DEFAULT_METADATA, + biometricDataSource = DEFAULT_BIOMETRIC_DATA_SOURCE, + ) + val tokenizableFields = event.getTokenizableFields() + + assertThat(tokenizableFields).hasSize(2) + assertThat(tokenizableFields[TokenKeyType.AttendantId]).isEqualTo(DEFAULT_USER_ID) + assertThat(tokenizableFields[TokenKeyType.ModuleId]).isEqualTo(DEFAULT_MODULE_ID) + } +} diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/local/migrations/EventMigrationTest.kt b/infra/events/src/test/java/com/simprints/infra/events/event/local/migrations/EventMigrationTest.kt index b7d3a9f7a9..8410831378 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/local/migrations/EventMigrationTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/local/migrations/EventMigrationTest.kt @@ -34,7 +34,7 @@ class EventMigrationTest { EventRoomDatabase::class.java, ) - private val allEventTypes = EventType.values() + private val allEventTypes = EventType.entries @Test fun `validate all the migrations are successful`() { diff --git a/infra/events/src/test/java/com/simprints/infra/events/event/local/models/DbEventTest.kt b/infra/events/src/test/java/com/simprints/infra/events/event/local/models/DbEventTest.kt index 6ac2d637d4..2679cb3a94 100644 --- a/infra/events/src/test/java/com/simprints/infra/events/event/local/models/DbEventTest.kt +++ b/infra/events/src/test/java/com/simprints/infra/events/event/local/models/DbEventTest.kt @@ -58,7 +58,7 @@ class DbEventTest { @Test fun convert_ConfirmationCalloutEvent() { - val original = createConfirmationCalloutEvent() + val original = createConfirmationCalloutEventV3() val transformed = original.fromDomainToDb().fromDbToDomain() assertThat(original).isEqualTo(transformed) @@ -66,7 +66,7 @@ class DbEventTest { @Test fun convert_EnrolmentCalloutEvent() { - val original = createEnrolmentCalloutEvent() + val original = createEnrolmentCalloutEventV3() val transformed = original.fromDomainToDb().fromDbToDomain() assertThat(original).isEqualTo(transformed) @@ -74,7 +74,7 @@ class DbEventTest { @Test fun convert_EnrolmentLastBiometricsCalloutEvent() { - val original = createLastBiometricsEnrolmentCalloutEvent() + val original = createLastBiometricsEnrolmentCalloutEventV3() val transformed = original.fromDomainToDb().fromDbToDomain() assertThat(original).isEqualTo(transformed) @@ -82,7 +82,7 @@ class DbEventTest { @Test fun convert_IdentificationCalloutEvent() { - val original = createIdentificationCalloutEvent() + val original = createIdentificationCalloutEventV3() val transformed = original.fromDomainToDb().fromDbToDomain() assertThat(original).isEqualTo(transformed) @@ -90,7 +90,7 @@ class DbEventTest { @Test fun convert_VerificationCalloutEvent() { - val original = createVerificationCalloutEvent() + val original = createVerificationCalloutEventV3() val transformed = original.fromDomainToDb().fromDbToDomain() assertThat(original).isEqualTo(transformed) diff --git a/infra/events/src/test/resources/all-events/callout_confirmation_v3.json b/infra/events/src/test/resources/all-events/callout_confirmation_v3.json new file mode 100644 index 0000000000..823d531987 --- /dev/null +++ b/infra/events/src/test/resources/all-events/callout_confirmation_v3.json @@ -0,0 +1,19 @@ +{ + "id": "a1e2c3d4-5678-4f9a-bcde-1234567890ab", + "type": "CALLOUT_CONFIRMATION_V3", + "labels": { + "projectId": "TEST6Oai41ps1pBNrzBL", + "sessionId": "e35c39f9-b81e-48f2-97e7-46ecc8399bb4", + "deviceId": "f2fd8393c0a0be67" + }, + "payload": { + "type": "CALLOUT_CONFIRMATION_V3", + "eventVersion": 1, + "createdAt": 95145678901, + "endedAt": 0, + "projectId": "TEST6Oai41ps1pBNrzBL", + "sessionId": "e35c39f9-b81e-48f2-97e7-46ecc8399bb4", + "selectedGuid": "7c815bb6-b536-4090-b625-c831d544074b", + "biometricDataSource": "SIMPRINTS" + } +} diff --git a/infra/events/src/test/resources/all-events/callout_enrolment_last_biometrics_v3.json b/infra/events/src/test/resources/all-events/callout_enrolment_last_biometrics_v3.json new file mode 100644 index 0000000000..55597de5e7 --- /dev/null +++ b/infra/events/src/test/resources/all-events/callout_enrolment_last_biometrics_v3.json @@ -0,0 +1,27 @@ +{ + "id": "c3e4f5d6-789a-4bcd-ef01-3456789021cd", + "type": "CALLOUT_LAST_BIOMETRICS_V3", + "labels": { + "projectId": "TEST6Oai41ps1pBNrzBL", + "sessionId": "e35c39f9-b81e-48f2-97e7-46ecc8399bb4", + "deviceId": "f2fd8393c0a0be67" + }, + "payload": { + "type": "CALLOUT_LAST_BIOMETRICS_V3", + "eventVersion": 1, + "createdAt": 43145678901, + "endedAt": 0, + "projectId": "TEST6Oai41ps1pBNrzBL", + "userId": { + "className": "TokenizableString.Raw", + "value": "user1" + }, + "moduleId": { + "className": "TokenizableString.Raw", + "value": "module1" + }, + "sessionId": "e35c39f9-b81e-48f2-97e7-46ecc8399bb4", + "metadata": "test", + "biometricDataSource": "SIMPRINTS" + } +} diff --git a/infra/events/src/test/resources/all-events/callout_enrolment_v3.json b/infra/events/src/test/resources/all-events/callout_enrolment_v3.json new file mode 100644 index 0000000000..f8b8843199 --- /dev/null +++ b/infra/events/src/test/resources/all-events/callout_enrolment_v3.json @@ -0,0 +1,26 @@ +{ + "id": "b2f3e4c5-6789-4fab-cdef-2345678901bc", + "type": "CALLOUT_ENROLMENT_V3", + "labels": { + "projectId": "TEST6Oai41ps1pBNrzBL", + "sessionId": "e35c39f9-b81e-48f2-97e7-46ecc8399bb4", + "deviceId": "f2fd8393c0a0be67" + }, + "payload": { + "type": "CALLOUT_ENROLMENT_V3", + "eventVersion": 1, + "createdAt": 65145678901, + "endedAt": 0, + "projectId": "TEST6Oai41ps1pBNrzBL", + "userId": { + "className": "TokenizableString.Raw", + "value": "user1" + }, + "moduleId": { + "className": "TokenizableString.Raw", + "value": "module1" + }, + "metadata": "test", + "biometricDataSource": "SIMPRINTS" + } +} diff --git a/infra/events/src/test/resources/all-events/callout_identification_v3.json b/infra/events/src/test/resources/all-events/callout_identification_v3.json new file mode 100644 index 0000000000..d4e379ca8c --- /dev/null +++ b/infra/events/src/test/resources/all-events/callout_identification_v3.json @@ -0,0 +1,26 @@ +{ + "id": "d4f5e6a7-89ab-4cde-f012-4567890132de", + "type": "CALLOUT_IDENTIFICATION_V3", + "labels": { + "projectId": "TEST6Oai41ps1pBNrzBL", + "sessionId": "e35c39f9-b81e-48f2-97e7-46ecc8399bb4", + "deviceId": "f2fd8393c0a0be67" + }, + "payload": { + "type": "CALLOUT_IDENTIFICATION_V3", + "eventVersion": 1, + "createdAt": 65142378901, + "endedAt": 0, + "projectId": "TEST6Oai41ps1pBNrzBL", + "userId": { + "className": "TokenizableString.Raw", + "value": "user1" + }, + "moduleId": { + "className": "TokenizableString.Raw", + "value": "module1" + }, + "metadata": "test", + "biometricDataSource": "SIMPRINTS" + } +} diff --git a/infra/events/src/test/resources/all-events/callout_verification_v3.json b/infra/events/src/test/resources/all-events/callout_verification_v3.json new file mode 100644 index 0000000000..36b7288fd4 --- /dev/null +++ b/infra/events/src/test/resources/all-events/callout_verification_v3.json @@ -0,0 +1,27 @@ +{ + "id": "e5a6b7c8-90bc-4def-1234-5678901432ef", + "type": "CALLOUT_VERIFICATION_V3", + "labels": { + "projectId": "TEST6Oai41ps1pBNrzBL", + "sessionId": "e35c39f9-b81e-48f2-97e7-46ecc8399bb4", + "deviceId": "f2fd8393c0a0be67" + }, + "payload": { + "type": "CALLOUT_VERIFICATION_V3", + "eventVersion": 1, + "createdAt": 65145678901, + "endedAt": 0, + "projectId": "TEST6Oai41ps1pBNrzBL", + "userId": { + "className": "TokenizableString.Raw", + "value": "user1" + }, + "moduleId": { + "className": "TokenizableString.Raw", + "value": "module1" + }, + "verifyGuid": "7a424bbc-0c40-459d-a4b8-e61dcc42979e", + "metadata": "test", + "biometricDataSource": "SIMPRINTS" + } +}