Skip to content

Commit f9cc72e

Browse files
committed
2024-10-23 - feedback - external reviewer - server-side
1 parent 2eb6270 commit f9cc72e

File tree

4 files changed

+94
-9
lines changed

4 files changed

+94
-9
lines changed

server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestController.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.objectcomputing.checkins.services.feedback_request;
22

3+
import com.nimbusds.jose.proc.SecurityContext;
34
import com.objectcomputing.checkins.services.feedback_external_recipient.FeedbackExternalRecipient;
45
import com.objectcomputing.checkins.services.feedback_external_recipient.FeedbackExternalRecipientServices;
56
import com.objectcomputing.checkins.services.permissions.Permission;
@@ -15,12 +16,16 @@
1516
import io.micronaut.http.annotation.Post;
1617
import io.micronaut.http.annotation.Put;
1718
import io.micronaut.http.annotation.Status;
19+
import io.micronaut.http.exceptions.HttpStatusException;
1820
import io.micronaut.scheduling.TaskExecutors;
1921
import io.micronaut.scheduling.annotation.ExecuteOn;
2022
import io.micronaut.security.annotation.Secured;
23+
import io.micronaut.security.authentication.Authentication;
2124
import io.micronaut.security.rules.SecurityRule;
25+
import io.micronaut.security.utils.SecurityService;
2226
import io.micronaut.validation.Validated;
2327
import io.swagger.v3.oas.annotations.tags.Tag;
28+
import jakarta.inject.Inject;
2429
import jakarta.validation.Valid;
2530
import jakarta.validation.constraints.NotNull;
2631

