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