Skip to content

Commit 2362589

Browse files
feat: Added API validation to EligibilityCheck API endpoints
feat: Added error logging to JSON Validation Errors
1 parent b1568ae commit 2362589

7 files changed

Lines changed: 33 additions & 33 deletions

File tree

builder-api/src/main/java/org/acme/api/error/JsonServerExceptionMappers.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.acme.api.error;
22

3+
import io.quarkus.logging.Log;
34
import com.fasterxml.jackson.core.JsonParseException;
45
import com.fasterxml.jackson.databind.JsonMappingException;
56
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
@@ -12,6 +13,7 @@ public class JsonServerExceptionMappers {
1213

1314
@ServerExceptionMapper
1415
public Response map(MismatchedInputException e) {
16+
Log.error(e);
1517
// e.g. screenerName is object but DTO expects String
1618
String field =
1719
e.getPath() != null && !e.getPath().isEmpty()
@@ -26,6 +28,7 @@ public Response map(MismatchedInputException e) {
2628

2729
@ServerExceptionMapper
2830
public Response map(JsonParseException e) {
31+
Log.error(e);
2932
// malformed JSON like { "schema": }
3033
return Response.status(Response.Status.BAD_REQUEST)
3134
.type(MediaType.APPLICATION_JSON)
@@ -35,6 +38,7 @@ public Response map(JsonParseException e) {
3538

3639
@ServerExceptionMapper
3740
public Response map(WebApplicationException e) {
41+
Log.error(e);
3842
return Response.status(Response.Status.BAD_REQUEST)
3943
.type(MediaType.APPLICATION_JSON)
4044
.entity(ApiError.of("Malformed JSON."))
@@ -43,6 +47,7 @@ public Response map(WebApplicationException e) {
4347

4448
@ServerExceptionMapper
4549
public Response map(JsonMappingException e) {
50+
Log.error(e);
4651
// other mapping errors
4752
return Response.status(Response.Status.BAD_REQUEST)
4853
.type(MediaType.APPLICATION_JSON)

builder-api/src/main/java/org/acme/controller/EligibilityCheckResource.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.quarkus.logging.Log;
44
import io.quarkus.security.identity.SecurityIdentity;
55
import jakarta.inject.Inject;
6+
import jakarta.validation.Valid;
67
import jakarta.ws.rs.*;
78
import jakarta.ws.rs.core.Context;
89
import jakarta.ws.rs.core.MediaType;
@@ -11,9 +12,9 @@
1112
import org.acme.auth.AuthUtils;
1213
import org.acme.constants.CheckStatus;
1314
import org.acme.model.domain.EligibilityCheck;
14-
import org.acme.model.dto.CheckDmnRequest;
1515
import org.acme.model.dto.CreateCheckRequest;
16-
import org.acme.model.dto.UpdateCheckRequest;
16+
import org.acme.model.dto.EligibilityCheck.CheckDmnRequest;
17+
import org.acme.model.dto.EligibilityCheck.EditCheckRequest;
1718
import org.acme.persistence.EligibilityCheckRepository;
1819
import org.acme.persistence.StorageService;
1920
import org.acme.service.DmnService;
@@ -124,10 +125,11 @@ public Response getCustomCheck(@Context SecurityIdentity identity, @PathParam("c
124125
}
125126

126127
@PATCH
128+
@Consumes(MediaType.APPLICATION_JSON)
127129
@Path("/{checkId}")
128130
public Response updateCustomCheck(@Context SecurityIdentity identity,
129-
@PathParam("checkId") String checkId,
130-
UpdateCheckRequest request){
131+
@PathParam("checkId") String checkId,
132+
@Valid EditCheckRequest request){
131133
String userId = AuthUtils.getUserId(identity);
132134

133135
// Check if the check exists and is not archived
@@ -144,11 +146,11 @@ public Response updateCustomCheck(@Context SecurityIdentity identity,
144146
}
145147

146148
// Partial update: only update fields that are provided (non-null)
147-
if (request.description != null) {
148-
existingCheck.setDescription(request.description);
149+
if (request.description() != null) {
150+
existingCheck.setDescription(request.description());
149151
}
150-
if (request.parameterDefinitions != null) {
151-
existingCheck.setParameterDefinitions(request.parameterDefinitions);
152+
if (request.parameterDefinitions() != null) {
153+
existingCheck.setParameterDefinitions(request.parameterDefinitions());
152154
}
153155

154156
try {
@@ -168,8 +170,8 @@ public Response updateCustomCheck(@Context SecurityIdentity identity,
168170
@Path("/{checkId}/dmn")
169171
public Response saveCheckDmn(@Context SecurityIdentity identity,
170172
@PathParam("checkId") String checkId,
171-
CheckDmnRequest saveDmnRequest){
172-
String dmnModel = saveDmnRequest.dmnModel;
173+
@Valid CheckDmnRequest saveDmnRequest){
174+
String dmnModel = saveDmnRequest.dmnModel();
173175

174176
String userId = AuthUtils.getUserId(identity);
175177
Optional<EligibilityCheck> checkOpt = eligibilityCheckRepository.getWorkingCustomCheck(userId, checkId);
@@ -202,8 +204,8 @@ public Response saveCheckDmn(@Context SecurityIdentity identity,
202204
@Path("/{checkId}/dmn/validate")
203205
public Response validateCheckDmn(@Context SecurityIdentity identity,
204206
@PathParam("checkId") String checkId,
205-
CheckDmnRequest validateDmnRequest){
206-
String dmnModel = validateDmnRequest.dmnModel;
207+
@Valid CheckDmnRequest validateDmnRequest){
208+
String dmnModel = validateDmnRequest.dmnModel();
207209

208210
String userId = AuthUtils.getUserId(identity);
209211
Optional<EligibilityCheck> checkOpt = eligibilityCheckRepository.getWorkingCustomCheck(userId, checkId);

builder-api/src/main/java/org/acme/controller/ScreenerResource.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,6 @@ public Response saveFormSchema(
174174
return Response.status(400).entity(violations.toString()).build();
175175
}
176176

177-
// // Make sure request.schema is not null
178-
// if (request.schema() == null || request.schema().isNull()) {
179-
// return Response.status(Response.Status.BAD_REQUEST)
180-
// .entity(ApiError.of("schema cannot be null."))
181-
// .build();
182-
// }
183-
184177
String userId = AuthUtils.getUserId(identity);
185178

186179
// Fetch Screener record and confirm user is authorized

builder-api/src/main/java/org/acme/model/dto/CheckDmnRequest.java

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package org.acme.model.dto.EligibilityCheck;
2+
3+
public record CheckDmnRequest(String dmnModel) {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.acme.model.dto.EligibilityCheck;
2+
3+
import org.acme.api.validation.AtLeastOneProvided;
4+
import org.acme.model.domain.ParameterDefinition;
5+
import java.util.List;
6+
7+
8+
@AtLeastOneProvided(fields = {"description", "parameterDefinitions"})
9+
public record EditCheckRequest(
10+
String description, List<ParameterDefinition> parameterDefinitions
11+
) {}

builder-api/src/main/java/org/acme/model/dto/UpdateCheckRequest.java

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)