Skip to content

Commit 75895e8

Browse files
committed
2024-10-18 - feedback - external reviewer - serverl-side
1 parent 8f5fcbf commit 75895e8

File tree

9 files changed

+132
-50
lines changed

9 files changed

+132
-50
lines changed

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

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ public class FeedbackRequest {
4646
private UUID requesteeId;
4747

4848
@Column(name = "recipient_id")
49-
@NotNull
5049
@TypeDef(type = DataType.STRING)
5150
@Schema(description = "id of the person who was requested to give feedback")
5251
private UUID recipientId;
@@ -86,15 +85,26 @@ public class FeedbackRequest {
8685
@Schema(description = "the id of the review period in that this request was created for")
8786
private UUID reviewPeriodId;
8887

89-
public FeedbackRequest(UUID creatorId,
90-
UUID requesteeId,
91-
UUID recipientId,
92-
UUID templateId,
93-
LocalDate sendDate,
94-
@Nullable LocalDate dueDate,
95-
String status,
96-
@Nullable LocalDate submitDate,
97-
@Nullable UUID reviewPeriodId) {
88+
@Column(name = "external_recipient_id")
89+
@NotNull
90+
@TypeDef(type = DataType.STRING)
91+
@Schema(description = "id of the external person who was requested to give feedback")
92+
private UUID externalRecipientId;
93+
94+
95+
96+
public FeedbackRequest(
97+
UUID creatorId,
98+
UUID requesteeId,
99+
@Nullable UUID recipientId,
100+
UUID templateId,
101+
LocalDate sendDate,
102+
@Nullable LocalDate dueDate,
103+
String status,
104+
@Nullable LocalDate submitDate,
105+
@Nullable UUID reviewPeriodId,
106+
@Nullable UUID externalRecipientId
107+
) {
98108
this.id = null;
99109
this.creatorId = creatorId;
100110
this.requesteeId = requesteeId;
@@ -105,6 +115,7 @@ public FeedbackRequest(UUID creatorId,
105115
this.status = status;
106116
this.submitDate = submitDate;
107117
this.reviewPeriodId = reviewPeriodId;
118+
this.externalRecipientId = externalRecipientId;
108119
}
109120

110121
public FeedbackRequest() {}
@@ -123,12 +134,14 @@ public boolean equals(Object o) {
123134
&& Objects.equals(dueDate, that.dueDate)
124135
&& Objects.equals(status, that.status)
125136
&& Objects.equals(submitDate, that.submitDate)
126-
&& Objects.equals(reviewPeriodId, that.reviewPeriodId);
137+
&& Objects.equals(reviewPeriodId, that.reviewPeriodId)
138+
&& Objects.equals(externalRecipientId, that.externalRecipientId)
139+
;
127140
}
128141

129142
@Override
130143
public int hashCode() {
131-
return Objects.hash(id, creatorId, recipientId, requesteeId, sendDate, templateId, dueDate, status, submitDate, reviewPeriodId);
144+
return Objects.hash(id, creatorId, recipientId, requesteeId, sendDate, templateId, dueDate, status, submitDate, reviewPeriodId, externalRecipientId);
132145
}
133146

134147
@Override
@@ -144,6 +157,7 @@ public String toString() {
144157
", status='" + status +
145158
", submitDate='" + submitDate +
146159
", reviewPeriodId='" + reviewPeriodId +
160+
", externalRecipientId='" + externalRecipientId +
147161
'}';
148162
}
149163
}

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ public HttpResponse<FeedbackRequestResponseDTO> getById(UUID id) {
106106
*/
107107
@RequiredPermission(Permission.CAN_VIEW_FEEDBACK_REQUEST)
108108
@Get("/{?creatorId,requesteeId,recipientId,oldestDate,reviewPeriodId,templateId,requesteeIds}")
109-
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) {
110-
return feedbackReqServices.findByValues(creatorId, requesteeId, recipientId, oldestDate, reviewPeriodId, templateId, requesteeIds)
109+
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) {
110+
return feedbackReqServices.findByValues(creatorId, requesteeId, recipientId, oldestDate, reviewPeriodId, templateId, requesteeIds, externalRecipientId)
111111
.stream()
112112
.map(this::fromEntity)
113113
.toList();
@@ -125,6 +125,7 @@ private FeedbackRequestResponseDTO fromEntity(FeedbackRequest feedbackRequest) {
125125
dto.setStatus(feedbackRequest.getStatus());
126126
dto.setSubmitDate(feedbackRequest.getSubmitDate());
127127
dto.setReviewPeriodId(feedbackRequest.getReviewPeriodId());
128+
dto.setExternalRecipientId(feedbackRequest.getExternalRecipientId());
128129

129130
return dto;
130131
}
@@ -139,6 +140,8 @@ private FeedbackRequest fromDTO(FeedbackRequestCreateDTO dto) {
139140
dto.getDueDate(),
140141
dto.getStatus(),
141142
dto.getSubmitDate(),
142-
dto.getReviewPeriodId());
143+
dto.getReviewPeriodId(),
144+
dto.getExternalRecipientId()
145+
);
143146
}
144147
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class FeedbackRequestCreateDTO {
2323
@Schema(description = "id of the person who is getting feedback requested on them")
2424
private UUID requesteeId;
2525

26-
@NotNull
26+
@Nullable
2727
@Schema(description = "id of the person who was requested to give feedback")
2828
private UUID recipientId;
2929

@@ -51,5 +51,9 @@ public class FeedbackRequestCreateDTO {
5151
@Schema(description = "the id of the review period in that this request was created for")
5252
private UUID reviewPeriodId;
5353

54+
@Nullable
55+
@Schema(description = "id of the external person who was requested to give feedback")
56+
private UUID externalRecipientId;
57+
5458
}
5559

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ public interface FeedbackRequestRepository extends CrudRepository<FeedbackReques
3030
"AND (CAST(:oldestDate as date) IS NULL OR send_date >= :oldestDate) " +
3131
"AND (:reviewPeriodId IS NULL OR review_period_id = :reviewPeriodId) " +
3232
"AND (:templateId IS NULL OR template_id = :templateId) " +
33-
"AND (requestee_id = ANY(:requesteeIds)) "
33+
"AND (requestee_id = ANY(:requesteeIds)) " +
34+
"AND (:externalRecipientId IS NULL OR externalRecipientId = :externalRecipientId) "
3435
, nativeQuery = true)
35-
List<FeedbackRequest> findByValues(@Nullable String creatorId, @Nullable String recipientId, @Nullable LocalDate oldestDate, @Nullable String reviewPeriodId, @Nullable String templateId, @TypeDef(type = DataType.STRING_ARRAY) List<String> requesteeIds);
36+
List<FeedbackRequest> findByValues(@Nullable String creatorId, @Nullable String recipientId, @Nullable LocalDate oldestDate, @Nullable String reviewPeriodId, @Nullable String templateId, @TypeDef(type = DataType.STRING_ARRAY) List<String> requesteeIds, @Nullable String externalRecipientId);
3637

3738
@Query(value = "SELECT * " +
3839
"FROM feedback_requests " +
@@ -41,9 +42,10 @@ public interface FeedbackRequestRepository extends CrudRepository<FeedbackReques
4142
"AND (:recipientId IS NULL OR recipient_id = :recipientId) " +
4243
"AND (CAST(:oldestDate as date) IS NULL OR send_date >= :oldestDate) " +
4344
"AND (:reviewPeriodId IS NULL OR review_period_id = :reviewPeriodId) " +
44-
"AND (:templateId IS NULL OR template_id = :templateId) "
45+
"AND (:templateId IS NULL OR template_id = :templateId) " +
46+
"AND (:externalRecipientId IS NULL OR externalRecipientId = :externalRecipientId) "
4547
, nativeQuery = true)
46-
List<FeedbackRequest> findByValues(@Nullable String creatorId, @Nullable String requesteeId, @Nullable String recipientId, @Nullable LocalDate oldestDate, @Nullable String reviewPeriodId, @Nullable String templateId);
48+
List<FeedbackRequest> findByValues(@Nullable String creatorId, @Nullable String requesteeId, @Nullable String recipientId, @Nullable LocalDate oldestDate, @Nullable String reviewPeriodId, @Nullable String templateId, @Nullable String externalRecipientId);
4749

4850
List<FeedbackRequest> findBySendDateNotAfterAndStatusEqual(LocalDate sendDate, String status);
4951
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,14 @@ public class FeedbackRequestResponseDTO {
1919
@Schema(description = "unique id of the feedback request")
2020
private UUID id;
2121

22-
@NotNull
2322
@Schema(description = "id of the person who was requested to give feedback")
2423
private UUID recipientId;
2524

2625
@NotNull
2726
@Schema(description = "id of the feedback request creator")
2827
private UUID creatorId;
2928

30-
@NotNull
29+
@Nullable
3130
@Schema(description = "id of the person who is getting feedback requested on them")
3231
private UUID requesteeId;
3332

@@ -55,4 +54,8 @@ public class FeedbackRequestResponseDTO {
5554
@Schema(description = "the id of the review period in that this request was created for")
5655
private UUID reviewPeriodId;
5756

57+
@Nullable
58+
@Schema(description = "id of the external person who was requested to give feedback")
59+
private UUID externalRecipientId;
60+
5861
}

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

Lines changed: 2 additions & 2 deletions
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);
17-
}
16+
List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID recipientId, LocalDate oldestDate, UUID reviewPeriodId, UUID templateId, List<UUID> requesteeIds, UUID externalRecipientId);
17+
}

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

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.objectcomputing.checkins.notifications.email.EmailSender;
88
import com.objectcomputing.checkins.notifications.email.MailJetFactory;
99
import com.objectcomputing.checkins.services.email.Email;
10+
import com.objectcomputing.checkins.services.feedback_external_recipient.FeedbackExternalRecipientServices;
1011
import com.objectcomputing.checkins.services.memberprofile.MemberProfile;
1112
import com.objectcomputing.checkins.services.memberprofile.MemberProfileUtils;
1213
import com.objectcomputing.checkins.services.memberprofile.MemberProfileServices;
@@ -23,7 +24,6 @@
2324
import jakarta.inject.Singleton;
2425
import org.slf4j.Logger;
2526
import org.slf4j.LoggerFactory;
26-
2727
import java.io.BufferedReader;
2828
import java.time.format.DateTimeFormatter;
2929
import java.time.LocalDate;
@@ -41,8 +41,8 @@
4141
public class FeedbackRequestServicesImpl implements FeedbackRequestServices {
4242

4343
private static final Logger LOG = LoggerFactory.getLogger(FeedbackRequestServicesImpl.class);
44-
4544
private final FeedbackRequestRepository feedbackReqRepository;
45+
private final FeedbackExternalRecipientServices feedbackExternalRecipientServices;
4646
private final CurrentUserServices currentUserServices;
4747
private final MemberProfileServices memberProfileServices;
4848
private final ReviewPeriodRepository reviewPeriodRepository;
@@ -62,13 +62,15 @@ private record ReviewPeriodInfo(String subject, LocalDate closeDate) {}
6262
@Value("classpath:mjml/supervisor_email.mjml")
6363
private Readable supervisorTemplate;
6464

65-
public FeedbackRequestServicesImpl(FeedbackRequestRepository feedbackReqRepository,
66-
CurrentUserServices currentUserServices,
67-
MemberProfileServices memberProfileServices,
68-
ReviewPeriodRepository reviewPeriodRepository,
69-
ReviewAssignmentRepository reviewAssignmentRepository,
70-
@Named(MailJetFactory.MJML_FORMAT) EmailSender emailSender,
71-
CheckInsConfiguration checkInsConfiguration
65+
public FeedbackRequestServicesImpl(
66+
FeedbackRequestRepository feedbackReqRepository,
67+
CurrentUserServices currentUserServices,
68+
MemberProfileServices memberProfileServices,
69+
ReviewPeriodRepository reviewPeriodRepository,
70+
ReviewAssignmentRepository reviewAssignmentRepository,
71+
@Named(MailJetFactory.MJML_FORMAT) EmailSender emailSender,
72+
CheckInsConfiguration checkInsConfiguration,
73+
FeedbackExternalRecipientServices feedbackExternalRecipientServices
7274
) {
7375
this.feedbackReqRepository = feedbackReqRepository;
7476
this.currentUserServices = currentUserServices;
@@ -78,6 +80,7 @@ public FeedbackRequestServicesImpl(FeedbackRequestRepository feedbackReqReposito
7880
this.emailSender = emailSender;
7981
this.notificationSubject = checkInsConfiguration.getApplication().getFeedback().getRequestSubject();
8082
this.webURL = checkInsConfiguration.getWebAddress();
83+
this.feedbackExternalRecipientServices = feedbackExternalRecipientServices;
8184
}
8285

8386
private void validateMembers(FeedbackRequest feedbackRequest) {
@@ -87,12 +90,26 @@ private void validateMembers(FeedbackRequest feedbackRequest) {
8790
throw new BadArgException("Cannot save feedback request with invalid creator ID");
8891
}
8992

93+
if (feedbackRequest.getRecipientId() == null || feedbackRequest.getExternalRecipientId() == null) {
94+
throw new BadArgException("Cannot save feedback request without recipient/external-recipient ID");
95+
}
96+
9097
try {
91-
memberProfileServices.getById(feedbackRequest.getRecipientId());
98+
if (feedbackRequest.getRecipientId() != null) {
99+
memberProfileServices.getById(feedbackRequest.getRecipientId());
100+
}
92101
} catch (NotFoundException e) {
93102
throw new BadArgException("Cannot save feedback request with invalid recipient ID");
94103
}
95104

105+
try {
106+
if (feedbackRequest.getExternalRecipientId() != null) {
107+
memberProfileServices.getById(feedbackRequest.getExternalRecipientId());
108+
}
109+
} catch (NotFoundException e) {
110+
throw new BadArgException("Cannot save feedback request with invalid external-recipient ID");
111+
}
112+
96113
try {
97114
memberProfileServices.getById(feedbackRequest.getRequesteeId());
98115
} catch (NotFoundException e) {
@@ -129,26 +146,38 @@ public void sendNewRequestEmail(FeedbackRequest storedRequest) {
129146
MemberProfile reviewer = memberProfileServices.getById(storedRequest.getRecipientId());
130147
MemberProfile requestee = memberProfileServices.getById(storedRequest.getRequesteeId());
131148
String senderName = MemberProfileUtils.getFullName(creator);
149+
UUID recipientOrExternalRecipientId;
150+
String reviewerFirstName, reviewerEmail;
151+
152+
if (memberProfileServices.getById(storedRequest.getExternalRecipientId()) != null) {
153+
recipientOrExternalRecipientId = storedRequest.getExternalRecipientId();
154+
reviewerFirstName = "";
155+
reviewerEmail = "";
156+
} else {
157+
reviewer = memberProfileServices.getById(storedRequest.getRecipientId());
158+
recipientOrExternalRecipientId = storedRequest.getRecipientId();
159+
reviewerFirstName = reviewer.getFirstName();
160+
reviewerEmail = reviewer.getWorkEmail();
161+
}
132162

133163
String newContent = String.format(
134-
templateToString(feedbackRequestTemplate),
135-
reviewer.getFirstName(), senderName,
136-
storedRequest.getRecipientId().equals(storedRequest.getRequesteeId()) ?
137-
"" :
138-
String.format("on <strong>%s</strong> ",
139-
MemberProfileUtils.getFullName(requestee)),
140-
storedRequest.getDueDate() == null ?
164+
templateToString(feedbackRequestTemplate),
165+
reviewerFirstName, senderName,
166+
recipientOrExternalRecipientId.equals(storedRequest.getRequesteeId()) ? "" : String.format("on <strong>%s</strong> ", MemberProfileUtils.getFullName(requestee)),
167+
storedRequest.getDueDate() == null ?
141168
"This request does not have a due date." :
142169
String.format("This request is due on %s %d, %d.",
143170
storedRequest.getDueDate().getMonth(),
144171
storedRequest.getDueDate().getDayOfMonth(),
145172
storedRequest.getDueDate().getYear()),
146173
String.format("%s/feedback/submit?request=%s",
147-
webURL, storedRequest.getId().toString()));
148-
149-
emailSender.sendEmail(senderName, creator.getWorkEmail(),
150-
notificationSubject, newContent,
151-
reviewer.getWorkEmail());
174+
webURL, storedRequest.getId().toString())
175+
);
176+
emailSender.sendEmail(
177+
senderName, creator.getWorkEmail(),
178+
notificationSubject, newContent,
179+
reviewerEmail
180+
);
152181
}
153182

154183
@Override
@@ -283,7 +312,7 @@ public FeedbackRequest getById(UUID id) {
283312
}
284313

285314
@Override
286-
public List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID recipientId, LocalDate oldestDate, UUID reviewPeriodId, UUID templateId, List<UUID> requesteeIds) {
315+
public List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID recipientId, LocalDate oldestDate, UUID reviewPeriodId, UUID templateId, List<UUID> requesteeIds, UUID externalRecipientId) {
287316
final UUID currentUserId = currentUserServices.getCurrentUser().getId();
288317
if (currentUserId == null) {
289318
throw new PermissionException(NOT_AUTHORIZED_MSG);
@@ -292,10 +321,10 @@ public List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID
292321
List<FeedbackRequest> feedbackReqList = new ArrayList<>();
293322
if (requesteeIds != null && !requesteeIds.isEmpty()) {
294323
LOG.debug("Finding feedback requests for {} requesteeIds.", requesteeIds.size());
295-
feedbackReqList.addAll(feedbackReqRepository.findByValues(Util.nullSafeUUIDToString(creatorId), Util.nullSafeUUIDToString(recipientId), oldestDate, Util.nullSafeUUIDToString(reviewPeriodId), Util.nullSafeUUIDToString(templateId), Util.nullSafeUUIDListToStringList(requesteeIds)));
324+
feedbackReqList.addAll(feedbackReqRepository.findByValues(Util.nullSafeUUIDToString(creatorId), Util.nullSafeUUIDToString(recipientId), oldestDate, Util.nullSafeUUIDToString(reviewPeriodId), Util.nullSafeUUIDToString(templateId), Util.nullSafeUUIDListToStringList(requesteeIds), Util.nullSafeUUIDToString(externalRecipientId)));
296325
} else {
297326
LOG.debug("Finding feedback requests one or fewer requesteeIds: {}", requesteeId);
298-
feedbackReqList.addAll(feedbackReqRepository.findByValues(Util.nullSafeUUIDToString(creatorId), Util.nullSafeUUIDToString(requesteeId), Util.nullSafeUUIDToString(recipientId), oldestDate, Util.nullSafeUUIDToString(reviewPeriodId), Util.nullSafeUUIDToString(templateId)));
327+
feedbackReqList.addAll(feedbackReqRepository.findByValues(Util.nullSafeUUIDToString(creatorId), Util.nullSafeUUIDToString(requesteeId), Util.nullSafeUUIDToString(recipientId), oldestDate, Util.nullSafeUUIDToString(reviewPeriodId), Util.nullSafeUUIDToString(templateId), Util.nullSafeUUIDToString(recipientId)));
299328
}
300329

301330
feedbackReqList = feedbackReqList.stream().filter((FeedbackRequest request) -> {

0 commit comments

Comments
 (0)