use of org.hl7.fhir.dstu3.model.Consent in project gpconnect-demonstrator by nhsconnect.
the class PatientResourceProvider method StructuredRecordOperation.
@Operation(name = GET_STRUCTURED_RECORD_OPERATION_NAME)
public Bundle StructuredRecordOperation(@ResourceParam Parameters params) throws FHIRException {
Bundle structuredBundle = new Bundle();
Boolean getAllergies = false;
Boolean includeResolved = false;
Boolean getMedications = false;
Boolean includePrescriptionIssues = false;
Period medicationPeriod = null;
String NHS = getNhsNumber(params);
PatientDetails patientDetails = patientSearch.findPatient(NHS);
// see https://nhsconnect.github.io/gpconnect/accessrecord_structured_development_retrieve_patient_record.html#error-handling
if (patientDetails == null || patientDetails.isSensitive() || patientDetails.isDeceased() || !patientDetails.isActive()) {
throw OperationOutcomeFactory.buildOperationOutcomeException(new ResourceNotFoundException("No patient details found for patient ID: " + NHS), SystemCode.PATIENT_NOT_FOUND, IssueType.NOTFOUND);
}
if (NHS.equals(patientNoconsent)) {
throw OperationOutcomeFactory.buildOperationOutcomeException(new ForbiddenOperationException("No patient consent to share for patient ID: " + NHS), SystemCode.NO_PATIENT_CONSENT, IssueType.FORBIDDEN);
}
operationOutcome = null;
for (ParametersParameterComponent param : params.getParameter()) {
if (validateParametersName(param.getName())) {
if (param.getName().equals(SystemConstants.INCLUDE_ALLERGIES)) {
getAllergies = true;
if (param.getPart().isEmpty()) {
// addWarningIssue(param, IssueType.REQUIRED, "Miss parameter part : " + SystemConstants.INCLUDE_RESOLVED_ALLERGIES);
throw OperationOutcomeFactory.buildOperationOutcomeException(new UnprocessableEntityException("Miss parameter : " + SystemConstants.INCLUDE_RESOLVED_ALLERGIES), SystemCode.INVALID_PARAMETER, IssueType.REQUIRED);
}
boolean includeResolvedParameterPartPresent = false;
for (ParametersParameterComponent paramPart : param.getPart()) {
if (paramPart.getName().equals(SystemConstants.INCLUDE_RESOLVED_ALLERGIES)) {
if (paramPart.getValue() instanceof BooleanType) {
includeResolved = Boolean.valueOf(paramPart.getValue().primitiveValue());
includeResolvedParameterPartPresent = true;
} else {
throw OperationOutcomeFactory.buildOperationOutcomeException(new UnprocessableEntityException("Miss parameter : " + SystemConstants.INCLUDE_RESOLVED_ALLERGIES), SystemCode.INVALID_PARAMETER, IssueType.REQUIRED);
}
} else {
addWarningIssue(param, paramPart, IssueType.NOTSUPPORTED);
// throw OperationOutcomeFactory.buildOperationOutcomeException(
// new UnprocessableEntityException("Incorrect parameter passed : " + paramPart.getName()),
// SystemCode.INVALID_PARAMETER, IssueType.INVALID);
}
}
if (!includeResolvedParameterPartPresent) {
throw OperationOutcomeFactory.buildOperationOutcomeException(new UnprocessableEntityException("Miss parameter : " + SystemConstants.INCLUDE_RESOLVED_ALLERGIES), SystemCode.INVALID_PARAMETER, IssueType.REQUIRED);
}
}
if (param.getName().equals(SystemConstants.INCLUDE_MEDICATION)) {
getMedications = true;
boolean isIncludedPrescriptionIssuesExist = false;
for (ParametersParameterComponent paramPart : param.getPart()) {
if (paramPart.getName().equals(SystemConstants.INCLUDE_PRESCRIPTION_ISSUES)) {
if (paramPart.getValue() instanceof BooleanType) {
includePrescriptionIssues = Boolean.valueOf(paramPart.getValue().primitiveValue());
isIncludedPrescriptionIssuesExist = true;
}
} else if (paramPart.getName().equals(SystemConstants.MEDICATION_SEARCH_FROM_DATE) && paramPart.getValue() instanceof DateType) {
DateType startDateDt = (DateType) paramPart.getValue();
medicationPeriod = new Period();
medicationPeriod.setStart(startDateDt.getValue());
medicationPeriod.setEnd(null);
String startDate = startDateDt.asStringValue();
if (!validateStartDateParamAndEndDateParam(startDate, null)) {
// addWarningIssue(param, paramPart, IssueType.INVALID, "Invalid date used");
}
} else {
addWarningIssue(param, paramPart, IssueType.NOTSUPPORTED);
// throw OperationOutcomeFactory.buildOperationOutcomeException(
// new UnprocessableEntityException("Incorrect parameter passed : " + paramPart.getName()),
// SystemCode.INVALID_PARAMETER, IssueType.INVALID);
}
}
if (!isIncludedPrescriptionIssuesExist) {
// # 1.2.6 now defaults to true if not provided
includePrescriptionIssues = true;
}
}
} else {
// invalid parameter
addWarningIssue(param, IssueType.NOTSUPPORTED);
}
}
// for parameter
// Add Patient
Patient patient = patientDetailsToPatientResourceConverter(patientDetails);
if (patient.getIdentifierFirstRep().getValue().equals(NHS)) {
structuredBundle.addEntry().setResource(patient);
}
// Organization from patient
Set<String> orgIds = new HashSet<>();
orgIds.add(patientDetails.getManagingOrganization());
// Practitioner from patient
Set<String> practitionerIds = new HashSet<>();
List<Reference> practitionerReferenceList = patient.getGeneralPractitioner();
practitionerReferenceList.forEach(practitionerReference -> {
String[] pracRef = practitionerReference.getReference().split("/");
if (pracRef.length > 1) {
practitionerIds.add(pracRef[1]);
}
});
if (getAllergies) {
structuredBundle = structuredAllergyIntoleranceBuilder.buildStructuredAllergyIntolerence(NHS, practitionerIds, structuredBundle, includeResolved);
}
if (getMedications) {
structuredBundle = populateMedicationBundle.addMedicationBundleEntries(structuredBundle, patientDetails, includePrescriptionIssues, medicationPeriod, practitionerIds, orgIds);
}
// Add all practitioners and practitioner roles
for (String practitionerId : practitionerIds) {
Practitioner pracResource = practitionerResourceProvider.getPractitionerById(new IdType(practitionerId));
structuredBundle.addEntry().setResource(pracResource);
List<PractitionerRole> practitionerRoleList = practitionerRoleResourceProvider.getPractitionerRoleByPracticionerId(new IdType(practitionerId));
for (PractitionerRole role : practitionerRoleList) {
String[] split = role.getOrganization().getReference().split("/");
orgIds.add(split[1]);
structuredBundle.addEntry().setResource(role);
}
}
// Add all organizations
for (String orgId : orgIds) {
OrganizationDetails organizationDetails = organizationSearch.findOrganizationDetails(new Long(orgId));
Organization organization = organizationResourceProvider.convertOrganizationDetailsToOrganization(organizationDetails);
structuredBundle.addEntry().setResource(organization);
}
structuredBundle.setType(BundleType.COLLECTION);
structuredBundle.getMeta().addProfile(SystemURL.SD_GPC_STRUCTURED_BUNDLE);
if (operationOutcome != null) {
structuredBundle.addEntry().setResource(operationOutcome);
} else {
removeDuplicateResources(structuredBundle);
}
return structuredBundle;
}
use of org.hl7.fhir.dstu3.model.Consent in project Gravity-SDOH-Exchange-RI by FHIR.
the class TaskReferenceResourcesLoader method processServiceRequestReferences.
private void processServiceRequestReferences(IGenericClient ehrClient, TaskReferencesHolder taskReferencesHolder, String identifierSystem, Bundle bundle) {
ServiceRequestReferenceResolver referenceResolver = new ServiceRequestReferenceResolver(taskReferencesHolder.getServiceRequest(), identifierSystem);
// Load local references in one transaction
referenceResolver.setLocalResources(resourceLoader.getResourcesBySystem(openCpClient, identifierSystem, referenceResolver.getLocalReferences()));
// Load EHR references in one transaction
referenceResolver.setExternalResources(resourceLoader.getResources(ehrClient, referenceResolver.getExternalReferences()));
Map<String, Consumer<IIdType>> referenceConsumers = new HashMap<>();
referenceConsumers.put(Patient.class.getSimpleName(), new PatientReferenceConsumer(taskReferencesHolder.getPatient().getIdElement().getIdPart()));
for (Reference serviceRequestRef : referenceResolver.getConsentsRef()) {
IIdType serviceRequestEl = serviceRequestRef.getReferenceElement();
Consent consent = referenceResolver.getConsent(serviceRequestEl);
// Update links only for new conditions
if (referenceResolver.createConsent(serviceRequestEl)) {
updateResourceRefs(consent, ehrClient.getServerBase(), referenceConsumers);
// Create CP Condition resource
bundle.addEntry(FhirUtil.createPostEntry(consent));
}
// Link CP ServiceRequest reference with Consent
serviceRequestEl.setParts(null, serviceRequestEl.getResourceType(), consent.getIdElement().getIdPart(), null);
serviceRequestRef.setReferenceElement(serviceRequestEl);
}
Map<String, Condition> processedConditions = new HashMap<>();
for (Reference serviceRequestRef : referenceResolver.getConditionsRefs()) {
IIdType serviceRequestEl = serviceRequestRef.getReferenceElement();
Condition condition = referenceResolver.getCondition(serviceRequestEl);
// Update links only for new conditions
if (referenceResolver.createCondition(serviceRequestEl)) {
updateResourceRefs(condition, ehrClient.getServerBase(), referenceConsumers);
// Create CP Condition resource
bundle.addEntry(FhirUtil.createPostEntry(condition));
}
// Link CP ServiceRequest reference with Condition
serviceRequestEl.setParts(null, serviceRequestEl.getResourceType(), condition.getIdElement().getIdPart(), null);
serviceRequestRef.setReferenceElement(serviceRequestEl);
processedConditions.put(condition.getIdentifierFirstRep().getValue(), condition);
}
referenceConsumers.put(Condition.class.getSimpleName(), new ConditionReferenceConsumer(ehrClient.getServerBase(), processedConditions));
for (Reference serviceRequestRef : referenceResolver.getGoalsRefs()) {
IIdType serviceRequestEl = serviceRequestRef.getReferenceElement();
Goal goal = referenceResolver.getGoal(serviceRequestEl);
// Update links only for new goals
if (referenceResolver.createGoal(serviceRequestEl)) {
updateResourceRefs(goal, ehrClient.getServerBase(), referenceConsumers);
// Create CP Goal resource
bundle.addEntry(FhirUtil.createPostEntry(goal));
}
// Link CP ServiceRequest reference with Gaol
serviceRequestEl.setParts(null, serviceRequestEl.getResourceType(), goal.getIdElement().getIdPart(), null);
serviceRequestRef.setReferenceElement(serviceRequestEl);
}
}
use of org.hl7.fhir.dstu3.model.Consent in project Gravity-SDOH-Exchange-RI by FHIR.
the class ConsentService method retrieveAttachmentInfo.
public AttachmentDto retrieveAttachmentInfo(String id) {
Optional<Consent> foundConsent = consentRepository.find(id);
if (!foundConsent.isPresent()) {
throw new ResourceNotFoundException(String.format("Consent with id '%s' was not found.", id));
}
Consent consent = foundConsent.get();
Attachment attachment = consent.getSourceAttachment();
return AttachmentDto.builder().content(attachment.getData()).contentType(attachment.getContentType()).title(attachment.getTitle()).build();
}
use of org.hl7.fhir.dstu3.model.Consent in project Gravity-SDOH-Exchange-RI by FHIR.
the class ConsentService method retrieveOrganization.
private Reference retrieveOrganization(UserDto userDto) {
Bundle bundle = new ConsentPrepareBundleFactory(userDto.getId()).createPrepareBundle();
Bundle consentResponseBundle = ehrClient.transaction().withBundle(bundle).execute();
Bundle consentBundle = FhirUtil.getFirstFromBundle(consentResponseBundle, Bundle.class);
PractitionerRole practitionerRole = FhirUtil.getFirstFromBundle(consentBundle, PractitionerRole.class);
Reference organization = practitionerRole.getOrganization();
if (organization == null) {
throw new ConsentCreateException("No Organization found for Consent creation.");
}
return organization;
}
use of org.hl7.fhir.dstu3.model.Consent in project Gravity-SDOH-Exchange-RI by FHIR.
the class ConsentService method listBaseConsentsInfo.
public List<BaseConsentDto> listBaseConsentsInfo() {
Bundle bundle = consentRepository.findAllByPatient(SmartOnFhirContext.get().getPatient());
List<Consent> consentResources = FhirUtil.getFromBundle(bundle, Consent.class);
return consentResources.stream().map(consent -> new BaseConsentDto(consent.getIdElement().getIdPart(), consent.getSourceAttachment().getTitle())).collect(Collectors.toList());
}
Aggregations