Skip to content
Snippets Groups Projects
Unverified Commit 58f91b1d authored by Matthias Urhahn's avatar Matthias Urhahn Committed by GitHub
Browse files

Support registering certificates for multiple persons. (#3445)

parent f7eb2be1
No related branches found
No related tags found
No related merge requests found
......@@ -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)
}
}
......
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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment