1111import org .acme .auth .AuthUtils ;
1212import org .acme .enums .OptionalBoolean ;
1313import org .acme .model .domain .Benefit ;
14+ import org .acme .model .domain .CheckConfig ;
1415import org .acme .model .domain .EligibilityCheck ;
1516import org .acme .model .domain .Screener ;
16- import org .acme .persistence .BenefitRepository ;
1717import org .acme .persistence .EligibilityCheckRepository ;
18+ import org .acme .persistence .PublishedScreenerRepository ;
1819import org .acme .persistence .ScreenerRepository ;
1920import org .acme .persistence .StorageService ;
2021import org .acme .service .DmnService ;
2324
2425@ Path ("/api" )
2526public class DecisionResource {
26-
27+
2728 @ Inject
28- ScreenerRepository screenerRepository ;
29+ EligibilityCheckRepository eligibilityCheckRepository ;
2930
3031 @ Inject
31- StorageService storageService ;
32+ ScreenerRepository screenerRepository ;
3233
3334 @ Inject
34- DmnService dmnService ;
35+ PublishedScreenerRepository publishedScreenerRepository ;
3536
3637 @ Inject
37- EligibilityCheckRepository eligibilityCheckRepository ;
38+ StorageService storageService ;
3839
3940 @ Inject
40- BenefitRepository benefitRepository ;
41+ DmnService dmnService ;
4142
4243 @ POST
43- @ Path ("/decision/v2 " )
44+ @ Path ("/published/{screenerId}/evaluate " )
4445 @ Consumes (MediaType .APPLICATION_JSON )
4546 @ Produces (MediaType .APPLICATION_JSON )
46- public Response evaluateScreener (
47- @ Context SecurityIdentity identity ,
48- @ QueryParam ("screenerId" ) String screenerId ,
47+ public Response evaluatePublishedScreener (
48+ @ PathParam ("screenerId" ) String screenerId ,
4949 Map <String , Object > inputData
5050 ) throws Exception {
51- // Authorize user and get benefit
52- String userId = AuthUtils .getUserId (identity );
53- if (screenerId .isEmpty () || !isUserAuthorizedToAccessScreenerByScreenerId (userId , screenerId )){
54- return Response .status (Response .Status .UNAUTHORIZED ).build ();
55- }
56-
57- Optional <Screener > screenerOpt = screenerRepository .getWorkingScreener (screenerId );
51+ Optional <Screener > screenerOpt = publishedScreenerRepository .getScreener (screenerId );
5852 if (screenerOpt .isEmpty ()){
53+ Log .info ("Screener not found: " + screenerId );
5954 return Response .status (Response .Status .NOT_FOUND ).build ();
6055 }
6156 Screener screener = screenerOpt .get ();
6257
63- List <Benefit > benefits = benefitRepository .getBenefitsInScreener (screener );
58+ List <Benefit > benefits = publishedScreenerRepository .getBenefitsInScreener (screener );
6459 if (benefits .isEmpty ()){
60+ Log .info ("Benefits not found: " + screenerId );
6561 return Response .status (Response .Status .NOT_FOUND ).build ();
6662 }
6763
6864 try {
6965 Map <String , Object > screenerResults = new HashMap <String , Object >();
7066 for (Benefit benefit : benefits ) {
7167 // Evaluate benefit
72- Map <String , Object > benefitResults = evaluateBenefitDmn (benefit , inputData );
68+ Map <String , Object > benefitResults = evaluateBenefit (benefit , inputData );
7369 screenerResults .put (benefit .getId (), benefitResults );
7470 }
7571 return Response .ok ().entity (screenerResults ).build ();
@@ -80,53 +76,46 @@ public Response evaluateScreener(
8076 }
8177
8278 @ POST
83- @ Path ("/decision/v2/benefit " )
79+ @ Path ("/decision/v2" )
8480 @ Consumes (MediaType .APPLICATION_JSON )
8581 @ Produces (MediaType .APPLICATION_JSON )
86- public Response evaluateBenefit (
82+ public Response evaluateScreener (
8783 @ Context SecurityIdentity identity ,
8884 @ QueryParam ("screenerId" ) String screenerId ,
89- @ QueryParam ("benefitId" ) String benefitId ,
9085 Map <String , Object > inputData
9186 ) throws Exception {
92- if (benefitId == null || benefitId .isBlank ()){
93- return Response .status (Response .Status .BAD_REQUEST )
94- .entity ("Error: Missing required query parameter: benefitId" )
95- .build ();
96- }
97- if (inputData == null || inputData .isEmpty ()){
98- return Response .status (Response .Status .BAD_REQUEST )
99- .entity ("Error: Missing decision inputs" )
100- .build ();
101- }
102-
10387 // Authorize user and get benefit
10488 String userId = AuthUtils .getUserId (identity );
105- Optional <Benefit > benefitOpt = Optional .empty ();
106- if (!screenerId .isEmpty ()){
107- if (!isUserAuthorizedToAccessScreenerByScreenerId (userId , screenerId )){
108- return Response .status (Response .Status .UNAUTHORIZED ).build ();
109- }
110- benefitOpt = benefitRepository .getCustomBenefit (screenerId , benefitId );
111- } else {
112- benefitOpt = benefitRepository .getBenefit (benefitId );
89+ if (screenerId .isEmpty () || !isUserAuthorizedToAccessScreenerByScreenerId (userId , screenerId )){
90+ return Response .status (Response .Status .UNAUTHORIZED ).build ();
91+ }
92+
93+ Optional <Screener > screenerOpt = screenerRepository .getWorkingScreener (screenerId );
94+ if (screenerOpt .isEmpty ()){
95+ return Response .status (Response .Status .NOT_FOUND ).build ();
11396 }
114- if (benefitOpt .isEmpty ()){
97+ Screener screener = screenerOpt .get ();
98+
99+ List <Benefit > benefits = screenerRepository .getBenefitsInScreener (screener );
100+ if (benefits .isEmpty ()){
115101 return Response .status (Response .Status .NOT_FOUND ).build ();
116102 }
117103
118- Benefit benefit = benefitOpt .get ();
119104 try {
120- // Evaluate benefit
121- Map <String , Object > results = evaluateBenefitDmn (benefit , inputData );
122- return Response .ok ().entity (results ).build ();
105+ Map <String , Object > screenerResults = new HashMap <String , Object >();
106+ for (Benefit benefit : benefits ) {
107+ // Evaluate benefit
108+ Map <String , Object > benefitResults = evaluateBenefit (benefit , inputData );
109+ screenerResults .put (benefit .getId (), benefitResults );
110+ }
111+ return Response .ok ().entity (screenerResults ).build ();
123112 } catch (Exception e ) {
124113 Log .error ("Error: " + e .getMessage ());
125114 return Response .status (Response .Status .INTERNAL_SERVER_ERROR ).build ();
126115 }
127116 }
128117
129- private Map <String , Object > evaluateBenefitDmn (Benefit benefit , Map <String , Object > inputData ) throws Exception {
118+ private Map <String , Object > evaluateBenefit (Benefit benefit , Map <String , Object > inputData ) throws Exception {
130119 List <EligibilityCheck > checks = eligibilityCheckRepository .getChecksInBenefit (benefit );
131120
132121 if (benefit .getPublic ()){
@@ -138,50 +127,48 @@ private Map<String, Object> evaluateBenefitDmn(Benefit benefit, Map<String, Obje
138127 List <OptionalBoolean > checkResultsList = new ArrayList <>();
139128 Map <String , Object > checkResults = new HashMap <>();
140129
141- Map <String , Object > result = new HashMap <>();
142- return result ;
143- //TODO: update implementation here
144- // for (EligibilityCheck check : checks) {
145- // Optional<CheckConfig> matchingCheckConfig = benefit.getChecks().stream().filter(
146- // checkConfig -> checkConfig.getCheckId().equals(check.getId())
147- // ).findFirst();
148- // if (matchingCheckConfig.isEmpty()) {
149- // throw new Exception("Could not find CheckConfig for check " + check.getId());
150- // }
151- //
152- // String dmnFilepath = storageService.getCheckDmnModelPath(
153- // check.getModule(), check.getId(), check.getVersion()
154- // );
155- // String dmnModelName = check.getId();
156- //
157- // OptionalBoolean result = dmnService.evaluateSimpleDmn(
158- // dmnFilepath, dmnModelName, inputData, matchingCheckConfig.get().getParameters()
159- // );
160- // checkResultsList.add(result);
161- // checkResults.put(check.getId(), Map.of("name", check.getName(), "result", result));
162- // }
163- //
164- // // Determine overall Benefit result
165- // Boolean allChecksTrue = checkResultsList.stream().allMatch(result -> result == OptionalBoolean.TRUE);
166- // Boolean anyChecksFalse = checkResultsList.stream().anyMatch(result -> result == OptionalBoolean.FALSE);
167- // Log.info("All True: " + allChecksTrue + " Any False: " + anyChecksFalse);
168- //
169- // OptionalBoolean benefitResult;
170- // if (allChecksTrue) {
171- // benefitResult = OptionalBoolean.TRUE;
172- // } else if (anyChecksFalse) {
173- // benefitResult = OptionalBoolean.FALSE;
174- // } else {
175- // benefitResult = OptionalBoolean.UNABLE_TO_DETERMINE;
176- // }
177- //
178- // return new HashMap<String, Object>(
179- // Map.of(
180- // "name", benefit.getName(),
181- // "result", benefitResult,
182- // "check_results", checkResults
183- // )
184- // );
130+ // TODO: update implementation here
131+ for (EligibilityCheck check : checks ) {
132+ Optional <CheckConfig > matchingCheckConfig = benefit .getChecks ().stream ().filter (
133+ checkConfig -> checkConfig .getCheckId ().equals (check .getId ())
134+ ).findFirst ();
135+ if (matchingCheckConfig .isEmpty ()) {
136+ throw new Exception ("Could not find CheckConfig for check " + check .getId ());
137+ }
138+
139+ String dmnFilepath = storageService .getCheckDmnModelPath (
140+ check .getOwnerId (), check .getId ()
141+ );
142+ String dmnModelName = check .getId ();
143+
144+ OptionalBoolean result = dmnService .evaluateSimpleDmn (
145+ dmnFilepath , dmnModelName , inputData , matchingCheckConfig .get ().getParameters ()
146+ );
147+ checkResultsList .add (result );
148+ checkResults .put (check .getId (), Map .of ("name" , check .getName (), "result" , result ));
149+ }
150+
151+ // Determine overall Benefit result
152+ Boolean allChecksTrue = checkResultsList .stream ().allMatch (result -> result == OptionalBoolean .TRUE );
153+ Boolean anyChecksFalse = checkResultsList .stream ().anyMatch (result -> result == OptionalBoolean .FALSE );
154+ Log .info ("All True: " + allChecksTrue + " Any False: " + anyChecksFalse );
155+
156+ OptionalBoolean benefitResult ;
157+ if (allChecksTrue ) {
158+ benefitResult = OptionalBoolean .TRUE ;
159+ } else if (anyChecksFalse ) {
160+ benefitResult = OptionalBoolean .FALSE ;
161+ } else {
162+ benefitResult = OptionalBoolean .UNABLE_TO_DETERMINE ;
163+ }
164+
165+ return new HashMap <String , Object >(
166+ Map .of (
167+ "name" , benefit .getName (),
168+ "result" , benefitResult ,
169+ "check_results" , checkResults
170+ )
171+ );
185172 }
186173 }
187174
0 commit comments