Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.simprints.feature.enrollast.screen.usecase.BuildSubjectUseCase
import com.simprints.feature.enrollast.screen.usecase.CheckForDuplicateEnrolmentsUseCase
import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential
import com.simprints.feature.externalcredential.screens.search.model.toExternalCredential
import com.simprints.feature.externalcredential.usecase.ResetExternalCredentialsInSessionUseCase
import com.simprints.infra.config.store.models.TokenKeyType
import com.simprints.infra.config.store.tokenization.TokenizationProcessor
import com.simprints.infra.config.sync.ConfigManager
Expand All @@ -42,6 +43,7 @@ internal class EnrolLastBiometricViewModel @Inject constructor(
private val checkForDuplicateEnrolments: CheckForDuplicateEnrolmentsUseCase,
private val tokenizationProcessor: TokenizationProcessor,
private val buildSubject: BuildSubjectUseCase,
private val resetEnrolmentUpdateEventsFromSession: ResetExternalCredentialsInSessionUseCase,
) : ViewModel() {
val finish: LiveData<LiveDataEventWithContent<EnrolLastState>>
get() = _finish
Expand Down Expand Up @@ -96,7 +98,7 @@ internal class EnrolLastBiometricViewModel @Inject constructor(

try {
val subject = buildSubject(params, isAddingCredential = isAddingCredential)
registerEvent(subject)
registerEvent(params, subject)
enrolmentRecordRepository.performActions(listOf(SubjectAction.Creation(subject)), project)
_finish.send(EnrolLastState.Success(subject.subjectId, scannedCredential?.toExternalCredential(subject.subjectId)))
} catch (t: Throwable) {
Expand Down Expand Up @@ -137,10 +139,15 @@ internal class EnrolLastBiometricViewModel @Inject constructor(
private fun getPreviousEnrolmentResult(steps: List<EnrolLastBiometricStepResult>) =
steps.filterIsInstance<EnrolLastBiometricStepResult.EnrolLastBiometricsResult>().firstOrNull()

private suspend fun registerEvent(subject: Subject) {
private suspend fun registerEvent(
params: EnrolLastBiometricParams,
subject: Subject,
) {
Simber.d("Register events for enrolments", tag = ENROLMENT)
val events = eventRepository
.getEventsInCurrentSession()
val events = eventRepository.getEventsInCurrentSession()

// Ensures that any previous confirmations are removed from session
resetEnrolmentUpdateEventsFromSession(params.projectId)

val biometricReferenceIds = events
.filterIsInstance<BiometricReferenceCreationEvent>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.simprints.feature.enrollast.EnrolLastBiometricStepResult
import com.simprints.feature.enrollast.screen.usecase.BuildSubjectUseCase
import com.simprints.feature.enrollast.screen.usecase.CheckForDuplicateEnrolmentsUseCase
import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential
import com.simprints.feature.externalcredential.usecase.ResetExternalCredentialsInSessionUseCase
import com.simprints.infra.config.store.models.Project
import com.simprints.infra.config.store.models.ProjectConfiguration
import com.simprints.infra.config.store.models.TokenKeyType
Expand Down Expand Up @@ -71,6 +72,9 @@ internal class EnrolLastBiometricViewModelTest {
@MockK
lateinit var tokenizationProcessor: TokenizationProcessor

@MockK
lateinit var resetEnrolmentUpdateEventsFromSession: ResetExternalCredentialsInSessionUseCase

private lateinit var viewModel: EnrolLastBiometricViewModel
private val guidToEnrol = "guidToEnrol"

Expand All @@ -87,6 +91,7 @@ internal class EnrolLastBiometricViewModelTest {
coEvery { eventRepository.getEventsInCurrentSession() } returns listOf(
mockk<PersonCreationEvent> { every { id } returns SESSION_ID },
)
coJustRun { resetEnrolmentUpdateEventsFromSession.invoke(any()) }

every { subject.subjectId } returns guidToEnrol

Expand All @@ -98,6 +103,7 @@ internal class EnrolLastBiometricViewModelTest {
checkForDuplicateEnrolments = checkForDuplicateEnrolments,
tokenizationProcessor = tokenizationProcessor,
buildSubject = buildSubject,
resetEnrolmentUpdateEventsFromSession = resetEnrolmentUpdateEventsFromSession,
)
}

Expand Down Expand Up @@ -254,6 +260,7 @@ internal class EnrolLastBiometricViewModelTest {

viewModel.enrolBiometric(createParams(listOf()), isAddingCredential = false)

coVerify { resetEnrolmentUpdateEventsFromSession.invoke(any(), any()) }
coVerify {
eventRepository.addOrUpdateEvent(
withArg {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.simprints.feature.externalcredential.usecase

import com.simprints.core.SessionCoroutineScope
import com.simprints.core.tools.extentions.isValidGuid
import com.simprints.feature.externalcredential.screens.search.model.ScannedCredential
import com.simprints.feature.externalcredential.screens.search.model.toExternalCredential
import com.simprints.infra.config.sync.ConfigManager
import com.simprints.infra.enrolment.records.repository.EnrolmentRecordRepository
import com.simprints.infra.enrolment.records.repository.domain.models.SubjectAction
import com.simprints.infra.events.event.domain.models.EnrolmentUpdateEvent
import com.simprints.infra.events.session.SessionEventRepository
import kotlinx.coroutines.CoroutineScope
import javax.inject.Inject

class ResetExternalCredentialsInSessionUseCase @Inject() constructor(
private val enrolmentRecordRepository: EnrolmentRecordRepository,
private val configManager: ConfigManager,
private val eventRepository: SessionEventRepository,
@SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope,
) {
suspend operator fun invoke(
projectId: String,
scannedCredential: ScannedCredential? = null,
subjectId: String = "",
) {
val enrolmentUpdateEvents = eventRepository
.getEventsInCurrentSession()
.filterIsInstance<EnrolmentUpdateEvent>()

// Within a session the external credentials can be linked to a single subject only,
// therefore we must ensure that on consecutive confirmation the previous links are reverted.
val credentialsToRemove = enrolmentUpdateEvents.map {
SubjectAction.Update(
subjectId = it.payload.subjectId,
faceSamplesToAdd = emptyList(),
fingerprintSamplesToAdd = emptyList(),
referenceIdsToRemove = emptyList(),
externalCredentialsToAdd = emptyList(),
externalCredentialIdsToRemove = it.payload.externalCredentialIdsToAdd,
)
}

val validSubjectId = subjectId.takeIf { it.isValidGuid() }
val credentialsToAdd = if (validSubjectId != null && scannedCredential != null) {
listOf(
SubjectAction.Update(
subjectId = subjectId,
faceSamplesToAdd = emptyList(),
fingerprintSamplesToAdd = emptyList(),
referenceIdsToRemove = emptyList(),
externalCredentialsToAdd = listOf(scannedCredential.toExternalCredential(validSubjectId)),
externalCredentialIdsToRemove = emptyList(),
),
)
} else {
emptyList()
}

val project = configManager.getProject(projectId)
val updateActions = credentialsToRemove + credentialsToAdd
enrolmentRecordRepository.performActions(updateActions, project)

// Since we are potentially linking the credentials to a new subject, previous updates must be deleted
with(sessionCoroutineScope) { eventRepository.deleteEvents(enrolmentUpdateEvents) }
}
}

This file was deleted.

Loading