Skip to content

Commit f6ff0c4

Browse files
committed
feat: Refactor document issuance to support multiple configurations
This commit refactors the wallet core and issuance features to support issuing multiple documents simultaneously by transitioning from single-config to list-based configuration identifiers. Key changes include: - Removed `IssueDocumentPartialState` in favor of the more robust `IssueDocumentsPartialState`. - Renamed `issueDocument` to `issueDocuments` in `WalletCoreDocumentsController`, updating its parameters to accept a list of `configIds`. - Updated `AddDocumentInteractor` and `AddDocumentViewModel` to handle the updated flow and state changes. - Refactored internal OpenID4VCI logic to use `issueDocumentByConfigurationIdentifiers` for multi-document support.
1 parent 4498d5e commit f6ff0c4

File tree

3 files changed

+32
-42
lines changed

3 files changed

+32
-42
lines changed

core-logic/src/main/java/eu/europa/ec/corelogic/controller/WalletCoreDocumentsController.kt

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -76,18 +76,6 @@ enum class IssuanceMethod {
7676
OPENID4VCI
7777
}
7878

79-
sealed class IssueDocumentPartialState {
80-
data class Success(val documentId: String) : IssueDocumentPartialState()
81-
data class DeferredSuccess(val deferredDocuments: Map<String, String>) :
82-
IssueDocumentPartialState()
83-
84-
data class Failure(val errorMessage: String) : IssueDocumentPartialState()
85-
data class UserAuthRequired(
86-
val crypto: BiometricCrypto,
87-
val resultHandler: DeviceAuthenticationResult,
88-
) : IssueDocumentPartialState()
89-
}
90-
9179
sealed class IssueDocumentsPartialState {
9280
data class Success(val documentIds: List<DocumentId>) : IssueDocumentsPartialState()
9381
data class DeferredSuccess(val deferredDocuments: Map<DocumentId, FormatType>) :
@@ -164,11 +152,11 @@ interface WalletCoreDocumentsController {
164152

165153
fun getMainPidDocument(): IssuedDocument?
166154

167-
fun issueDocument(
155+
fun issueDocuments(
168156
issuanceMethod: IssuanceMethod,
169-
configId: String,
157+
configIds: List<String>,
170158
issuerId: String
171-
): Flow<IssueDocumentPartialState>
159+
): Flow<IssueDocumentsPartialState>
172160

173161
fun issueDocumentsByOffer(
174162
offer: Offer,
@@ -318,42 +306,42 @@ class WalletCoreDocumentsControllerImpl(
318306
)
319307
).minByOrNull { it.createdAt }
320308

321-
override fun issueDocument(
309+
override fun issueDocuments(
322310
issuanceMethod: IssuanceMethod,
323-
configId: String,
311+
configIds: List<String>,
324312
issuerId: String
325-
): Flow<IssueDocumentPartialState> = flow {
313+
): Flow<IssueDocumentsPartialState> = flow {
326314
when (issuanceMethod) {
327315
IssuanceMethod.OPENID4VCI -> {
328-
issueDocumentWithOpenId4VCI(configId, issuerId).collect { response ->
316+
issueDocumentsWithOpenId4VCI(configIds, issuerId).collect { response ->
329317
when (response) {
330318
is IssueDocumentsPartialState.Failure -> emit(
331-
IssueDocumentPartialState.Failure(
319+
IssueDocumentsPartialState.Failure(
332320
errorMessage = documentErrorMessage
333321
)
334322
)
335323

336324
is IssueDocumentsPartialState.Success -> emit(
337-
IssueDocumentPartialState.Success(
338-
response.documentIds.first()
325+
IssueDocumentsPartialState.Success(
326+
response.documentIds
339327
)
340328
)
341329

342330
is IssueDocumentsPartialState.UserAuthRequired -> emit(
343-
IssueDocumentPartialState.UserAuthRequired(
331+
IssueDocumentsPartialState.UserAuthRequired(
344332
crypto = response.crypto,
345333
resultHandler = response.resultHandler
346334
)
347335
)
348336

349337
is IssueDocumentsPartialState.PartialSuccess -> emit(
350-
IssueDocumentPartialState.Success(
351-
response.documentIds.first()
338+
IssueDocumentsPartialState.Success(
339+
response.documentIds
352340
)
353341
)
354342

355343
is IssueDocumentsPartialState.DeferredSuccess -> emit(
356-
IssueDocumentPartialState.DeferredSuccess(
344+
IssueDocumentsPartialState.DeferredSuccess(
357345
response.deferredDocuments
358346
)
359347
)
@@ -362,7 +350,7 @@ class WalletCoreDocumentsControllerImpl(
362350
}
363351
}
364352
}.safeAsync {
365-
IssueDocumentPartialState.Failure(errorMessage = documentErrorMessage)
353+
IssueDocumentsPartialState.Failure(errorMessage = documentErrorMessage)
366354
}
367355

368356
override fun issueDocumentsByOffer(
@@ -644,17 +632,17 @@ class WalletCoreDocumentsControllerImpl(
644632
override suspend fun resolveDocumentStatus(document: IssuedDocument): Result<Status> =
645633
eudiWallet.resolveStatus(document)
646634

647-
private fun issueDocumentWithOpenId4VCI(
648-
configId: String,
635+
private fun issueDocumentsWithOpenId4VCI(
636+
configIds: List<String>,
649637
issuerId: String
650638
): Flow<IssueDocumentsPartialState> =
651639
callbackFlow {
652640

653641
val manager = openId4VciManagers[issuerId]
654642
require(manager != null) { documentErrorMessage }
655643

656-
manager.issueDocumentByConfigurationIdentifier(
657-
credentialConfigurationId = configId,
644+
manager.issueDocumentByConfigurationIdentifiers(
645+
credentialConfigurationIds = configIds,
658646
onIssueEvent = issuanceCallback()
659647
)
660648

issuance-feature/src/main/java/eu/europa/ec/issuancefeature/interactor/AddDocumentInteractor.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import eu.europa.ec.commonfeature.config.SuccessUIConfig
2626
import eu.europa.ec.commonfeature.interactor.DeviceAuthenticationInteractor
2727
import eu.europa.ec.corelogic.controller.FetchScopedDocumentsPartialState
2828
import eu.europa.ec.corelogic.controller.IssuanceMethod
29-
import eu.europa.ec.corelogic.controller.IssueDocumentPartialState
29+
import eu.europa.ec.corelogic.controller.IssueDocumentsPartialState
3030
import eu.europa.ec.corelogic.controller.WalletCoreDocumentsController
3131
import eu.europa.ec.corelogic.model.FormatType
3232
import eu.europa.ec.issuancefeature.ui.add.model.AddDocumentUi
@@ -66,7 +66,7 @@ interface AddDocumentInteractor {
6666
issuanceMethod: IssuanceMethod,
6767
configId: String,
6868
issuerId: String
69-
): Flow<IssueDocumentPartialState>
69+
): Flow<IssueDocumentsPartialState>
7070

7171
fun handleUserAuth(
7272
context: Context,
@@ -163,10 +163,10 @@ class AddDocumentInteractorImpl(
163163
issuanceMethod: IssuanceMethod,
164164
configId: String,
165165
issuerId: String
166-
): Flow<IssueDocumentPartialState> =
167-
walletCoreDocumentsController.issueDocument(
166+
): Flow<IssueDocumentsPartialState> =
167+
walletCoreDocumentsController.issueDocuments(
168168
issuanceMethod = issuanceMethod,
169-
configId = configId,
169+
configIds = listOf(configId),
170170
issuerId = issuerId
171171
)
172172

issuance-feature/src/main/java/eu/europa/ec/issuancefeature/ui/add/AddDocumentViewModel.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import eu.europa.ec.commonfeature.config.QrScanUiConfig
3030
import eu.europa.ec.commonfeature.config.RequestUriConfig
3131
import eu.europa.ec.commonfeature.di.getOrCreateCredentialOfferScope
3232
import eu.europa.ec.corelogic.controller.IssuanceMethod
33-
import eu.europa.ec.corelogic.controller.IssueDocumentPartialState
33+
import eu.europa.ec.corelogic.controller.IssueDocumentsPartialState
3434
import eu.europa.ec.corelogic.di.getOrCreatePresentationScope
3535
import eu.europa.ec.issuancefeature.interactor.AddDocumentInteractor
3636
import eu.europa.ec.issuancefeature.interactor.AddDocumentInteractorPartialState
@@ -298,7 +298,7 @@ class AddDocumentViewModel(
298298
configId = configId
299299
).collect { response ->
300300
when (response) {
301-
is IssueDocumentPartialState.Failure -> {
301+
is IssueDocumentsPartialState.Failure -> {
302302
setState {
303303
copy(
304304
error = ContentErrorConfig(
@@ -311,19 +311,19 @@ class AddDocumentViewModel(
311311
}
312312
}
313313

314-
is IssueDocumentPartialState.Success -> {
314+
is IssueDocumentsPartialState.Success -> {
315315
setState {
316316
copy(
317317
error = null,
318318
isLoading = false
319319
)
320320
}
321321
navigateToDocumentIssuanceSuccessScreen(
322-
documentId = response.documentId
322+
documentId = response.documentIds.first()
323323
)
324324
}
325325

326-
is IssueDocumentPartialState.DeferredSuccess -> {
326+
is IssueDocumentsPartialState.DeferredSuccess -> {
327327
setState {
328328
copy(
329329
error = null,
@@ -337,7 +337,7 @@ class AddDocumentViewModel(
337337
)
338338
}
339339

340-
is IssueDocumentPartialState.UserAuthRequired -> {
340+
is IssueDocumentsPartialState.UserAuthRequired -> {
341341
addDocumentInteractor.handleUserAuth(
342342
context = context,
343343
crypto = response.crypto,
@@ -352,6 +352,8 @@ class AddDocumentViewModel(
352352
)
353353
)
354354
}
355+
356+
is IssueDocumentsPartialState.PartialSuccess -> {}
355357
}
356358
}
357359
}

0 commit comments

Comments
 (0)