From 58f91b1ddf6bed909ee153cd085c101bcda4958e Mon Sep 17 00:00:00 2001 From: Matthias Urhahn <matthias.urhahn@sap.com> Date: Tue, 15 Jun 2021 18:05:27 +0200 Subject: [PATCH] Support registering certificates for multiple persons. (#3445) Co-authored-by: AlexanderAlferov <64849422+AlexanderAlferov@users.noreply.github.com> Co-authored-by: Kolya Opahle <k.opahle@sap.com> --- .../core/repository/VaccinationRepository.kt | 30 ++++++++----------- .../repository/VaccinationRepositoryTest.kt | 12 ++++---- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/vaccination/core/repository/VaccinationRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/vaccination/core/repository/VaccinationRepository.kt index b0cdc5e44..aba2b0b12 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/vaccination/core/repository/VaccinationRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/vaccination/core/repository/VaccinationRepository.kt @@ -86,20 +86,14 @@ class VaccinationRepository @Inject constructor( Timber.tag(TAG).v("registerVaccination(qrCode=%s)", qrCode) val updatedData = internalData.updateBlocking { - val originalPerson = if (this.isNotEmpty()) { - Timber.tag(TAG).d("There is an existing person we must match.") - this.single().also { - it.identifier.requireMatch(qrCode.personIdentifier) - Timber.tag(TAG).i("New certificate matches existing person!") - } - } else { - VaccinatedPerson( - data = VaccinatedPersonData(), - valueSet = null, - ) - } - - if (originalPerson.data.vaccinations.any { it.certificateId == qrCode.uniqueCertificateIdentifier }) { + val matchingPerson = this.singleOrNull { + it.identifier == qrCode.personIdentifier + } ?: VaccinatedPerson( + data = VaccinatedPersonData(), + valueSet = null, + ).also { Timber.tag(TAG).i("Creating new person for %s", qrCode) } + + if (matchingPerson.data.vaccinations.any { it.certificateId == qrCode.uniqueCertificateIdentifier }) { Timber.tag(TAG).e("Certificate is already registered: %s", qrCode.uniqueCertificateIdentifier) throw InvalidVaccinationCertificateException(VC_ALREADY_REGISTERED) } @@ -109,14 +103,14 @@ class VaccinationRepository @Inject constructor( qrCodeExtractor = vaccinationQRCodeExtractor, ) - val modifiedPerson = originalPerson.copy( - data = originalPerson.data.copy( - vaccinations = originalPerson.data.vaccinations.plus(newCertificate) + val modifiedPerson = matchingPerson.copy( + data = matchingPerson.data.copy( + vaccinations = matchingPerson.data.vaccinations.plus(newCertificate) ) ) this.toMutableSet().apply { - remove(originalPerson) + remove(matchingPerson) add(modifiedPerson) } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/covidcertificate/vaccination/core/repository/VaccinationRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/covidcertificate/vaccination/core/repository/VaccinationRepositoryTest.kt index 5ed01e16b..107dae36a 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/covidcertificate/vaccination/core/repository/VaccinationRepositoryTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/covidcertificate/vaccination/core/repository/VaccinationRepositoryTest.kt @@ -1,7 +1,6 @@ package de.rki.coronawarnapp.covidcertificate.vaccination.core.repository import de.rki.coronawarnapp.covidcertificate.common.exception.InvalidHealthCertificateException.ErrorCode.VC_ALREADY_REGISTERED -import de.rki.coronawarnapp.covidcertificate.common.exception.InvalidHealthCertificateException.ErrorCode.VC_NAME_MISMATCH import de.rki.coronawarnapp.covidcertificate.common.exception.InvalidVaccinationCertificateException import de.rki.coronawarnapp.covidcertificate.vaccination.core.DaggerVaccinationTestComponent import de.rki.coronawarnapp.covidcertificate.vaccination.core.VaccinationTestData @@ -112,11 +111,14 @@ class VaccinationRepositoryTest : BaseTest() { val instance = createInstance(this) advanceUntilIdle() - shouldThrow<InvalidVaccinationCertificateException> { - instance.registerVaccination(vaccinationTestData.personBVac1QRCode) - }.errorCode shouldBe VC_NAME_MISMATCH + every { timeStamper.nowUTC } returns vaccinationTestData.personBData1Vac.vaccinations.single().scannedAt + + instance.registerVaccination(vaccinationTestData.personBVac1QRCode) - testStorage shouldBe setOf(vaccinationTestData.personAData2Vac) + testStorage shouldBe setOf( + vaccinationTestData.personAData2Vac, + vaccinationTestData.personBData1Vac + ) } @Test -- GitLab