11package org .hl7 .davinci .endpoint .rems .controller ;
22
3+ import com .google .gson .Gson ;
4+ import com .google .gson .GsonBuilder ;
5+ import com .google .gson .JsonObject ;
6+ import com .google .gson .JsonParser ;
7+ import com .fasterxml .jackson .databind .JsonNode ;
8+ import com .vladmihalcea .hibernate .type .json .internal .JacksonUtil ;
9+ import org .hl7 .davinci .endpoint .rems .database .requirement .MetRequirement ;
10+ import org .hl7 .davinci .endpoint .rems .database .requirement .MetRequirementRepository ;
11+ import org .hl7 .davinci .endpoint .rems .database .requirement .Requirement ;
12+
313import org .hl7 .davinci .endpoint .Application ;
414import org .hl7 .davinci .endpoint .rems .database .drugs .Drug ;
515import org .hl7 .davinci .endpoint .rems .database .drugs .DrugsRepository ;
616import org .springframework .beans .factory .annotation .Autowired ;
17+ import org .hl7 .davinci .endpoint .rems .database .rems .Rems ;
18+ import org .hl7 .davinci .endpoint .rems .database .rems .RemsRepository ;
719import org .springframework .http .MediaType ;
820import org .springframework .http .ResponseEntity ;
921import org .springframework .web .bind .annotation .CrossOrigin ;
1022import org .springframework .web .bind .annotation .GetMapping ;
1123import org .springframework .web .bind .annotation .PathVariable ;
1224import org .springframework .web .bind .annotation .RestController ;
1325
26+ import org .springframework .core .io .Resource ;
27+ import org .springframework .http .HttpHeaders ;
28+ import org .springframework .http .MediaType ;
29+ import org .springframework .web .bind .annotation .*;
30+ import org .springframework .http .ResponseEntity ;
31+ import org .springframework .web .servlet .view .RedirectView ;
32+ import java .util .Optional ;
33+ import java .util .UUID ;
34+ import java .util .concurrent .TimeUnit ;
35+ import org .springframework .web .server .ResponseStatusException ;
36+ import org .springframework .http .HttpStatus ;
37+ import java .util .Arrays ;
38+
1439import javax .servlet .http .HttpServletRequest ;
1540import java .io .IOException ;
1641import java .util .logging .Logger ;
@@ -25,7 +50,13 @@ public class RemsController {
2550 @ Autowired
2651 private DrugsRepository drugsRepository ;
2752
28- @ GetMapping (value = "/rems/{id}" )
53+ @ Autowired
54+ private RemsRepository remsRepository ;
55+
56+ @ Autowired
57+ private MetRequirementRepository metRequirementsRepository ;
58+
59+ @ GetMapping (value = "/drug/{id}" )
2960 @ CrossOrigin
3061 public ResponseEntity <Drug > getRequirements (HttpServletRequest request , @ PathVariable String id ) throws IOException {
3162 Drug drug = drugsRepository .findById (id ).get ();
@@ -41,4 +72,87 @@ private ResponseEntity<Drug> processRequirements(Drug drug) {
4172 .contentType (MediaType .parseMediaType (MediaType .APPLICATION_JSON_VALUE ))
4273 .body (drug );
4374 }
75+
76+ public void updateRemsRequestStatus (String uid ) {
77+ try {
78+ TimeUnit .SECONDS .sleep (30 );
79+ }
80+ catch (Exception e )
81+ {
82+ System .out .println (e );
83+ }
84+ Rems rems = remsRepository .findById (uid ).orElseThrow (() -> new ResponseStatusException (HttpStatus .NOT_FOUND , uid + " not found" ));
85+ rems .setStatus ("Approved" );
86+ remsRepository .save (rems );
87+ }
88+
89+ public void updateRemsRequestStatusInBackground (final String uid ) {
90+ Thread t = new Thread (() -> updateRemsRequestStatus (uid ));
91+ t .start ();
92+ }
93+
94+ @ PostMapping (value = "/rems" )
95+ @ CrossOrigin
96+ public ResponseEntity <Object > postRems (@ RequestBody String jsonData ) {
97+ JsonNode remsObject = JacksonUtil .toJsonNode (jsonData );
98+ String id = UUID .randomUUID ().toString ().replace ("-" , "" );
99+
100+ JsonNode params = getResource (remsObject , remsObject .get ("entry" ).get (0 ).get ("resource" ).get ("focus" ).get ("parameters" ).get ("reference" ).textValue ());
101+
102+ String prescriptionReference = "" ;
103+ for (JsonNode param : params .get ("parameter" )) {
104+ if (param .get ("name" ).textValue ().equals ("prescription" )) {
105+ prescriptionReference = param .get ("reference" ).textValue ();
106+ }
107+ }
108+
109+ JsonNode presciption = getResource (remsObject , prescriptionReference );
110+ String prescriptionSystem = presciption .get ("medicationCodeableConcept" ).get ("coding" ).get (0 ).get ("system" ).textValue ();
111+ String prescriptionCode = presciption .get ("medicationCodeableConcept" ).get ("coding" ).get (0 ).get ("code" ).textValue ();
112+ Drug drug = drugsRepository .findDrugByCode (prescriptionSystem , prescriptionCode ).get (0 );
113+
114+
115+
116+ Rems remsRequest = new Rems ();
117+ remsRequest .setCase_number (id );
118+ remsRequest .setStatus ("Pending" );
119+ remsRequest .setResource (remsObject );
120+ remsRepository .save (remsRequest );
121+
122+ // this loop needs to change to handle multiple levels of sub-requirement conditions
123+ // this loop needs to also handle parsing out resources for each requirement - may need to be separate endpoints
124+ for (Requirement requirement : drug .getRequirements ()) {
125+ MetRequirement metReq = new MetRequirement ();
126+ metReq .setRequirement (requirement );
127+ metReq .setRemsRequest (remsRequest );
128+ remsRequest .addMetRequirement (metReq );
129+ metRequirementsRepository .save (metReq );
130+ }
131+ remsRepository .save (remsRequest );
132+ updateRemsRequestStatusInBackground (id );
133+ return ResponseEntity .ok ().body (remsRequest );
134+
135+ }
136+
137+ @ CrossOrigin
138+ @ GetMapping ("/rems/{id}" )
139+ public ResponseEntity <Object > getRems (@ PathVariable String id ) {
140+ Rems rems = remsRepository .findById (id ).orElseThrow (() -> new ResponseStatusException (HttpStatus .NOT_FOUND , id + " not found" ));
141+ return ResponseEntity .ok ().body (rems );
142+ }
143+
144+ public JsonNode getResource (JsonNode bundle , String resourceReference ) {
145+ String [] temp = resourceReference .split ("/" );
146+ String _resourceType = temp [0 ];
147+ String _id = temp [1 ];
148+
149+ for (int i = 0 ; i < bundle .get ("entry" ).size (); i ++) {
150+ if ((bundle .get ("entry" ).get (i ).get ("resource" ).get ("resourceType" ).textValue ().equals (_resourceType ))
151+ && (bundle .get ("entry" ).get (i ).get ("resource" ).get ("id" ).textValue ().equals (_id ))) {
152+ return bundle .get ("entry" ).get (i ).get ("resource" );
153+ }
154+ }
155+ return null ;
156+ }
157+
44158}
0 commit comments