Skip to content
This repository was archived by the owner on Jul 31, 2023. It is now read-only.

Commit 94d8d05

Browse files
Merge pull request #24 from mcode/met-requirements
Met requirements
2 parents 620fdc7 + 0b46645 commit 94d8d05

16 files changed

Lines changed: 1059 additions & 94 deletions

server/src/main/java/org/hl7/davinci/endpoint/controllers/DataController.java

Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ public class DataController {
4444
@Autowired
4545
private ClientRepository clientRepository;
4646

47-
@Autowired
48-
private RemsRepository remsRepository;
47+
// @Autowired
48+
// private RemsRepository remsRepository;
4949

5050
@Autowired
5151
private YamlConfig myConfig;
@@ -165,44 +165,4 @@ public RedirectView reload(@RequestParam String vsac_api_key) {
165165
return new RedirectView(newUrl);
166166
}
167167

168-
public void updateComplianceBundleStatus(String uid) {
169-
try {
170-
TimeUnit.SECONDS.sleep(30);
171-
}
172-
catch(Exception e)
173-
{
174-
System.out.println(e);
175-
}
176-
Rems rems = remsRepository.findById(uid).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, uid + " not found"));
177-
rems.setStatus("Approved");
178-
remsRepository.save(rems);
179-
}
180-
181-
public void updateComplianceBundleStatusInBackground (final String uid) {
182-
Thread t = new Thread(() -> updateComplianceBundleStatus(uid));
183-
t.start();
184-
}
185-
186-
@PostMapping(value = "/api/rems")
187-
@CrossOrigin
188-
public ResponseEntity<Object> postRems(@RequestBody String jsonData) {
189-
JsonNode remsObject = JacksonUtil.toJsonNode(jsonData);
190-
String id = UUID.randomUUID().toString().replace("-", "");
191-
192-
Rems complianceBundle = new Rems();
193-
complianceBundle.setCase_number(id);
194-
complianceBundle.setComplianceBundle(remsObject);
195-
complianceBundle.setStatus("Pending");
196-
remsRepository.save(complianceBundle);
197-
updateComplianceBundleStatusInBackground(id);
198-
return ResponseEntity.ok().body(complianceBundle);
199-
200-
}
201-
202-
@CrossOrigin
203-
@GetMapping("/api/rems/{id}")
204-
public ResponseEntity<Object> getRems(@PathVariable String id) {
205-
Rems rems = remsRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, id + " not found"));
206-
return ResponseEntity.ok().body(rems);
207-
}
208168
}

