Skip to content

Commit 47ec47c

Browse files
committed
Pushing broken state to request help identifying ambiguous 400 error from feedback_request backend service.
1 parent 9e84a98 commit 47ec47c

27 files changed

+698
-61
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.objectcomputing.checkins.services.feedback_request.DTO;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
import java.util.UUID;
5+
6+
public class CreatorDTO {
7+
8+
@NotNull(message = "Creator ID cannot be null")
9+
private UUID id;
10+
11+
// Constructors
12+
public CreatorDTO() {}
13+
14+
public CreatorDTO(UUID id) {
15+
this.id = id;
16+
}
17+
18+
// Getters
19+
public UUID getId() {
20+
return id;
21+
}
22+
23+
// Setters
24+
public void setId(UUID id) {
25+
this.id = id;
26+
}
27+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.objectcomputing.checkins.services.feedback_request.DTO;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import jakarta.validation.constraints.NotNull;
5+
import java.util.UUID;
6+
7+
public class DenierDTO {
8+
9+
@NotNull(message = "Denier ID cannot be null")
10+
private UUID id;
11+
12+
@NotBlank(message = "Denier name cannot be blank")
13+
private String name;
14+
15+
// Constructors
16+
public DenierDTO() {}
17+
18+
public DenierDTO(UUID id, String name) {
19+
this.id = id;
20+
this.name = name;
21+
}
22+
23+
// Getters
24+
public UUID getId() {
25+
return id;
26+
}
27+
28+
public String getName() {
29+
return name;
30+
}
31+
32+
// Setters
33+
public void setId(UUID id) {
34+
this.id = id;
35+
}
36+
37+
public void setName(String name) {
38+
this.name = name;
39+
}
40+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.objectcomputing.checkins.services.feedback_request.DTO;
2+
3+
import jakarta.validation.Valid;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.NotNull;
6+
7+
public class DenyFeedbackRequestDTO {
8+
9+
@NotBlank(message = "Reason cannot be blank")
10+
private String reason;
11+
12+
@NotNull(message = "Denier cannot be null")
13+
@Valid
14+
private DenierDTO denier;
15+
16+
@NotNull(message = "Creator cannot be null")
17+
@Valid
18+
private CreatorDTO creator;
19+
20+
// Constructors
21+
public DenyFeedbackRequestDTO() {}
22+
23+
public DenyFeedbackRequestDTO(String reason, DenierDTO denier, CreatorDTO creator) {
24+
this.reason = reason;
25+
this.denier = denier;
26+
this.creator = creator;
27+
}
28+
29+
// Getters
30+
public String getReason() {
31+
return reason;
32+
}
33+
34+
public DenierDTO getDenier() {
35+
return denier;
36+
}
37+
38+
public CreatorDTO getCreator() {
39+
return creator;
40+
}
41+
42+
// Setters
43+
public void setReason(String reason) {
44+
this.reason = reason;
45+
}
46+
47+
public void setDenier(DenierDTO denier) {
48+
this.denier = denier;
49+
}
50+
51+
public void setCreator(CreatorDTO creator) {
52+
this.creator = creator;
53+
}
54+
}

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import jakarta.persistence.Id;
1313
import jakarta.persistence.Table;
1414
import jakarta.validation.constraints.NotNull;
15+
import jakarta.validation.constraints.Null;
1516
import lombok.Getter;
1617
import lombok.Setter;
1718

@@ -86,6 +87,18 @@ public class FeedbackRequest {
8687
@Schema(description = "the id of the review period in that this request was created for")
8788
private UUID reviewPeriodId;
8889

90+
@Column(name = "denied")
91+
@Nullable
92+
@Schema(description = "Whether the feedback request has been denied")
93+
private boolean denied = false;
94+
95+
@Column(name = "reason")
96+
@Nullable
97+
@Schema(description = "Denial reason")
98+
private String reason;
99+
100+
101+
89102
public FeedbackRequest(UUID creatorId,
90103
UUID requesteeId,
91104
UUID recipientId,
@@ -94,7 +107,9 @@ public FeedbackRequest(UUID creatorId,
94107
@Nullable LocalDate dueDate,
95108
String status,
96109
@Nullable LocalDate submitDate,
97-
@Nullable UUID reviewPeriodId) {
110+
@Nullable UUID reviewPeriodId,
111+
boolean denied,
112+
@Nullable String reason) {
98113
this.id = null;
99114
this.creatorId = creatorId;
100115
this.requesteeId = requesteeId;
@@ -105,6 +120,8 @@ public FeedbackRequest(UUID creatorId,
105120
this.status = status;
106121
this.submitDate = submitDate;
107122
this.reviewPeriodId = reviewPeriodId;
123+
this.denied = denied;
124+
this.reason = reason;
108125
}
109126

110127
public FeedbackRequest() {}
@@ -123,12 +140,14 @@ public boolean equals(Object o) {
123140
&& Objects.equals(dueDate, that.dueDate)
124141
&& Objects.equals(status, that.status)
125142
&& Objects.equals(submitDate, that.submitDate)
126-
&& Objects.equals(reviewPeriodId, that.reviewPeriodId);
143+
&& Objects.equals(reviewPeriodId, that.reviewPeriodId)
144+
&& Objects.equals(denied, that.denied)
145+
&& Objects.equals(reason, that.reason);
127146
}
128147

129148
@Override
130149
public int hashCode() {
131-
return Objects.hash(id, creatorId, recipientId, requesteeId, sendDate, templateId, dueDate, status, submitDate, reviewPeriodId);
150+
return Objects.hash(id, creatorId, recipientId, requesteeId, sendDate, templateId, dueDate, status, submitDate, reviewPeriodId, denied, reason);
132151
}
133152

134153
@Override
@@ -144,6 +163,8 @@ public String toString() {
144163
", status='" + status +
145164
", submitDate='" + submitDate +
146165
", reviewPeriodId='" + reviewPeriodId +
166+
", denied='" + denied +
167+
", reason='" + reason +
147168
'}';
148169
}
149170
}

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

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import com.objectcomputing.checkins.services.permissions.Permission;
44
import com.objectcomputing.checkins.services.permissions.RequiredPermission;
5+
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;
8+
import com.objectcomputing.checkins.services.notification.NotificationService;
59
import io.micronaut.core.annotation.Nullable;
610
import io.micronaut.core.convert.format.Format;
711
import io.micronaut.http.HttpResponse;
@@ -10,6 +14,7 @@
1014
import io.micronaut.http.annotation.Controller;
1115
import io.micronaut.http.annotation.Delete;
1216
import io.micronaut.http.annotation.Get;
17+
import io.micronaut.http.annotation.PathVariable;
1318
import io.micronaut.http.annotation.Post;
1419
import io.micronaut.http.annotation.Put;
1520
import io.micronaut.http.annotation.Status;
@@ -19,6 +24,7 @@
1924
import io.micronaut.security.rules.SecurityRule;
2025
import io.micronaut.validation.Validated;
2126
import io.swagger.v3.oas.annotations.tags.Tag;
27+
import jakarta.inject.Inject;
2228
import jakarta.validation.Valid;
2329
import jakarta.validation.constraints.NotNull;
2430

@@ -35,9 +41,12 @@
3541
public class FeedbackRequestController {
3642

3743
private final FeedbackRequestServices feedbackReqServices;
44+
private final NotificationService notificationService;
3845

39-
public FeedbackRequestController(FeedbackRequestServices feedbackReqServices) {
46+
@Inject
47+
public FeedbackRequestController(FeedbackRequestServices feedbackReqServices, NotificationService notificationService) {
4048
this.feedbackReqServices = feedbackReqServices;
49+
this.notificationService = notificationService;
4150
}
4251

4352
/**
@@ -91,7 +100,7 @@ public void delete(@NotNull UUID id) {
91100
public HttpResponse<FeedbackRequestResponseDTO> getById(UUID id) {
92101
FeedbackRequest savedFeedbackRequest = feedbackReqServices.getById(id);
93102
return savedFeedbackRequest == null ? HttpResponse.notFound() : HttpResponse.ok(fromEntity(savedFeedbackRequest))
94-
.headers(headers -> headers.location(URI.create("/feedback_request" + savedFeedbackRequest.getId())));
103+
.headers(headers -> headers.location(URI.create("/feedback_request/" + savedFeedbackRequest.getId())));
95104
}
96105

97106
/**
@@ -106,13 +115,67 @@ public HttpResponse<FeedbackRequestResponseDTO> getById(UUID id) {
106115
*/
107116
@RequiredPermission(Permission.CAN_VIEW_FEEDBACK_REQUEST)
108117
@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) {
118+
public List<FeedbackRequestResponseDTO> findByValues(
119+
@Nullable UUID creatorId,
120+
@Nullable UUID requesteeId,
121+
@Nullable UUID recipientId,
122+
@Nullable @Format("yyyy-MM-dd") LocalDate oldestDate,
123+
@Nullable UUID reviewPeriodId,
124+
@Nullable UUID templateId,
125+
@Nullable List<UUID> requesteeIds) {
110126
return feedbackReqServices.findByValues(creatorId, requesteeId, recipientId, oldestDate, reviewPeriodId, templateId, requesteeIds)
111127
.stream()
112128
.map(this::fromEntity)
113129
.toList();
114130
}
115131

132+
/**
133+
* Deny a feedback request
134+
*
135+
* @param id {@link UUID} ID of the feedback request to deny
136+
* @param body Request body containing reason, denier, and creator information
137+
* @return {@link FeedbackRequestResponseDTO} with updated denial status
138+
*/
139+
@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();
148+
}
149+
150+
String reason = body.getReason();
151+
DenierDTO denier = body.getDenier();
152+
CreatorDTO creator = body.getCreator();
153+
154+
if (!feedbackRequest.isDenied() && reason != null && !reason.trim().isEmpty()) {
155+
FeedbackRequestUpdateDTO dto = new FeedbackRequestUpdateDTO();
156+
dto.setId(feedbackRequest.getId());
157+
dto.setDueDate(feedbackRequest.getDueDate());
158+
dto.setStatus(feedbackRequest.getStatus());
159+
dto.setSubmitDate(feedbackRequest.getSubmitDate());
160+
dto.setRecipientId(feedbackRequest.getRecipientId());
161+
dto.setDenied(true);
162+
dto.setReason(reason);
163+
164+
FeedbackRequest updatedFeedbackRequest = feedbackReqServices.update(dto);
165+
166+
UUID creatorId = creator.getId();
167+
String denierName = denier.getName();
168+
notificationService.sendNotification(
169+
creatorId,
170+
String.format("Your feedback request was denied by %s. Reason: %s", denierName, reason)
171+
);
172+
173+
return HttpResponse.ok(fromEntity(updatedFeedbackRequest));
174+
}
175+
176+
return HttpResponse.ok(fromEntity(feedbackRequest));
177+
}
178+
116179
private FeedbackRequestResponseDTO fromEntity(FeedbackRequest feedbackRequest) {
117180
FeedbackRequestResponseDTO dto = new FeedbackRequestResponseDTO();
118181
dto.setId(feedbackRequest.getId());
@@ -125,7 +188,8 @@ private FeedbackRequestResponseDTO fromEntity(FeedbackRequest feedbackRequest) {
125188
dto.setStatus(feedbackRequest.getStatus());
126189
dto.setSubmitDate(feedbackRequest.getSubmitDate());
127190
dto.setReviewPeriodId(feedbackRequest.getReviewPeriodId());
128-
191+
dto.setDenied(feedbackRequest.isDenied());
192+
dto.setReason(feedbackRequest.getReason());
129193
return dto;
130194
}
131195

@@ -139,6 +203,9 @@ private FeedbackRequest fromDTO(FeedbackRequestCreateDTO dto) {
139203
dto.getDueDate(),
140204
dto.getStatus(),
141205
dto.getSubmitDate(),
142-
dto.getReviewPeriodId());
206+
dto.getReviewPeriodId(),
207+
dto.isDenied(),
208+
dto.getReason()
209+
);
143210
}
144211
}

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

Lines changed: 8 additions & 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 jakarta.validation.constraints.Null;
78
import lombok.Getter;
89
import lombok.Setter;
910

@@ -51,5 +52,12 @@ public class FeedbackRequestCreateDTO {
5152
@Schema(description = "the id of the review period in that this request was created for")
5253
private UUID reviewPeriodId;
5354

55+
@Schema(description = "Whether the feedback request has been denied")
56+
private boolean denied = false;
57+
58+
@Nullable
59+
@Schema(description = "Reason for the request being denied")
60+
private String reason;
61+
5462
}
5563

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,15 @@ public class FeedbackRequestResponseDTO {
5555
@Schema(description = "the id of the review period in that this request was created for")
5656
private UUID reviewPeriodId;
5757

58+
@Schema(description = "Whether the feedback request has been denied")
59+
private boolean denied = false;
60+
61+
@Nullable
62+
@Schema(description = "Reason for the request being denied")
63+
private String reason;
64+
65+
public FeedbackRequestResponseDTO() {
66+
this.denied = false;
67+
}
68+
5869
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import java.util.List;
55
import java.util.UUID;
66

7+
import io.micronaut.http.HttpResponse;
8+
79
public interface FeedbackRequestServices {
810
FeedbackRequest save(FeedbackRequest feedbackRequest);
911

@@ -14,4 +16,5 @@ public interface FeedbackRequestServices {
1416
FeedbackRequest getById(UUID id);
1517

1618
List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID recipientId, LocalDate oldestDate, UUID reviewPeriodId, UUID templateId, List<UUID> requesteeIds);
19+
1720
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,8 @@ private FeedbackRequest getFromDTO(FeedbackRequestUpdateDTO dto) {
371371
feedbackRequest.setStatus(dto.getStatus());
372372
feedbackRequest.setSubmitDate(dto.getSubmitDate());
373373
feedbackRequest.setRecipientId(dto.getRecipientId());
374-
374+
feedbackRequest.setDenied(dto.isDenied());
375+
feedbackRequest.setReason(dto.getReason());
375376
return feedbackRequest;
376377
}
377378

0 commit comments

Comments
 (0)