Skip to content

Commit d0f9b81

Browse files
CM-758 | Adding generic implementation for /auth/confirm (#496)
* CM-758 | Neeraj/Sangita | Adding generic implementation for /auth/confirm api * CM-758 | imported missing import * CM-758 | Adding test cases * CM-758 | Adding test for confirmAuthFor Co-authored-by: Neeraj Kumar Mishra <Nexengineer@users.noreply.github.com>
1 parent d1f650b commit d0f9b81

File tree

10 files changed

+127
-3
lines changed

10 files changed

+127
-3
lines changed

consent/src/main/java/in/projecteka/consentmanager/SecurityConfiguration.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import static in.projecteka.consentmanager.user.Constants.APP_PATH_RESET_PIN;
5757
import static in.projecteka.consentmanager.user.Constants.BASE_PATH_PATIENTS_APIS;
5858
import static in.projecteka.consentmanager.user.Constants.PATH_FIND_PATIENT;
59+
import static in.projecteka.consentmanager.user.Constants.USERS_AUTH_CONFIRM;
5960
import static in.projecteka.library.clients.model.ClientError.unAuthorized;
6061
import static in.projecteka.library.common.Role.GATEWAY;
6162
import static java.util.stream.Collectors.toList;
@@ -83,7 +84,8 @@ public class SecurityConfiguration {
8384
PATH_HEALTH_INFORMATION_NOTIFY,
8485
PATH_HIP_CONSENT_ON_NOTIFY,
8586
PATH_HIP_ADD_CONTEXTS,
86-
PATH_HIP_LINK_USER_AUTH_INIT
87+
PATH_HIP_LINK_USER_AUTH_INIT,
88+
USERS_AUTH_CONFIRM
8789
};
8890

8991
static {
@@ -106,7 +108,7 @@ public class SecurityConfiguration {
106108
SERVICE_ONLY_URLS.add(Map.entry(PATH_HEALTH_INFORMATION_ON_REQUEST, HttpMethod.POST));
107109
SERVICE_ONLY_URLS.add(Map.entry(PATH_HIP_CONSENT_ON_NOTIFY, HttpMethod.POST));
108110
SERVICE_ONLY_URLS.add(Map.entry(PATH_HIP_ADD_CONTEXTS, HttpMethod.POST));
109-
111+
SERVICE_ONLY_URLS.add(Map.entry(USERS_AUTH_CONFIRM, HttpMethod.POST));
110112
RequestMatcher approveMatcher = new RequestMatcher("/consent-requests/**/approve",
111113
HttpMethod.POST,
112114
SCOPE_CONSENT_APPROVE);

consent/src/main/java/in/projecteka/consentmanager/user/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ public class Constants {
2727
public static final String APP_PATH_CREATE_USER = "/profile";
2828
public static final String APP_PATH_INTERNAL_FIND_USER_BY_USERNAME = "/internal/users/{userName}";
2929
public static final String APP_PATH_RESET_PASSWORD = "/profile/reset-password";
30+
public static final String USERS_AUTH_CONFIRM = CURRENT_VERSION + "/users/auth/confirm";
3031
}

consent/src/main/java/in/projecteka/consentmanager/user/UserController.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
import in.projecteka.consentmanager.user.model.SignUpSession;
66
import in.projecteka.consentmanager.user.model.Token;
77
import in.projecteka.consentmanager.user.model.User;
8+
import in.projecteka.consentmanager.user.model.UserAuthConfirmRequest;
89
import in.projecteka.consentmanager.user.model.UserSignUpEnquiry;
910
import in.projecteka.library.clients.model.ClientError;
1011
import in.projecteka.library.common.RequestValidator;
12+
13+
1114
import lombok.AllArgsConstructor;
1215
import org.springframework.http.HttpStatus;
1316
import org.springframework.web.bind.annotation.GetMapping;
@@ -21,6 +24,7 @@
2124
import javax.validation.Valid;
2225

2326
import static in.projecteka.consentmanager.user.Constants.PATH_FIND_PATIENT;
27+
import static org.springframework.http.HttpStatus.ACCEPTED;
2428
import static org.springframework.http.HttpStatus.CREATED;
2529

2630
@RestController
@@ -65,4 +69,17 @@ public Mono<Token> permitOtp(@RequestBody OtpVerification request) {
6569
public Mono<User> internalUserWith(@PathVariable String userName) {
6670
return userService.userWith(userName);
6771
}
72+
73+
@ResponseStatus(ACCEPTED)
74+
@PostMapping(Constants.USERS_AUTH_CONFIRM)
75+
public Mono<Void> authOnConfirm(@RequestBody UserAuthConfirmRequest request) {
76+
return Mono.just(request)
77+
.filterWhen(req -> validator.validate(request.getRequestId(), request.getTimestamp()))
78+
.switchIfEmpty(Mono.error(ClientError.tooManyRequests()))
79+
.doOnSuccess(validatedRequest -> Mono.defer(() -> {
80+
validator.put(request.getRequestId(), request.getTimestamp());
81+
return userService.confirmAuthFor(validatedRequest);
82+
}))
83+
.then();
84+
}
6885
}

consent/src/main/java/in/projecteka/consentmanager/user/UserService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import in.projecteka.consentmanager.user.model.UpdatePasswordRequest;
2626
import in.projecteka.consentmanager.user.model.UpdateUserRequest;
2727
import in.projecteka.consentmanager.user.model.User;
28+
import in.projecteka.consentmanager.user.model.UserAuthConfirmRequest;
2829
import in.projecteka.consentmanager.user.model.UserSignUpEnquiry;
2930
import in.projecteka.library.clients.IdentityServiceClient;
3031
import in.projecteka.library.clients.OtpServiceClient;
@@ -394,4 +395,8 @@ public Mono<User> getPatientByDetails(InitiateCmIdRecoveryRequest request) {
394395
private Mono<User> getDistinctUser(List<User> rows) {
395396
return rows.size() == 1 ? Mono.just(rows.get(0)) : Mono.empty();
396397
}
398+
399+
public Mono<Void> confirmAuthFor(UserAuthConfirmRequest request) {
400+
return Mono.empty();
401+
}
397402
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package in.projecteka.consentmanager.user.model;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class AuthCredentialDetail {
7+
private final String token;
8+
private final DemographicDetail demographic;
9+
}
10+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package in.projecteka.consentmanager.user.model;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class DemographicDetail {
7+
private final String name;
8+
private final Gender gender;
9+
private final String dateOfBirth;
10+
private final Identifier identifier;
11+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package in.projecteka.consentmanager.user.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
7+
import java.time.LocalDateTime;
8+
9+
@Data
10+
@Builder
11+
@AllArgsConstructor
12+
public class UserAuthConfirmRequest {
13+
private final String requestId;
14+
private final LocalDateTime timestamp;
15+
private final String transactionId;
16+
private final AuthCredentialDetail credential;
17+
}

consent/src/test/java/in/projecteka/consentmanager/user/TestBuilders.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import in.projecteka.consentmanager.user.model.SignUpRequest;
1212
import in.projecteka.consentmanager.user.model.UpdatePasswordRequest;
1313
import in.projecteka.consentmanager.user.model.User;
14+
import in.projecteka.consentmanager.user.model.UserAuthConfirmRequest;
1415
import in.projecteka.consentmanager.user.model.UserSignUpEnquiry;
1516
import org.jeasy.random.EasyRandom;
1617
import org.jeasy.random.EasyRandomParameters;
@@ -77,4 +78,8 @@ public static PatientName.PatientNameBuilder patientName(){
7778
public static DateOfBirth.DateOfBirthBuilder dateOfBirth(){
7879
return easyRandom.nextObject(DateOfBirth.DateOfBirthBuilder.class);
7980
}
81+
82+
public static UserAuthConfirmRequest.UserAuthConfirmRequestBuilder userAuthConfirmRequest() {
83+
return easyRandom.nextObject(UserAuthConfirmRequest.UserAuthConfirmRequestBuilder.class);
84+
}
8085
}

consent/src/test/java/in/projecteka/consentmanager/user/UserControllerTest.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@
88
import in.projecteka.consentmanager.consent.HipConsentNotificationListener;
99
import in.projecteka.consentmanager.consent.HiuConsentNotificationListener;
1010
import in.projecteka.consentmanager.dataflow.DataFlowBroadcastListener;
11+
import in.projecteka.consentmanager.user.model.AuthCredentialDetail;
12+
import in.projecteka.consentmanager.user.model.DemographicDetail;
1113
import in.projecteka.consentmanager.user.model.OtpVerification;
1214
import in.projecteka.consentmanager.user.model.RequesterDetail;
1315
import in.projecteka.consentmanager.user.model.SignUpSession;
1416
import in.projecteka.consentmanager.user.model.Token;
17+
import in.projecteka.consentmanager.user.model.UserAuthConfirmRequest;
1518
import in.projecteka.consentmanager.user.model.UserSignUpEnquiry;
1619
import in.projecteka.library.common.Authenticator;
1720
import in.projecteka.library.common.Caller;
@@ -20,6 +23,7 @@
2023
import in.projecteka.library.common.ServiceCaller;
2124
import org.junit.jupiter.api.Test;
2225
import org.junit.runner.RunWith;
26+
import org.mockito.ArgumentMatchers;
2327
import org.mockito.Mockito;
2428
import org.springframework.beans.factory.annotation.Autowired;
2529
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
@@ -32,12 +36,15 @@
3236
import reactor.core.publisher.Mono;
3337

3438
import java.time.LocalDateTime;
39+
import java.time.ZoneOffset;
3540
import java.util.List;
3641

3742
import static in.projecteka.consentmanager.user.Constants.PATH_FIND_PATIENT;
43+
import static in.projecteka.consentmanager.user.Constants.USERS_AUTH_CONFIRM;
3844
import static in.projecteka.consentmanager.user.TestBuilders.patientRequest;
3945
import static in.projecteka.consentmanager.user.TestBuilders.string;
4046
import static in.projecteka.consentmanager.user.TestBuilders.user;
47+
import static in.projecteka.consentmanager.user.TestBuilders.userAuthConfirmRequest;
4148
import static in.projecteka.library.common.Role.GATEWAY;
4249
import static java.lang.String.format;
4350
import static org.mockito.ArgumentMatchers.any;
@@ -198,5 +205,45 @@ void shouldFailWithTooManyRequestsErrorForInvalidRequest() {
198205
.expectStatus()
199206
.is4xxClientError();
200207
}
208+
209+
@Test
210+
void shouldReturnAcceptedForUserAuthConfirmRequest() {
211+
var token = string();
212+
var userAuthConfirmRequest = userAuthConfirmRequest().build();
213+
var caller = ServiceCaller.builder().clientId("Client_ID").roles(List.of(GATEWAY)).build();
214+
215+
when(validator.put(anyString(), any(LocalDateTime.class))).thenReturn(Mono.empty());
216+
when(validator.validate(anyString(), any(LocalDateTime.class))).thenReturn(Mono.just(Boolean.TRUE));
217+
when(gatewayTokenVerifier.verify(token)).thenReturn(just(caller));
218+
when(userService.confirmAuthFor(userAuthConfirmRequest)).thenReturn(empty());
219+
220+
webClient.post()
221+
.uri(USERS_AUTH_CONFIRM)
222+
.accept(MediaType.APPLICATION_JSON)
223+
.header(AUTHORIZATION, token)
224+
.body(BodyInserters.fromValue(userAuthConfirmRequest))
225+
.exchange()
226+
.expectStatus()
227+
.isAccepted();
228+
}
229+
230+
@Test
231+
void shouldThrowTooManyRequestErrorForInvalidAuthConfirmRequest() {
232+
var token = string();
233+
var caller = ServiceCaller.builder().clientId("Client_ID").roles(List.of(GATEWAY)).build();
234+
var userAuthConfirmRequest = userAuthConfirmRequest().build();
235+
236+
when(validator.validate(anyString(), any(LocalDateTime.class))).thenReturn(Mono.empty());
237+
when(gatewayTokenVerifier.verify(token)).thenReturn(just(caller));
238+
239+
webClient.post()
240+
.uri(USERS_AUTH_CONFIRM)
241+
.accept(MediaType.APPLICATION_JSON)
242+
.header(AUTHORIZATION, token)
243+
.bodyValue(userAuthConfirmRequest)
244+
.exchange()
245+
.expectStatus()
246+
.is4xxClientError();
247+
}
201248
}
202249

consent/src/test/java/in/projecteka/consentmanager/user/UserServiceTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import static in.projecteka.consentmanager.user.TestBuilders.string;
6565
import static in.projecteka.consentmanager.user.TestBuilders.updatePasswordRequest;
6666
import static in.projecteka.consentmanager.user.TestBuilders.user;
67+
import static in.projecteka.consentmanager.user.TestBuilders.userAuthConfirmRequest;
6768
import static in.projecteka.consentmanager.user.TestBuilders.userSignUpEnquiry;
6869
import static in.projecteka.consentmanager.user.model.Requester.HIU;
6970
import static org.assertj.core.api.Assertions.assertThat;
@@ -779,4 +780,12 @@ void shouldVerifyOTPForForgetConsentPin() {
779780
.assertNext(response -> assertThat(response.getTemporaryToken()).isEqualTo(token))
780781
.verifyComplete();
781782
}
782-
}
783+
784+
@Test
785+
void shouldReturnMonoEmpty() {
786+
Mono<Void> returnResult = userService.confirmAuthFor(userAuthConfirmRequest().build());
787+
StepVerifier.create(returnResult)
788+
.verifyComplete();
789+
assertThat(returnResult).isEqualTo(Mono.empty());
790+
}
791+
}

0 commit comments

Comments
 (0)