@@ -38,6 +43,8 @@ public class FeedbackRequestController {
3843

3944
private final FeedbackRequestServices feedbackReqServices;
4045
private final FeedbackExternalRecipientServices feedbackExternalRecipientServices;
46+
@Inject
47+
SecurityService securityService;
4148

4249
public FeedbackRequestController(FeedbackRequestServices feedbackReqServices, FeedbackExternalRecipientServices feedbackExternalRecipientServices) {
4350
this.feedbackReqServices = feedbackReqServices;
@@ -116,9 +123,9 @@ public HttpResponse<FeedbackRequestResponseDTO> getById(UUID id) {
116123
* @return list of {@link FeedbackRequestResponseDTO}
117124
*/
118125
@RequiredPermission(Permission.CAN_VIEW_FEEDBACK_REQUEST)
119-
@Get("/{?creatorId,requesteeId,recipientId,oldestDate,reviewPeriodId,templateId,requesteeIds}")
120-
public List<FeedbackRequestResponseDTO> findByValues(@Nullable UUID creatorId, @Nullable UUID requesteeId, @Nullable UUID recipientId, @Nullable @Format("yyyy-MM-dd") LocalDate oldestDate, @Nullable UUID reviewPeriodId, @Nullable UUID templateId, @Nullable List<UUID> requesteeIds, @Nullable UUID externalRecipientId) {
121-
return feedbackReqServices.findByValues(creatorId, requesteeId, recipientId, oldestDate, reviewPeriodId, templateId, requesteeIds, externalRecipientId)
126+
@Get("/{?creatorId,requesteeId,recipientId,oldestDate,reviewPeriodId,templateId,externalRecipientId,requesteeIds}")
127+
public List<FeedbackRequestResponseDTO> findByValues(@Nullable UUID creatorId, @Nullable UUID requesteeId, @Nullable UUID recipientId, @Nullable @Format("yyyy-MM-dd") LocalDate oldestDate, @Nullable UUID reviewPeriodId, @Nullable UUID templateId, @Nullable UUID externalRecipientId, @Nullable List<UUID> requesteeIds) {
128+
return feedbackReqServices.findByValues(creatorId, requesteeId, recipientId, oldestDate, reviewPeriodId, templateId, externalRecipientId, requesteeIds)
122129
.stream()
123130
.map(this::fromEntity)
124131
.toList();

server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestServices.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ public interface FeedbackRequestServices {
1313

1414
FeedbackRequest getById(UUID id);
1515

16-
List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID recipientId, LocalDate oldestDate, UUID reviewPeriodId, UUID templateId, List<UUID> requesteeIds, UUID externalRecipientId);
16+
List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID recipientId, LocalDate oldestDate, UUID reviewPeriodId, UUID templateId, UUID externalRecipientId, List<UUID> requesteeIds);
1717
}

server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestServicesImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ public FeedbackRequest getById(UUID id) {
346346
}
347347

348348
@Override
349-
public List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID recipientId, LocalDate oldestDate, UUID reviewPeriodId, UUID templateId, List<UUID> requesteeIds, UUID externalRecipientId) {
349+
public List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID recipientId, LocalDate oldestDate, UUID reviewPeriodId, UUID templateId, UUID externalRecipientId, List<UUID> requesteeIds) {
350350
final UUID currentUserId = currentUserServices.getCurrentUser().getId();
351351
if (currentUserId == null) {
352352
throw new PermissionException(NOT_AUTHORIZED_MSG);
@@ -369,8 +369,9 @@ public List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID
369369
} else if (request != null) {
370370
if (currentUserId.equals(request.getCreatorId())) visible = true;
371371
if (isSupervisor(request.getRequesteeId(), currentUserId)) visible = true;
372-
recipientIdLocal = request.getRecipientId() != null ? request.getRecipientId() : request.getExternalRecipientId();
372+
recipientIdLocal = request.getRecipientId();
373373
if (currentUserId.equals(recipientIdLocal)) visible = true;
374+
if (request.getExternalRecipientId() != null) visible = true;
374375
}
375376
return visible;
376377
}).toList();

server/src/test/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestControllerTest.java

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,7 +1085,7 @@ void testGetByCreatorIdPermittedMultipleReqsToExternalRecipients() {
10851085
}
10861086

10871087
@Test
1088-
void testGetByCreatorRequesteeIdPermitted() {
1088+
void testGetByCreatorRequesteeIdPermittedToRecipients() {
10891089
//create two employee-PDL relationships
10901090
MemberProfile pdlMemberProfile = createADefaultMemberProfile();
10911091
assignPdlRole(pdlMemberProfile);
@@ -1113,7 +1113,35 @@ void testGetByCreatorRequesteeIdPermitted() {
11131113
}
11141114

11151115
@Test
1116-
void testGetByCreatorRequesteeIdNotPermitted() {
1116+
void testGetByCreatorRequesteeIdPermittedToExternalRecipients() {
1117+
//create two employee-PDL relationships
1118+
MemberProfile pdlMemberProfile = createADefaultMemberProfile();
1119+
assignPdlRole(pdlMemberProfile);
1120+
MemberProfile memberOne = createADefaultMemberProfileForPdl(pdlMemberProfile);
1121+
MemberProfile pdlMemberProfileTwo = createASecondDefaultMemberProfile();
1122+
assignPdlRole(pdlMemberProfileTwo);
1123+
MemberProfile memberTwo = createASecondDefaultMemberProfileForPdl(pdlMemberProfileTwo);
1124+
final FeedbackExternalRecipient externalRecipient01 = createADefaultFeedbackExternalRecipient();
1125+
final FeedbackExternalRecipient externalRecipient02 = createASecondDefaultFeedbackExternalRecipient();
1126+
1127+
//create two sample feedback requests by the same PDL
1128+
final FeedbackRequest feedbackReq = saveFeedbackRequest(pdlMemberProfile, memberOne, externalRecipient01);
1129+
saveFeedbackRequest(pdlMemberProfileTwo, memberTwo, externalRecipient02);
1130+
1131+
//search for feedback requests by a specific creator, requestee, and template
1132+
final HttpRequest<?> request = HttpRequest.GET(String.format("/?creatorId=%s&requesteeId=%s", feedbackReq.getCreatorId(), feedbackReq.getRequesteeId()))
1133+
.basicAuth(pdlMemberProfile.getWorkEmail(), RoleType.Constants.PDL_ROLE);
1134+
final HttpResponse<List<FeedbackRequestResponseDTO>> response = client.toBlocking()
1135+
.exchange(request, Argument.listOf(FeedbackRequestResponseDTO.class));
1136+
1137+
assertTrue(response.getBody().isPresent());
1138+
assertEquals(1, response.getBody().get().size());
1139+
assertResponseEqualsEntity(feedbackReq, response.getBody().get().get(0));
1140+
assertEquals(HttpStatus.OK, response.getStatus());
1141+
}
1142+
1143+
@Test
1144+
void testGetByCreatorRequesteeIdNotPermittedToRecipients() {
11171145
//create two employee-PDL relationships
11181146
MemberProfile pdlMemberProfile = createADefaultMemberProfile();
11191147
assignPdlRole(pdlMemberProfile);
@@ -1142,7 +1170,36 @@ void testGetByCreatorRequesteeIdNotPermitted() {
11421170
}
11431171

11441172
@Test
1145-
void testGetByCreatorRecipientIdPermitted() {
1173+
void testGetByCreatorRequesteeIdNotPermittedToExternalRecipients() {
1174+
//create two employee-PDL relationships
1175+
MemberProfile pdlMemberProfile = createADefaultMemberProfile();
1176+
assignPdlRole(pdlMemberProfile);
1177+
MemberProfile memberOne = createADefaultMemberProfileForPdl(pdlMemberProfile);
1178+
MemberProfile pdlMemberProfileTwo = createASecondDefaultMemberProfile();
1179+
assignPdlRole(pdlMemberProfileTwo);
1180+
MemberProfile memberTwo = createASecondDefaultMemberProfileForPdl(pdlMemberProfileTwo);
1181+
final FeedbackExternalRecipient externalRecipient01 = createADefaultFeedbackExternalRecipient();
1182+
final FeedbackExternalRecipient externalRecipient02 = createASecondDefaultFeedbackExternalRecipient();
1183+
1184+
//create two sample feedback requests by the same PDL
1185+
final FeedbackRequest feedbackReq = saveFeedbackRequest(pdlMemberProfile, memberOne, externalRecipient01);
1186+
saveFeedbackRequest(pdlMemberProfileTwo, memberTwo, externalRecipient02);
1187+
1188+
//search for feedback requests by a specific creator, requestee, and template
1189+
final HttpRequest<?> request = HttpRequest.GET(String.format("/?creatorId=%s&requesteeId=%s", feedbackReq.getCreatorId(), feedbackReq.getRequesteeId()))
1190+
.basicAuth(externalRecipient02.getEmail(), RoleType.Constants.MEMBER_ROLE);
1191+
;
1192+
1193+
final HttpResponse<List<FeedbackRequestResponseDTO>> response = client.toBlocking()
1194+
.exchange(request, Argument.listOf(FeedbackRequestResponseDTO.class));
1195+
1196+
assertTrue(response.getBody().isPresent());
1197+
assertEquals(0, response.getBody().get().size());
1198+
assertEquals(HttpStatus.OK, response.getStatus());
1199+
}
1200+
1201+
@Test
1202+
void testGetByCreatorRecipientIdPermittedToRecipients() {
11461203
MemberProfile pdlMemberProfile = createADefaultMemberProfile();
11471204
assignPdlRole(pdlMemberProfile);
11481205
MemberProfile requestee = createADefaultMemberProfileForPdl(pdlMemberProfile);
@@ -1160,6 +1217,26 @@ void testGetByCreatorRecipientIdPermitted() {
11601217
assertResponseEqualsEntity(feedbackRequest, response.getBody().get());
11611218
}
11621219

1220+
@Test
1221+
void testGetByCreatorRecipientIdPermittedToExternalRecipients() {
1222+
MemberProfile pdlMemberProfile = createADefaultMemberProfile();
1223+
assignPdlRole(pdlMemberProfile);
1224+
MemberProfile requestee = createADefaultMemberProfileForPdl(pdlMemberProfile);
1225+
MemberProfile recipient = createADefaultRecipient();
1226+
final FeedbackExternalRecipient externalRecipient = createADefaultFeedbackExternalRecipient();
1227+
FeedbackRequest feedbackRequest = saveFeedbackRequest(pdlMemberProfile, requestee, externalRecipient);
1228+
1229+
//get feedback request
1230+
final HttpRequest<?> request = HttpRequest.GET(String.format("/?externalRecipientId=%s", feedbackRequest.getExternalRecipientId()))
1231+
.basicAuth(recipient.getWorkEmail(), RoleType.Constants.MEMBER_ROLE);
1232+
final HttpResponse<FeedbackRequestResponseDTO> response = client.toBlocking().exchange(request, FeedbackRequestResponseDTO.class);
1233+
1234+
// recipient must be able to get the feedback request
1235+
assertEquals(HttpStatus.OK, response.getStatus());
1236+
assertTrue(response.getBody().isPresent());
1237+
assertResponseEqualsEntity(feedbackRequest, response.getBody().get());
1238+
}
1239+
11631240
@Test
11641241
void testGetByCreatorRequesteeIdMultiplePermitted() {
11651242
//create two employee-PDL relationships

0 commit comments

Comments
 (0)