server/src/main/java/org/hl7/davinci/endpoint/rems/DatabaseInit.java

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,54 @@ CommandLineRunner initDatabase(DrugsRepository repository, RemsFhirRepository re
4646
return args -> {
4747
log.info("Preloading turalio");
4848
Drug turalio = new Drug();
49-
50-
String questionnaire = readFile("src/main/java/org/hl7/davinci/endpoint/rems/resources/Turalio/fhir/Questionnaire-R4-DrugHasREMS.json", Charset.defaultCharset());
51-
Requirement requirement = new Requirement();
52-
RemsFhir remsFhir = new RemsFhir();
53-
remsFhir.setResourceType(ResourceType.Questionnaire.toString());
54-
JsonNode questionnaireResource = JacksonUtil.toJsonNode(questionnaire);
55-
remsFhir.setResource(questionnaireResource);
56-
remsFhir.setId("q1");
57-
remsFhirRepository.save(remsFhir);
58-
requirement.setRequirement(remsFhir);
59-
requirement.setDescription("complete questionnaire");
60-
turalio.addRequirement(requirement);
6149
turalio.setId("turalio");
62-
repository.save(turalio);
63-
requirement.setDrug(turalio);
64-
requirementRepository.save(requirement);
50+
turalio.setCodeSystem("http://www.nlm.nih.gov/research/umls/rxnorm");
51+
turalio.setCode("2183126");
52+
repository.save(turalio);;
53+
54+
55+
// patient enrollment form requirement
56+
String patientQuestionnaire = readFile("src/main/java/org/hl7/davinci/endpoint/rems/resources/Turalio/fhir/Questionnaire-R4-DrugHasREMS.json", Charset.defaultCharset());
57+
Requirement patientEnrollmentRequirement = new Requirement();
58+
RemsFhir patientEnrollmentResource = new RemsFhir();
59+
patientEnrollmentResource.setResourceType(ResourceType.Questionnaire.toString());
60+
JsonNode patientQuestionnaireResource = JacksonUtil.toJsonNode(patientQuestionnaire);
61+
patientEnrollmentResource.setResource(patientQuestionnaireResource);
62+
patientEnrollmentResource.setId("turalio-patient-enrollment");
63+
remsFhirRepository.save(patientEnrollmentResource);
64+
patientEnrollmentRequirement.setResource(patientEnrollmentResource);
65+
patientEnrollmentRequirement.setDescription("complete patient enrollment questionnaire");
66+
patientEnrollmentRequirement.setDrug(turalio);
67+
requirementRepository.save(patientEnrollmentRequirement);
68+
69+
// prescriber enrollment form requirement
70+
String prescriberQuestionnaire = readFile("src/main/java/org/hl7/davinci/endpoint/rems/resources/Turalio/Questionnaire-R4-Prescriber-Enrollment.json", Charset.defaultCharset());
71+
Requirement prescriberEnrollmentRequirement = new Requirement();
72+
RemsFhir prescriberEnrollmentResource = new RemsFhir();
73+
prescriberEnrollmentResource.setResourceType(ResourceType.Questionnaire.toString());
74+
JsonNode prescriberQuestionnaireResource = JacksonUtil.toJsonNode(prescriberQuestionnaire);
75+
prescriberEnrollmentResource.setResource(prescriberQuestionnaireResource);
76+
prescriberEnrollmentResource.setId("turalio-prescriber-enrollment");
77+
remsFhirRepository.save(prescriberEnrollmentResource);
78+
prescriberEnrollmentRequirement.setResource(prescriberEnrollmentResource);
79+
prescriberEnrollmentRequirement.setDescription("complete prescriber enrollment questionnaire");
80+
prescriberEnrollmentRequirement.setDrug(turalio);
81+
requirementRepository.save(prescriberEnrollmentRequirement);
82+
83+
// prescriber knowledge assessment / certification sub-requirement
84+
String prescriberKnowledgeQuestionnaire = readFile("src/main/java/org/hl7/davinci/endpoint/rems/resources/Turalio/Questionnaire-R4-Prescriber-Knowledge-Assessment.json", Charset.defaultCharset());
85+
Requirement prescriberCertificationRequirement = new Requirement();
86+
RemsFhir prescriberKnowledgeResource = new RemsFhir();
87+
prescriberKnowledgeResource.setResourceType(ResourceType.Questionnaire.toString());
88+
JsonNode prescriberKnowledgeQuestionnaireResource = JacksonUtil.toJsonNode(prescriberKnowledgeQuestionnaire);
89+
prescriberKnowledgeResource.setResource(prescriberKnowledgeQuestionnaireResource);
90+
prescriberKnowledgeResource.setId("turalio-prescriber-knowledge-check");
91+
remsFhirRepository.save(prescriberKnowledgeResource);
92+
prescriberCertificationRequirement.setResource(prescriberKnowledgeResource);
93+
prescriberCertificationRequirement.setDescription("complete prescriber knowledge check");
94+
prescriberCertificationRequirement.setParent(prescriberEnrollmentRequirement);
95+
requirementRepository.save(prescriberCertificationRequirement);
96+
6597
};
6698
}
6799
}

server/src/main/java/org/hl7/davinci/endpoint/rems/controller/RemsController.java

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,41 @@
11
package 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+
313
import org.hl7.davinci.endpoint.Application;
414
import org.hl7.davinci.endpoint.rems.database.drugs.Drug;
515
import org.hl7.davinci.endpoint.rems.database.drugs.DrugsRepository;
616
import 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;
719
import org.springframework.http.MediaType;
820
import org.springframework.http.ResponseEntity;
921
import org.springframework.web.bind.annotation.CrossOrigin;
1022
import org.springframework.web.bind.annotation.GetMapping;
1123
import org.springframework.web.bind.annotation.PathVariable;
1224
import 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+
1439
import javax.servlet.http.HttpServletRequest;
1540
import java.io.IOException;
1641
import 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
}

