Skip to content
This repository was archived by the owner on Jul 31, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ public class DataController {
@Autowired
private ClientRepository clientRepository;

@Autowired
private RemsRepository remsRepository;
// @Autowired
// private RemsRepository remsRepository;

@Autowired
private YamlConfig myConfig;
Expand Down Expand Up @@ -165,44 +165,4 @@ public RedirectView reload(@RequestParam String vsac_api_key) {
return new RedirectView(newUrl);
}

public void updateComplianceBundleStatus(String uid) {
try {
TimeUnit.SECONDS.sleep(30);
}
catch(Exception e)
{
System.out.println(e);
}
Rems rems = remsRepository.findById(uid).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, uid + " not found"));
rems.setStatus("Approved");
remsRepository.save(rems);
}

public void updateComplianceBundleStatusInBackground (final String uid) {
Thread t = new Thread(() -> updateComplianceBundleStatus(uid));
t.start();
}

@PostMapping(value = "/api/rems")
@CrossOrigin
public ResponseEntity<Object> postRems(@RequestBody String jsonData) {
JsonNode remsObject = JacksonUtil.toJsonNode(jsonData);
String id = UUID.randomUUID().toString().replace("-", "");

Rems complianceBundle = new Rems();
complianceBundle.setCase_number(id);
complianceBundle.setComplianceBundle(remsObject);
complianceBundle.setStatus("Pending");
remsRepository.save(complianceBundle);
updateComplianceBundleStatusInBackground(id);
return ResponseEntity.ok().body(complianceBundle);

}

