Search in sources :

Example 1 with Consent

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;
}
Also used : OrganizationDetails(uk.gov.hscic.model.organization.OrganizationDetails) ForbiddenOperationException(ca.uhn.fhir.rest.server.exceptions.ForbiddenOperationException) ResourceNotFoundException(ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException) UnprocessableEntityException(ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException) PopulateMedicationBundle(uk.gov.hscic.medications.PopulateMedicationBundle) PatientDetails(uk.gov.hscic.model.patient.PatientDetails) ParametersParameterComponent(org.hl7.fhir.dstu3.model.Parameters.ParametersParameterComponent)

Example 2 with Consent

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);
    }
}
Also used : Condition(org.hl7.fhir.r4.model.Condition) HashMap(java.util.HashMap) Reference(org.hl7.fhir.r4.model.Reference) Patient(org.hl7.fhir.r4.model.Patient) Goal(org.hl7.fhir.r4.model.Goal) Consumer(java.util.function.Consumer) Consent(org.hl7.fhir.r4.model.Consent) IIdType(org.hl7.fhir.instance.model.api.IIdType)

Example 3 with Consent

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();
}
Also used : Consent(org.hl7.fhir.r4.model.Consent) Attachment(org.hl7.fhir.r4.model.Attachment) ResourceNotFoundException(ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException)

Example 4 with Consent

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;
}
Also used : ConsentCreateException(org.hl7.gravity.refimpl.sdohexchange.exception.ConsentCreateException) Bundle(org.hl7.fhir.r4.model.Bundle) Reference(org.hl7.fhir.r4.model.Reference) ConsentPrepareBundleFactory(org.hl7.gravity.refimpl.sdohexchange.fhir.factory.ConsentPrepareBundleFactory) PractitionerRole(org.hl7.fhir.r4.model.PractitionerRole)

Example 5 with Consent

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());
}
Also used : BaseConsentDto(org.hl7.gravity.refimpl.sdohexchange.dto.response.BaseConsentDto) RequiredArgsConstructor(lombok.RequiredArgsConstructor) Consent(org.hl7.fhir.r4.model.Consent) Autowired(org.springframework.beans.factory.annotation.Autowired) MethodOutcome(ca.uhn.fhir.rest.api.MethodOutcome) AttachmentDto(org.hl7.gravity.refimpl.sdohexchange.dto.response.AttachmentDto) Reference(org.hl7.fhir.r4.model.Reference) Attachment(org.hl7.fhir.r4.model.Attachment) Service(org.springframework.stereotype.Service) IGenericClient(ca.uhn.fhir.rest.client.api.IGenericClient) ResourceNotFoundException(ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException) Patient(org.hl7.fhir.r4.model.Patient) UserDto(org.hl7.gravity.refimpl.sdohexchange.dto.response.UserDto) ConsentToDtoConverter(org.hl7.gravity.refimpl.sdohexchange.dto.converter.ConsentToDtoConverter) ConsentRepository(org.hl7.gravity.refimpl.sdohexchange.dao.impl.ConsentRepository) ConsentDto(org.hl7.gravity.refimpl.sdohexchange.dto.response.ConsentDto) Collectors(java.util.stream.Collectors) PractitionerRole(org.hl7.fhir.r4.model.PractitionerRole) ConsentCreateException(org.hl7.gravity.refimpl.sdohexchange.exception.ConsentCreateException) Slf4j(lombok.extern.slf4j.Slf4j) List(java.util.List) ConsentPrepareBundleFactory(org.hl7.gravity.refimpl.sdohexchange.fhir.factory.ConsentPrepareBundleFactory) CreateConsentFactory(org.hl7.gravity.refimpl.sdohexchange.fhir.factory.resource.CreateConsentFactory) SmartOnFhirContext(com.healthlx.smartonfhir.core.SmartOnFhirContext) MultipartFile(org.springframework.web.multipart.MultipartFile) Optional(java.util.Optional) Bundle(org.hl7.fhir.r4.model.Bundle) FhirUtil(org.hl7.gravity.refimpl.sdohexchange.util.FhirUtil) Consent(org.hl7.fhir.r4.model.Consent) Bundle(org.hl7.fhir.r4.model.Bundle) BaseConsentDto(org.hl7.gravity.refimpl.sdohexchange.dto.response.BaseConsentDto)

Aggregations

Consent (org.hl7.fhir.r4.model.Consent)15 Complex (org.hl7.fhir.dstu3.utils.formats.Turtle.Complex)8 Complex (org.hl7.fhir.r4.utils.formats.Turtle.Complex)7 MethodOutcome (ca.uhn.fhir.rest.api.MethodOutcome)6 Bundle (org.hl7.fhir.r4.model.Bundle)5 Reference (org.hl7.fhir.r4.model.Reference)5 ResourceNotFoundException (ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException)4 IIdType (org.hl7.fhir.instance.model.api.IIdType)4 ConsentCreateException (org.hl7.gravity.refimpl.sdohexchange.exception.ConsentCreateException)4 Test (org.junit.jupiter.api.Test)4 List (java.util.List)3 Consent (org.hl7.fhir.dstu3.model.Consent)3 CodeableConcept (org.hl7.fhir.r4.model.CodeableConcept)3 IGenericClient (ca.uhn.fhir.rest.client.api.IGenericClient)2 SmartOnFhirContext (com.healthlx.smartonfhir.core.SmartOnFhirContext)2 HashMap (java.util.HashMap)2 Optional (java.util.Optional)2 Collectors (java.util.stream.Collectors)2 RequiredArgsConstructor (lombok.RequiredArgsConstructor)2 Slf4j (lombok.extern.slf4j.Slf4j)2