server/src/main/java/org/hl7/davinci/endpoint/rems/database/drugs/Drug.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class Drug {
2424
@Column(name = "createdAt", nullable = false)
2525
private String createdAt;
2626

27-
@OneToMany(mappedBy="drug")
27+
@OneToMany(mappedBy="drug", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
2828
private List<Requirement> requirements = new ArrayList<>();
2929

3030
public Drug() {

server/src/main/java/org/hl7/davinci/endpoint/rems/database/drugs/DrugsRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
66
import org.springframework.stereotype.Repository;
77
import org.springframework.web.bind.annotation.CrossOrigin;
8+
import org.springframework.data.repository.query.Param;
9+
810

911
import java.util.List;
1012

@@ -18,5 +20,7 @@ public interface DrugsRepository extends CrudRepository<Drug, String> {
1820
"SELECT r FROM Drug r")
1921
List<Drug> findLogs();
2022

23+
@Query("SELECT r FROM Drug r where r.codeSystem = :system and r.code = :code")
24+
List<Drug> findDrugByCode(@Param("system") String system, @Param("code") String code);
2125
}
2226

server/src/main/java/org/hl7/davinci/endpoint/rems/database/fhir/RemsFhir.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class RemsFhir {
2222
private String createdAt;
2323

2424
@Type(type = "json")
25-
@Column(columnDefinition = "json", name = "complianceBundle", nullable = false, length = 10000000)
25+
@Column(columnDefinition = "json", name = "resource", nullable = false, length = 10000000)
2626
private JsonNode resource;
2727

2828

server/src/main/java/org/hl7/davinci/endpoint/database/Rems.java renamed to server/src/main/java/org/hl7/davinci/endpoint/rems/database/rems/Rems.java

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
package org.hl7.davinci.endpoint.database;
1+
package org.hl7.davinci.endpoint.rems.database.rems;
2+
import org.hl7.davinci.endpoint.rems.database.requirement.MetRequirement;
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import javax.persistence.*;
6+
27

38
import javax.persistence.Column;
49
import javax.persistence.Entity;
@@ -18,13 +23,17 @@ public class Rems {
1823
@Column(name = "case_number", nullable = false, length = 100)
1924
private String case_number;
2025

21-
@Type(type = "json")
22-
@Column(columnDefinition = "json", name = "complianceBundle", nullable = false, length = 10000000)
23-
private JsonNode complianceBundle;
2426

2527
@Column(name = "status", nullable = false, length = 100)
2628
private String status;
2729

30+
@Type(type = "json")
31+
@Column(columnDefinition = "json", name = "resource", nullable = false, length = 10000000)
32+
private JsonNode resource;
33+
34+
@OneToMany(mappedBy="remsRequest", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
35+
private List<MetRequirement> metRequirements = new ArrayList<>();
36+
2837
public void Rems() {}
2938

3039
public String getCase_number() {
@@ -35,19 +44,31 @@ public void setCase_number(String id) {
3544
this.case_number = id;
3645
}
3746

38-
public JsonNode getComplianceBundle() {
39-
return this.complianceBundle;
40-
}
41-
42-
public void setComplianceBundle(JsonNode jsonParam) {
43-
this.complianceBundle = jsonParam;
44-
}
45-
4647
public String getStatus() {
4748
return this.status;
4849
}
4950

5051
public void setStatus(String statusParam) {
5152
this.status = statusParam;
5253
}
54+
55+
public List<MetRequirement> getMetRequirements() {
56+
return this.metRequirements;
57+
}
58+
59+
public void setMetRequirement(List<MetRequirement> metRequirements) {
60+
this.metRequirements = metRequirements;
61+
}
62+
63+
public void addMetRequirement(MetRequirement metRequirement) {
64+
this.metRequirements.add(metRequirement);
65+
}
66+
67+
public JsonNode getResource() {
68+
return this.resource;
69+
}
70+
71+
public void setResource(JsonNode resource) {
72+
this.resource = resource;
73+
}
5374
}

server/src/main/java/org/hl7/davinci/endpoint/database/RemsRepository.java renamed to server/src/main/java/org/hl7/davinci/endpoint/rems/database/rems/RemsRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.hl7.davinci.endpoint.database;
1+
package org.hl7.davinci.endpoint.rems.database.rems;
22

33
import org.springframework.data.jpa.repository.Query;
44
import org.springframework.data.repository.CrudRepository;

server/src/main/java/org/hl7/davinci/endpoint/database/RemsService.java renamed to server/src/main/java/org/hl7/davinci/endpoint/rems/database/rems/RemsService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.hl7.davinci.endpoint.database;
1+
package org.hl7.davinci.endpoint.rems.database.rems;
22

33
public interface RemsService {
44
Iterable<Rems> findAll();

server/src/main/java/org/hl7/davinci/endpoint/database/RemsServiceImpl.java renamed to server/src/main/java/org/hl7/davinci/endpoint/rems/database/rems/RemsServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.hl7.davinci.endpoint.database;
1+
package org.hl7.davinci.endpoint.rems.database.rems;
22

33
import org.springframework.beans.factory.annotation.Autowired;
44

0 commit comments

Comments
 (0)