Skip to content

Commit 73b3964

Browse files
Merge pull request #174 from Justin-MacIntosh/manage-benefits-testing
Manage Eligibility Checks and Manage Benefits workflows
2 parents 692439c + c789e1a commit 73b3964

File tree

86 files changed

+4459
-773
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+4459
-773
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
22
"thunder-client.saveToWorkspace": true,
3-
"thunder-client.workspaceRelativePath": "library-api"
3+
"thunder-client.workspaceRelativePath": "library-api",
4+
"java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx4G -Xms100m -Xlog:disable"
45
}

builder-api/src/main/java/org/acme/constants/CollectionNames.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@
33
public class CollectionNames {
44
public static final String SCREENER_COLLECTION = "screener";
55
public static final String DMN_MODEL_COLLECTION = "dmn_model";
6+
public static final String ELIGIBILITY_CHECK_COLLECTION = "eligibilityCheck";
7+
public static final String BENEFIT_COLLECTION = "benefit";
68
}

builder-api/src/main/java/org/acme/constants/FieldNames.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class FieldNames {
1919
public static final String LAST_DMN_SAVE = "lastDmnSave";
2020
public static final String LAST_DMN_COMPILE = "lastDmnCompile";
2121
public static final String DEPENDENCIES = "dependencies";
22+
public static final String BENEFITS = "benefits";
2223

2324
// DmnModel Database fields
2425
public static final String GROUP_ID = "group_id";
@@ -30,4 +31,7 @@ public class FieldNames {
3031
public static final String MODEL_NAME = "name";
3132
public static final String MODEL_DESCRIPTION = "description";
3233
public static final String MODEL_SHORT_DESCRIPTION = "short_description";
34+
35+
// Benefit Fields
36+
public static final String IS_PUBLIC = "isPublic";
3337
}
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
package org.acme.controller;
2+
3+
import io.quarkus.logging.Log;
4+
import io.quarkus.security.identity.SecurityIdentity;
5+
import jakarta.inject.Inject;
6+
import jakarta.ws.rs.*;
7+
import jakarta.ws.rs.core.Context;
8+
import jakarta.ws.rs.core.MediaType;
9+
import jakarta.ws.rs.core.Response;
10+
import org.acme.auth.AuthUtils;
11+
import org.acme.model.domain.Benefit;
12+
import org.acme.model.domain.EligibilityCheck;
13+
import org.acme.persistence.BenefitRepository;
14+
import org.acme.persistence.EligibilityCheckRepository;
15+
16+
import java.util.List;
17+
import java.util.Map;
18+
import java.util.Optional;
19+
20+
@Path("/api")
21+
public class BenefitResource {
22+
23+
@Inject
24+
BenefitRepository benefitRepository;
25+
26+
@Inject
27+
EligibilityCheckRepository eligibilityCheckRepository;
28+
29+
@GET
30+
@Path("/benefit")
31+
public Response getAllBenefits(@Context SecurityIdentity identity) {
32+
String userId = AuthUtils.getUserId(identity);
33+
if (userId == null){
34+
return Response.status(Response.Status.UNAUTHORIZED).build();
35+
}
36+
Log.info("Fetching all eligibility checks. User: " + userId);
37+
List<Benefit> benefits = benefitRepository.getAllPublicBenefits();
38+
39+
return Response.ok(benefits, MediaType.APPLICATION_JSON).build();
40+
}
41+
42+
@GET
43+
@Path("/benefit/{benefitId}")
44+
public Response getBenefit(@Context SecurityIdentity identity,
45+
@PathParam("benefitId") String benefitId) {
46+
String userId = AuthUtils.getUserId(identity);
47+
if (userId == null){
48+
return Response.status(Response.Status.UNAUTHORIZED).build();
49+
}
50+
Log.info("Fetching benefit: " + benefitId + " for user: " + userId);
51+
Optional<Benefit> benefitOpt = benefitRepository.getBenefit(benefitId);
52+
53+
if (benefitOpt.isEmpty()){
54+
return Response.status(Response.Status.NOT_FOUND).build();
55+
}
56+
57+
Benefit benefit = benefitOpt.get();
58+
59+
if (!benefit.getPublic() && !benefit.getOwnerId().equals(userId)){
60+
return Response.status(Response.Status.UNAUTHORIZED).build();
61+
}
62+
return Response.ok(benefit, MediaType.APPLICATION_JSON).build();
63+
}
64+
65+
66+
// Get all of the full Eligibility Check Objects that have been added to a Public Benefit
67+
@GET
68+
@Path("/benefit/{benefitId}/check")
69+
public Response getBenefitChecks(@Context SecurityIdentity identity,
70+
@PathParam("benefitId") String benefitId) {
71+
String userId = AuthUtils.getUserId(identity);
72+
if (userId == null){
73+
return Response.status(Response.Status.UNAUTHORIZED).build();
74+
}
75+
Log.info("Fetching all eligibility checks for Benefit: " + benefitId + " User: " + userId);
76+
Optional<Benefit> benefitOpt = benefitRepository.getBenefit(benefitId);
77+
78+
if (benefitOpt.isEmpty()){
79+
return Response.status(Response.Status.NOT_FOUND).build();
80+
}
81+
Benefit benefit = benefitOpt.get();
82+
83+
if (!benefit.getPublic() && !benefit.getOwnerId().equals(userId)){
84+
return Response.status(Response.Status.UNAUTHORIZED).build();
85+
}
86+
List<EligibilityCheck> checks = eligibilityCheckRepository.getChecksInBenefit(benefit);
87+
88+
return Response.ok(checks, MediaType.APPLICATION_JSON).build();
89+
}
90+
91+
92+
@PUT
93+
@Consumes(MediaType.APPLICATION_JSON)
94+
@Path("/benefit")
95+
public Response updateBenefit(@Context SecurityIdentity identity,
96+
Benefit newBenefit) {
97+
String userId = AuthUtils.getUserId(identity);
98+
//TODO: Add validations for user provided data
99+
100+
newBenefit.setOwnerId(userId);
101+
try {
102+
Optional<Benefit> benefitOpt = benefitRepository.getBenefit(newBenefit.getId());
103+
if (benefitOpt.isEmpty()){
104+
return Response.status(Response.Status.NOT_FOUND).build();
105+
}
106+
Benefit existingBenefit = benefitOpt.get();
107+
108+
if (!isUserAuthorizedToUpdateBenefit(userId, existingBenefit)){
109+
return Response.status(Response.Status.UNAUTHORIZED).build();
110+
}
111+
112+
113+
benefitRepository.updateBenefit(newBenefit);
114+
return Response.ok(newBenefit, MediaType.APPLICATION_JSON).build();
115+
116+
} catch (Exception e){
117+
Log.error(e);
118+
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
119+
.entity(Map.of("error", "Could not update benefit"))
120+
.build();
121+
}
122+
}
123+
124+
// Utility endpoint to create a public benefit
125+
@POST
126+
@Path("/benefit")
127+
public Response createBenefit(@Context SecurityIdentity identity,
128+
Benefit newBenefit) {
129+
String userId = AuthUtils.getUserId(identity);
130+
131+
//TODO: Add validations for user provided data
132+
133+
newBenefit.setOwnerId(userId);
134+
try {
135+
String benefitId = benefitRepository.saveNewBenefit(newBenefit);
136+
newBenefit.setId(benefitId);
137+
return Response.ok(newBenefit, MediaType.APPLICATION_JSON).build();
138+
} catch (Exception e){
139+
Log.error(e);
140+
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
141+
.entity(Map.of("error", "Could not save benefit"))
142+
.build();
143+
}
144+
}
145+
146+
private boolean isUserAuthorizedToUpdateBenefit(String userId, Benefit benefit) {
147+
String ownerId = benefit.getOwnerId();
148+
if (ownerId == null){
149+
return false;
150+
}
151+
if (userId.equals(ownerId)){
152+
return true;
153+
}
154+
return false;
155+
}
156+
}

0 commit comments

Comments
 (0)