Skip to content

Commit 0f2f3a8

Browse files
authored
send pin code after scan qr (#52)
1 parent 3d307a2 commit 0f2f3a8

File tree

13 files changed

+95
-64
lines changed

13 files changed

+95
-64
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [v1.1.2](https://github.com/in2workspace/in2-issuer-api/releases/tag/v1.1.2)
8+
### Changed
9+
- Change the order of the received email from the pin during the issuance of a credential.
10+
711
## [v1.1.1](https://github.com/in2workspace/in2-issuer-api/releases/tag/v1.1.1)
812
### Fixed
913
- Fixed LEARCredentialEmployee data model. Implement W3C DATA model v2.0 (validFrom, validUntil).

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ plugins {
1111
}
1212

1313
group = 'es.in2'
14-
version = '1.1.1'
14+
version = '1.1.2'
1515

1616
java {
1717
sourceCompatibility = '17'

src/main/java/es/in2/issuer/application/workflow/impl/CredentialOfferIssuanceWorkflowImpl.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
import org.springframework.stereotype.Service;
1717
import reactor.core.publisher.Mono;
1818

19-
import java.util.Objects;
20-
2119
import static es.in2.issuer.domain.util.Constants.BEARER_PREFIX;
2220

2321
@Slf4j
@@ -43,21 +41,21 @@ public Mono<String> buildCredentialOfferUri(String processId, String transaction
4341
.flatMap(credentialType -> getPreAuthorizationCodeFromIam()
4442
.flatMap(preAuthCodeResponse ->
4543
deferredCredentialMetadataService.updateAuthServerNonceByTransactionCode(transactionCode, preAuthCodeResponse.grant().preAuthorizedCode())
46-
.then(credentialOfferService.buildCustomCredentialOffer(credentialType, preAuthCodeResponse.grant())
44+
.then(credentialProcedureService.getMandateeEmailFromDecodedCredentialByProcedureId(procedureId))
45+
.flatMap(email -> credentialOfferService.buildCustomCredentialOffer(credentialType, preAuthCodeResponse.grant(),email,preAuthCodeResponse.pin())
4746
.flatMap(credentialOfferCacheStorageService::saveCustomCredentialOffer)
48-
.flatMap(credentialOfferService::createCredentialOfferUri)
49-
.flatMap(credentialOfferUri -> credentialProcedureService.getMandateeEmailFromDecodedCredentialByProcedureId(procedureId)
50-
.flatMap(email -> emailService.sendPin(email, "Pin Code", preAuthCodeResponse.pin()))
51-
.thenReturn(credentialOfferUri))
47+
.flatMap(credentialOfferService::createCredentialOfferUri))
5248
)
5349
)
54-
)
5550
);
5651
}
5752

5853
@Override
5954
public Mono<CustomCredentialOffer> getCustomCredentialOffer(String nonce) {
60-
return credentialOfferCacheStorageService.getCustomCredentialOffer(nonce);
55+
return credentialOfferCacheStorageService.getCustomCredentialOffer(nonce)
56+
.flatMap(credentialOfferData -> emailService.sendPin(credentialOfferData.employeeEmail(), "Pin Code", credentialOfferData.pin())
57+
.then(Mono.just(credentialOfferData.credentialOffer()))
58+
);
6159
}
6260

6361
private Mono<PreAuthCodeResponse> getPreAuthorizationCodeFromIam() {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package es.in2.issuer.domain.model.dto;
2+
3+
import lombok.Builder;
4+
5+
@Builder
6+
public record CredentialOfferData(
7+
CustomCredentialOffer credentialOffer,
8+
String employeeEmail,
9+
String pin
10+
) {
11+
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package es.in2.issuer.domain.service;
22

3-
import es.in2.issuer.domain.model.dto.CustomCredentialOffer;
3+
import es.in2.issuer.domain.model.dto.CredentialOfferData;
44
import reactor.core.publisher.Mono;
55

66
public interface CredentialOfferCacheStorageService {
77

8-
Mono<String> saveCustomCredentialOffer(CustomCredentialOffer customCredentialOffer);
8+
Mono<String> saveCustomCredentialOffer(CredentialOfferData credentialOfferData);
99

10-
Mono<CustomCredentialOffer> getCustomCredentialOffer(String nonce);
10+
Mono<CredentialOfferData> getCustomCredentialOffer(String nonce);
1111

1212
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package es.in2.issuer.domain.service;
22

3-
import es.in2.issuer.domain.model.dto.CustomCredentialOffer;
3+
import es.in2.issuer.domain.model.dto.CredentialOfferData;
44
import es.in2.issuer.domain.model.dto.Grant;
55
import reactor.core.publisher.Mono;
66

77
public interface CredentialOfferService {
8-
Mono<CustomCredentialOffer> buildCustomCredentialOffer(String credentialType, Grant grant);
8+
Mono<CredentialOfferData> buildCustomCredentialOffer(String credentialType, Grant grant, String employeeEmail, String pin);
99
Mono<String> createCredentialOfferUri(String nonce);
1010
}

src/main/java/es/in2/issuer/domain/service/impl/CredentialOfferCacheStorageServiceImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package es.in2.issuer.domain.service.impl;
22

33
import es.in2.issuer.domain.exception.CustomCredentialOfferNotFoundException;
4-
import es.in2.issuer.domain.model.dto.CustomCredentialOffer;
4+
import es.in2.issuer.domain.model.dto.CredentialOfferData;
55
import es.in2.issuer.domain.service.CredentialOfferCacheStorageService;
66
import es.in2.issuer.infrastructure.repository.CacheStore;
77
import lombok.RequiredArgsConstructor;
@@ -16,15 +16,15 @@
1616
@RequiredArgsConstructor
1717
public class CredentialOfferCacheStorageServiceImpl implements CredentialOfferCacheStorageService {
1818

19-
private final CacheStore<CustomCredentialOffer> cacheStore;
19+
private final CacheStore<CredentialOfferData> cacheStore;
2020

2121
@Override
22-
public Mono<String> saveCustomCredentialOffer(CustomCredentialOffer customCredentialOffer) {
23-
return generateCustomNonce().flatMap(nonce -> cacheStore.add(nonce, customCredentialOffer));
22+
public Mono<String> saveCustomCredentialOffer(CredentialOfferData credentialOfferData) {
23+
return generateCustomNonce().flatMap(nonce -> cacheStore.add(nonce, credentialOfferData));
2424
}
2525

2626
@Override
27-
public Mono<CustomCredentialOffer> getCustomCredentialOffer(String nonce) {
27+
public Mono<CredentialOfferData> getCustomCredentialOffer(String nonce) {
2828
return cacheStore.get(nonce)
2929
.doOnSuccess(customCredentialOffer -> {
3030
if (customCredentialOffer != null) {

src/main/java/es/in2/issuer/domain/service/impl/CredentialOfferServiceImpl.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package es.in2.issuer.domain.service.impl;
22

3+
import es.in2.issuer.domain.model.dto.CredentialOfferData;
34
import es.in2.issuer.domain.model.dto.CustomCredentialOffer;
45
import es.in2.issuer.domain.model.dto.Grant;
56
import es.in2.issuer.domain.service.CredentialOfferService;
@@ -27,17 +28,24 @@ public class CredentialOfferServiceImpl implements CredentialOfferService {
2728
private final AppConfig appConfig;
2829

2930
@Override
30-
public Mono<CustomCredentialOffer> buildCustomCredentialOffer(String credentialType, Grant grant) {
31-
return Mono.just(CustomCredentialOffer.builder()
32-
.credentialIssuer(appConfig.getIssuerApiExternalDomain())
33-
.credentials(List.of(CustomCredentialOffer.Credential.builder()
34-
.format(JWT_VC_JSON)
35-
.types(List.of(credentialType))
36-
.build()
37-
))
38-
.credentialConfigurationIds(List.of(LEAR_CREDENTIAL_EMPLOYEE))
39-
.grants(Map.of(GRANT_TYPE, grant))
40-
.build());
31+
public Mono<CredentialOfferData> buildCustomCredentialOffer(String credentialType, Grant grant, String employeeEmail, String pin) {
32+
return Mono.just(
33+
34+
CredentialOfferData.builder()
35+
.credentialOffer(CustomCredentialOffer.builder()
36+
.credentialIssuer(appConfig.getIssuerApiExternalDomain())
37+
.credentials(List.of(CustomCredentialOffer.Credential.builder()
38+
.format(JWT_VC_JSON)
39+
.types(List.of(credentialType))
40+
.build()
41+
))
42+
.credentialConfigurationIds(List.of(LEAR_CREDENTIAL_EMPLOYEE))
43+
.grants(Map.of(GRANT_TYPE, grant))
44+
.build()
45+
)
46+
.employeeEmail(employeeEmail)
47+
.pin(pin)
48+
.build());
4149
}
4250

4351
@Override

src/main/java/es/in2/issuer/infrastructure/config/CacheStoreConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package es.in2.issuer.infrastructure.config;
22

3-
import es.in2.issuer.domain.model.dto.CustomCredentialOffer;
3+
import es.in2.issuer.domain.model.dto.CredentialOfferData;
44
import es.in2.issuer.domain.model.dto.VerifiableCredentialJWT;
55
import es.in2.issuer.infrastructure.repository.CacheStore;
66
import lombok.RequiredArgsConstructor;
@@ -31,7 +31,7 @@ public CacheStore<VerifiableCredentialJWT> cacheStoreForVerifiableCredentialJwt(
3131
}
3232

3333
@Bean
34-
public CacheStore<CustomCredentialOffer> cacheStoreForCredentialOffer() {
34+
public CacheStore<CredentialOfferData> cacheStoreForCredentialOffer() {
3535
return new CacheStore<>(appConfig.getCacheLifetimeForCredentialOffer(), TimeUnit.MINUTES);
3636
}
3737

src/test/java/es/in2/issuer/application/workflow/impl/CredentialOfferIssuanceWorkflowImplTest.java

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import es.in2.issuer.domain.model.dto.CredentialOfferData;
56
import es.in2.issuer.domain.model.dto.CustomCredentialOffer;
67
import es.in2.issuer.domain.model.dto.Grant;
78
import es.in2.issuer.domain.model.dto.PreAuthCodeResponse;
@@ -21,9 +22,6 @@
2122
import reactor.core.publisher.Mono;
2223
import reactor.test.StepVerifier;
2324

24-
import java.util.List;
25-
import java.util.Map;
26-
2725
import static es.in2.issuer.domain.util.Constants.CONTENT_TYPE;
2826
import static es.in2.issuer.domain.util.Constants.CONTENT_TYPE_APPLICATION_JSON;
2927
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -65,8 +63,17 @@ class CredentialOfferIssuanceWorkflowImplTest {
6563
@Test
6664
void testGetCredentialOffer() {
6765
String id = "dummyId";
66+
String email = "[email protected]";
67+
String pin = "1234";
6868
CustomCredentialOffer credentialOffer = CustomCredentialOffer.builder().build();
69-
when(credentialOfferCacheStorageService.getCustomCredentialOffer(id)).thenReturn(Mono.just(credentialOffer));
69+
CredentialOfferData credentialOfferData = CredentialOfferData.builder()
70+
.credentialOffer(credentialOffer)
71+
.pin(pin)
72+
.employeeEmail(email)
73+
.build();
74+
75+
when(credentialOfferCacheStorageService.getCustomCredentialOffer(id)).thenReturn(Mono.just(credentialOfferData));
76+
when(emailService.sendPin(credentialOfferData.employeeEmail(),"Pin Code", credentialOfferData.pin())).thenReturn(Mono.empty());
7077

7178
Mono<CustomCredentialOffer> result = credentialOfferIssuanceService.getCustomCredentialOffer(id);
7279
assertEquals(credentialOffer, result.block());
@@ -92,12 +99,14 @@ void testBuildCredentialOfferUri() throws JsonProcessingException {
9299
.build()
93100
)
94101
.build();
95-
CustomCredentialOffer credentialOffer = CustomCredentialOffer.builder()
96-
.credentialConfigurationIds(List.of(credentialType))
97-
.credentialIssuer("https://issuer.com")
98-
.grants(Map.of( "pre-authorized_code",preAuthCodeResponse.grant()))
102+
103+
CredentialOfferData credentialOfferData = CredentialOfferData.builder()
104+
.credentialOffer(CustomCredentialOffer.builder().build())
105+
.pin("1234")
106+
.employeeEmail(mail)
99107
.build();
100108

109+
101110
when(deferredCredentialMetadataService.validateTransactionCode(transactionCode)).thenReturn(Mono.empty());
102111
when(deferredCredentialMetadataService.getProcedureIdByTransactionCode(transactionCode)).thenReturn(Mono.just(procedureId));
103112
when(credentialProcedureService.getCredentialTypeByProcedureId(procedureId)).thenReturn(Mono.just(credentialType));
@@ -121,13 +130,12 @@ void testBuildCredentialOfferUri() throws JsonProcessingException {
121130
when(objectMapper.readValue("PreAuthorizedCode", PreAuthCodeResponse.class)).thenReturn(preAuthCodeResponse);
122131
when(deferredCredentialMetadataService.updateAuthServerNonceByTransactionCode(transactionCode,preAuthCodeResponse.grant().preAuthorizedCode()))
123132
.thenReturn(Mono.empty());
124-
when(credentialOfferService.buildCustomCredentialOffer(credentialType,preAuthCodeResponse.grant())).thenReturn(Mono.just(credentialOffer));
125-
when(credentialOfferCacheStorageService.saveCustomCredentialOffer(credentialOffer)).thenReturn(Mono.just(nonce));
126-
127-
when(credentialOfferService.createCredentialOfferUri(nonce)).thenReturn(Mono.just(credentialOfferUri));
128133
when(credentialProcedureService.getMandateeEmailFromDecodedCredentialByProcedureId(procedureId)).thenReturn(Mono.just(mail));
134+
when(credentialOfferService.buildCustomCredentialOffer(credentialType,preAuthCodeResponse.grant(), mail, preAuthCodeResponse.pin())).thenReturn(Mono.just(credentialOfferData));
129135

130-
when(emailService.sendPin(mail,"Pin Code", preAuthCodeResponse.pin())).thenReturn(Mono.empty());
136+
when(credentialOfferCacheStorageService.saveCustomCredentialOffer(credentialOfferData)).thenReturn(Mono.just(nonce));
137+
138+
when(credentialOfferService.createCredentialOfferUri(nonce)).thenReturn(Mono.just(credentialOfferUri));
131139

132140
StepVerifier.create(credentialOfferIssuanceService.buildCredentialOfferUri(processId,transactionCode))
133141
.expectNext(credentialOfferUri)

0 commit comments

Comments
 (0)