Skip to content

Commit 05143b5

Browse files
committed
Updated files according to Michael's review, overcoming many errors to implement complete functionality to allow standard users the ability to deny feedback requests (as a new method with separate permission). The notification service is not yet complete, and some review facets need to be revisited. This is a valuable commit to save progress and clarify working state of long-outstanding PR draft.
1 parent 47ec47c commit 05143b5

File tree

9 files changed

+115
-60
lines changed

9 files changed

+115
-60
lines changed

server/src/main/java/com/objectcomputing/checkins/services/feedback_request/DTO/CreatorDTO.java

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
package com.objectcomputing.checkins.services.feedback_request.DTO;
22

3+
import io.micronaut.core.annotation.Introspected;
34
import jakarta.validation.Valid;
45
import jakarta.validation.constraints.NotBlank;
56
import jakarta.validation.constraints.NotNull;
67

8+
@Introspected
9+
710
public class DenyFeedbackRequestDTO {
811

912
@NotBlank(message = "Reason cannot be blank")
1013
private String reason;
1114

1215
@NotNull(message = "Denier cannot be null")
1316
@Valid
14-
private DenierDTO denier;
17+
private UserDTO denier;
1518

1619
@NotNull(message = "Creator cannot be null")
1720
@Valid
18-
private CreatorDTO creator;
21+
private UserDTO creator;
1922

2023
// Constructors
2124
public DenyFeedbackRequestDTO() {}
2225

23-
public DenyFeedbackRequestDTO(String reason, DenierDTO denier, CreatorDTO creator) {
26+
public DenyFeedbackRequestDTO(String reason, UserDTO denier, UserDTO creator) {
2427
this.reason = reason;
2528
this.denier = denier;
2629
this.creator = creator;
@@ -31,11 +34,11 @@ public String getReason() {
3134
return reason;
3235
}
3336

34-
public DenierDTO getDenier() {
37+
public UserDTO getDenier() {
3538
return denier;
3639
}
3740

38-
public CreatorDTO getCreator() {
41+
public UserDTO getCreator() {
3942
return creator;
4043
}
4144

@@ -44,11 +47,11 @@ public void setReason(String reason) {
4447
this.reason = reason;
4548
}
4649

47-
public void setDenier(DenierDTO denier) {
50+
public void setDenier(UserDTO denier) {
4851
this.denier = denier;
4952
}
5053

51-
public void setCreator(CreatorDTO creator) {
54+
public void setCreator(UserDTO creator) {
5255
this.creator = creator;
5356
}
5457
}

server/src/main/java/com/objectcomputing/checkins/services/feedback_request/DTO/DenierDTO.java renamed to server/src/main/java/com/objectcomputing/checkins/services/feedback_request/DTO/UserDTO.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,29 @@
44
import jakarta.validation.constraints.NotNull;
55
import java.util.UUID;
66

7-
public class DenierDTO {
7+
import io.micronaut.core.annotation.Introspected;
88

9-
@NotNull(message = "Denier ID cannot be null")
9+
10+
@Introspected
11+
12+
public class UserDTO {
13+
14+
@NotNull(message = "User ID cannot be null")
1015
private UUID id;
1116

12-
@NotBlank(message = "Denier name cannot be blank")
17+
@NotBlank(message = "User name cannot be blank")
1318
private String name;
1419

1520
// Constructors
16-
public DenierDTO() {}
21+
public UserDTO() {}
22+
23+
// Constructor with only ID (for cases where only ID is required)
24+
public UserDTO(UUID id) {
25+
this.id = id;
26+
}
1727

18-
public DenierDTO(UUID id, String name) {
28+
// Constructor with ID and name (for cases where both ID and name are required)
29+
public UserDTO(UUID id, String name) {
1930
this.id = id;
2031
this.name = name;
2132
}

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

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
import com.objectcomputing.checkins.services.permissions.Permission;
44
import com.objectcomputing.checkins.services.permissions.RequiredPermission;
55
import com.objectcomputing.checkins.services.feedback_request.DTO.DenyFeedbackRequestDTO;
6-
import com.objectcomputing.checkins.services.feedback_request.DTO.DenierDTO;
7-
import com.objectcomputing.checkins.services.feedback_request.DTO.CreatorDTO;
6+
import com.objectcomputing.checkins.services.feedback_request.DTO.UserDTO;
87
import com.objectcomputing.checkins.services.notification.NotificationService;
98
import io.micronaut.core.annotation.Nullable;
109
import io.micronaut.core.convert.format.Format;
@@ -137,21 +136,21 @@ public List<FeedbackRequestResponseDTO> findByValues(
137136
* @return {@link FeedbackRequestResponseDTO} with updated denial status
138137
*/
139138
@Post("/{id}/deny")
140-
@RequiredPermission(Permission.CAN_DENY_FEEDBACK_REQUEST)
141-
public HttpResponse<FeedbackRequestResponseDTO> denyFeedbackRequest(
142-
@PathVariable("id") @NotNull UUID id,
143-
@Body @Valid DenyFeedbackRequestDTO body
144-
) {
145-
FeedbackRequest feedbackRequest = feedbackReqServices.getById(id);
146-
if (feedbackRequest == null) {
147-
return HttpResponse.notFound();
139+
@RequiredPermission(Permission.CAN_DENY_FEEDBACK_REQUEST)
140+
public HttpResponse<FeedbackRequestResponseDTO> denyFeedbackRequest(
141+
@PathVariable("id") @NotNull UUID id,
142+
@Body @Valid DenyFeedbackRequestDTO body
143+
) {
144+
FeedbackRequest feedbackRequest = feedbackReqServices.getById(id);
145+
if (feedbackRequest == null) {
146+
return HttpResponse.notFound();
148147
}
149148

150149
String reason = body.getReason();
151-
DenierDTO denier = body.getDenier();
152-
CreatorDTO creator = body.getCreator();
150+
UserDTO denier = body.getDenier();
151+
UserDTO creator = body.getCreator();
153152

154-
if (!feedbackRequest.isDenied() && reason != null && !reason.trim().isEmpty()) {
153+
if (!feedbackRequest.isDenied() && reason != null && !reason.trim().isEmpty() && denier != null && creator != null) {
155154
FeedbackRequestUpdateDTO dto = new FeedbackRequestUpdateDTO();
156155
dto.setId(feedbackRequest.getId());
157156
dto.setDueDate(feedbackRequest.getDueDate());
@@ -171,9 +170,10 @@ public HttpResponse<FeedbackRequestResponseDTO> denyFeedbackRequest(
171170
);
172171

173172
return HttpResponse.ok(fromEntity(updatedFeedbackRequest));
174-
}
173+
} else {
174+
return HttpResponse.badRequest();
175175

176-
return HttpResponse.ok(fromEntity(feedbackRequest));
176+
}
177177
}
178178

179179
private FeedbackRequestResponseDTO fromEntity(FeedbackRequest feedbackRequest) {
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.objectcomputing.checkins.services.feedback_request;
2+
3+
import io.micronaut.core.annotation.Introspected;
4+
import jakarta.validation.Valid;
5+
import jakarta.validation.constraints.NotBlank;
6+
import jakarta.validation.constraints.NotNull;
7+
import com.objectcomputing.checkins.services.feedback_request.DTO.UserDTO;
8+
9+
10+
@Introspected
11+
12+
public class FeedbackRequestDenialDTO {
13+
14+
@NotBlank(message = "Reason cannot be blank")
15+
private String reason;
16+
17+
@NotNull(message = "Denier cannot be null")
18+
@Valid
19+
private UserDTO denier;
20+
21+
@NotNull(message = "Creator cannot be null")
22+
@Valid
23+
private UserDTO creator;
24+
25+
// Constructors
26+
public FeedbackRequestDenialDTO() {}
27+
28+
public FeedbackRequestDenialDTO(String reason, UserDTO denier, UserDTO creator) {
29+
this.reason = reason;
30+
this.denier = denier;
31+
this.creator = creator;
32+
}
33+
34+
// Getters
35+
public String getReason() {
36+
return reason;
37+
}
38+
39+
public UserDTO getDenier() {
40+
return denier;
41+
}
42+
43+
public UserDTO getCreator() {
44+
return creator;
45+
}
46+
47+
// Setters
48+
public void setReason(String reason) {
49+
this.reason = reason;
50+
}
51+
52+
public void setDenier(UserDTO denier) {
53+
this.denier = denier;
54+
}
55+
56+
public void setCreator(UserDTO creator) {
57+
this.creator = creator;
58+
}
59+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,10 @@ public FeedbackRequest update(FeedbackRequestUpdateDTO feedbackRequestUpdateDTO)
215215
throw new BadArgException("Send date of feedback request must be before the due date.");
216216
}
217217

218+
if (feedbackRequest.isDenied() && (feedbackRequestUpdateDTO.getReason() == null || feedbackRequestUpdateDTO.getReason().trim().isEmpty())) {
219+
throw new BadArgException("A reason must be provided for denying the request.");
220+
}
221+
218222
FeedbackRequest storedRequest = feedbackReqRepository.update(feedbackRequest);
219223
MemberProfile reviewer = memberProfileServices.getById(storedRequest.getRecipientId());
220224
MemberProfile requestee = memberProfileServices.getById(storedRequest.getRequesteeId());

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.micronaut.core.annotation.Nullable;
55
import io.swagger.v3.oas.annotations.media.Schema;
66
import jakarta.validation.constraints.NotNull;
7+
import com.objectcomputing.checkins.services.feedback_request.DTO.UserDTO;
78
import lombok.Getter;
89
import lombok.Setter;
910

server/src/main/java/com/objectcomputing/checkins/services/notification/NotificationServiceImpl.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.objectcomputing.checkins.notifications.email.EmailSender;
55
import com.objectcomputing.checkins.services.memberprofile.MemberProfile;
66
import com.objectcomputing.checkins.services.memberprofile.MemberProfileServices;
7+
import com.objectcomputing.checkins.services.memberprofile.currentuser.CurrentUserServices;
78
import jakarta.inject.Inject;
89
import jakarta.inject.Named;
910
import jakarta.inject.Singleton;
@@ -21,14 +22,17 @@ public class NotificationServiceImpl implements NotificationService {
2122

2223
private final EmailSender emailSender;
2324
private final MemberProfileServices memberProfileServices;
25+
private final CurrentUserServices currentUserServices;
2426

2527
@Inject
2628
public NotificationServiceImpl(
2729
@Named(MailJetFactory.HTML_FORMAT) EmailSender emailSender,
28-
MemberProfileServices memberProfileServices
30+
MemberProfileServices memberProfileServices,
31+
CurrentUserServices currentUserServices
2932
) {
3033
this.emailSender = emailSender;
3134
this.memberProfileServices = memberProfileServices;
35+
this.currentUserServices = currentUserServices;
3236
}
3337

3438
@Override
@@ -57,9 +61,6 @@ public void sendNotification(@NonNull UUID userId, @NonNull String message) {
5761
}
5862

5963
private MemberProfile getCurrentDenier() {
60-
// This method should fetch the profile of the user who denied the request
61-
// This could be passed as a parameter or retrieved from the session or context
62-
// If not available, you might need to redesign how this information is passed to the service
63-
throw new UnsupportedOperationException("Not implemented");
64+
return currentUserServices.getCurrentUser();
6465
}
6566
}

web-ui/src/api/feedback.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,10 @@ export const denyFeedbackRequest = async (requestId, reason, denier, creator, co
131131
data: {
132132
reason: reason,
133133
denier: denier,
134-
creator: creator,
134+
creator: {
135+
id: creator.id,
136+
name: "Anonymous"
137+
}
135138
},
136139
headers: {
137140
'X-CSRF-Header': cookie,

0 commit comments

Comments
 (0)