@CrossOrigin
@GetMapping("/api/rems/{id}")
public ResponseEntity<Object> getRems(@PathVariable String id) {
Rems rems = remsRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, id + " not found"));
return ResponseEntity.ok().body(rems);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,54 @@ CommandLineRunner initDatabase(DrugsRepository repository, RemsFhirRepository re
return args -> {
log.info("Preloading turalio");
Drug turalio = new Drug();

String questionnaire = readFile("src/main/java/org/hl7/davinci/endpoint/rems/resources/Turalio/fhir/Questionnaire-R4-DrugHasREMS.json", Charset.defaultCharset());
Requirement requirement = new Requirement();
RemsFhir remsFhir = new RemsFhir();
remsFhir.setResourceType(ResourceType.Questionnaire.toString());
JsonNode questionnaireResource = JacksonUtil.toJsonNode(questionnaire);
remsFhir.setResource(questionnaireResource);
remsFhir.setId("q1");
remsFhirRepository.save(remsFhir);
requirement.setRequirement(remsFhir);
requirement.setDescription("complete questionnaire");
turalio.addRequirement(requirement);
turalio.setId("turalio");
repository.save(turalio);
requirement.setDrug(turalio);
requirementRepository.save(requirement);
turalio.setCodeSystem("http://www.nlm.nih.gov/research/umls/rxnorm");
turalio.setCode("2183126");
repository.save(turalio);;


// patient enrollment form requirement
String patientQuestionnaire = readFile("src/main/java/org/hl7/davinci/endpoint/rems/resources/Turalio/fhir/Questionnaire-R4-DrugHasREMS.json", Charset.defaultCharset());
Requirement patientEnrollmentRequirement = new Requirement();
RemsFhir patientEnrollmentResource = new RemsFhir();
patientEnrollmentResource.setResourceType(ResourceType.Questionnaire.toString());
JsonNode patientQuestionnaireResource = JacksonUtil.toJsonNode(patientQuestionnaire);
patientEnrollmentResource.setResource(patientQuestionnaireResource);
patientEnrollmentResource.setId("turalio-patient-enrollment");
remsFhirRepository.save(patientEnrollmentResource);
patientEnrollmentRequirement.setResource(patientEnrollmentResource);
patientEnrollmentRequirement.setDescription("complete patient enrollment questionnaire");
patientEnrollmentRequirement.setDrug(turalio);
requirementRepository.save(patientEnrollmentRequirement);

// prescriber enrollment form requirement
String prescriberQuestionnaire = readFile("src/main/java/org/hl7/davinci/endpoint/rems/resources/Turalio/Questionnaire-R4-Prescriber-Enrollment.json", Charset.defaultCharset());
Requirement prescriberEnrollmentRequirement = new Requirement();
RemsFhir prescriberEnrollmentResource = new RemsFhir();
prescriberEnrollmentResource.setResourceType(ResourceType.Questionnaire.toString());
JsonNode prescriberQuestionnaireResource = JacksonUtil.toJsonNode(prescriberQuestionnaire);
prescriberEnrollmentResource.setResource(prescriberQuestionnaireResource);
prescriberEnrollmentResource.setId("turalio-prescriber-enrollment");
remsFhirRepository.save(prescriberEnrollmentResource);
prescriberEnrollmentRequirement.setResource(prescriberEnrollmentResource);
prescriberEnrollmentRequirement.setDescription("complete prescriber enrollment questionnaire");
prescriberEnrollmentRequirement.setDrug(turalio);
requirementRepository.save(prescriberEnrollmentRequirement);

// prescriber knowledge assessment / certification sub-requirement
String prescriberKnowledgeQuestionnaire = readFile("src/main/java/org/hl7/davinci/endpoint/rems/resources/Turalio/Questionnaire-R4-Prescriber-Knowledge-Assessment.json", Charset.defaultCharset());
Requirement prescriberCertificationRequirement = new Requirement();
RemsFhir prescriberKnowledgeResource = new RemsFhir();
prescriberKnowledgeResource.setResourceType(ResourceType.Questionnaire.toString());
JsonNode prescriberKnowledgeQuestionnaireResource = JacksonUtil.toJsonNode(prescriberKnowledgeQuestionnaire);
prescriberKnowledgeResource.setResource(prescriberKnowledgeQuestionnaireResource);
prescriberKnowledgeResource.setId("turalio-prescriber-knowledge-check");
remsFhirRepository.save(prescriberKnowledgeResource);
prescriberCertificationRequirement.setResource(prescriberKnowledgeResource);
prescriberCertificationRequirement.setDescription("complete prescriber knowledge check");
prescriberCertificationRequirement.setParent(prescriberEnrollmentRequirement);
requirementRepository.save(prescriberCertificationRequirement);

};
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,41 @@
package org.hl7.davinci.endpoint.rems.controller;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.fasterxml.jackson.databind.JsonNode;
import com.vladmihalcea.hibernate.type.json.internal.JacksonUtil;
import org.hl7.davinci.endpoint.rems.database.requirement.MetRequirement;
import org.hl7.davinci.endpoint.rems.database.requirement.MetRequirementRepository;
import org.hl7.davinci.endpoint.rems.database.requirement.Requirement;

import org.hl7.davinci.endpoint.Application;
import org.hl7.davinci.endpoint.rems.database.drugs.Drug;
import org.hl7.davinci.endpoint.rems.database.drugs.DrugsRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.hl7.davinci.endpoint.rems.database.rems.Rems;
import org.hl7.davinci.endpoint.rems.database.rems.RemsRepository;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
import org.springframework.web.servlet.view.RedirectView;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.http.HttpStatus;
import java.util.Arrays;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.logging.Logger;
Expand All @@ -25,7 +50,13 @@ public class RemsController {
@Autowired
private DrugsRepository drugsRepository;

@GetMapping(value = "/rems/{id}")
@Autowired
private RemsRepository remsRepository;

@Autowired
private MetRequirementRepository metRequirementsRepository;

@GetMapping(value = "/drug/{id}")
@CrossOrigin
public ResponseEntity<Drug> getRequirements(HttpServletRequest request, @PathVariable String id) throws IOException {
Drug drug = drugsRepository.findById(id).get();
Expand All @@ -41,4 +72,87 @@ private ResponseEntity<Drug> processRequirements(Drug drug) {
.contentType(MediaType.parseMediaType(MediaType.APPLICATION_JSON_VALUE))
.body(drug);
}

public void updateRemsRequestStatus(String uid) {
try {
TimeUnit.SECONDS.sleep(30);
}
catch(Exception e)
{
System.out.println(e);
}
Rems rems = remsRepository.findById(uid).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, uid + " not found"));
rems.setStatus("Approved");
remsRepository.save(rems);
}

public void updateRemsRequestStatusInBackground (final String uid) {
Thread t = new Thread(() -> updateRemsRequestStatus(uid));
t.start();
}

@PostMapping(value = "/rems")
@CrossOrigin
public ResponseEntity<Object> postRems(@RequestBody String jsonData) {
JsonNode remsObject = JacksonUtil.toJsonNode(jsonData);
String id = UUID.randomUUID().toString().replace("-", "");

JsonNode params = getResource(remsObject, remsObject.get("entry").get(0).get("resource").get("focus").get("parameters").get("reference").textValue());

String prescriptionReference = "";
for (JsonNode param : params.get("parameter")) {
if (param.get("name").textValue().equals("prescription")) {
prescriptionReference = param.get("reference").textValue();
}
}

JsonNode presciption = getResource(remsObject, prescriptionReference);
String prescriptionSystem = presciption.get("medicationCodeableConcept").get("coding").get(0).get("system").textValue();
String prescriptionCode = presciption.get("medicationCodeableConcept").get("coding").get(0).get("code").textValue();
Drug drug = drugsRepository.findDrugByCode(prescriptionSystem, prescriptionCode).get(0);



Rems remsRequest = new Rems();
remsRequest.setCase_number(id);
remsRequest.setStatus("Pending");
remsRequest.setResource(remsObject);
remsRepository.save(remsRequest);

// this loop needs to change to handle multiple levels of sub-requirement conditions
// this loop needs to also handle parsing out resources for each requirement - may need to be separate endpoints
for (Requirement requirement : drug.getRequirements()) {
MetRequirement metReq = new MetRequirement();
metReq.setRequirement(requirement);
metReq.setRemsRequest(remsRequest);
remsRequest.addMetRequirement(metReq);
metRequirementsRepository.save(metReq);
}
remsRepository.save(remsRequest);
updateRemsRequestStatusInBackground(id);
return ResponseEntity.ok().body(remsRequest);

}

@CrossOrigin
@GetMapping("/rems/{id}")
public ResponseEntity<Object> getRems(@PathVariable String id) {
Rems rems = remsRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, id + " not found"));
return ResponseEntity.ok().body(rems);
}

public JsonNode getResource(JsonNode bundle, String resourceReference) {
String[] temp = resourceReference.split("/");
String _resourceType = temp[0];
String _id = temp[1];

for (int i = 0; i < bundle.get("entry").size(); i++) {
if ((bundle.get("entry").get(i).get("resource").get("resourceType").textValue().equals(_resourceType))
&& (bundle.get("entry").get(i).get("resource").get("id").textValue().equals(_id))) {
return bundle.get("entry").get(i).get("resource");
}
}
return null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class Drug {
@Column(name = "createdAt", nullable = false)
private String createdAt;

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

public Drug() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.data.repository.query.Param;


import java.util.List;

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

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

Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public class RemsFhir {
private String createdAt;

@Type(type = "json")
@Column(columnDefinition = "json", name = "complianceBundle", nullable = false, length = 10000000)
@Column(columnDefinition = "json", name = "resource", nullable = false, length = 10000000)
private JsonNode resource;


Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
package org.hl7.davinci.endpoint.database;
package org.hl7.davinci.endpoint.rems.database.rems;
import org.hl7.davinci.endpoint.rems.database.requirement.MetRequirement;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;


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

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

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

@Type(type = "json")
@Column(columnDefinition = "json", name = "resource", nullable = false, length = 10000000)
private JsonNode resource;

@OneToMany(mappedBy="remsRequest", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<MetRequirement> metRequirements = new ArrayList<>();

public void Rems() {}

public String getCase_number() {
Expand All @@ -35,19 +44,31 @@ public void setCase_number(String id) {
this.case_number = id;
}

public JsonNode getComplianceBundle() {
return this.complianceBundle;
}

public void setComplianceBundle(JsonNode jsonParam) {
this.complianceBundle = jsonParam;
}

public String getStatus() {
return this.status;
}

public void setStatus(String statusParam) {
this.status = statusParam;
}

public List<MetRequirement> getMetRequirements() {
return this.metRequirements;
}

public void setMetRequirement(List<MetRequirement> metRequirements) {
this.metRequirements = metRequirements;
}

public void addMetRequirement(MetRequirement metRequirement) {
this.metRequirements.add(metRequirement);
}

public JsonNode getResource() {
return this.resource;
}

public void setResource(JsonNode resource) {
this.resource = resource;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.hl7.davinci.endpoint.database;
package org.hl7.davinci.endpoint.rems.database.rems;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.hl7.davinci.endpoint.database;
package org.hl7.davinci.endpoint.rems.database.rems;

public interface RemsService {
Iterable<Rems> findAll();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.hl7.davinci.endpoint.database;
package org.hl7.davinci.endpoint.rems.database.rems;

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

Expand Down
Loading