Search in sources :

Example 11 with PatientMigrationRequest

use of uk.nhs.adaptors.connector.model.PatientMigrationRequest in project nia-patient-switching-standard-adaptor by NHSDigital.

the class PatientTransferService method handlePatientMigrationRequest.

public MigrationStatusLog handlePatientMigrationRequest(Parameters parameters, Map<String, String> headers) {
    var conversationId = mdcService.getConversationId();
    PatientMigrationRequest patientMigrationRequest = patientMigrationRequestDao.getMigrationRequest(conversationId);
    if (patientMigrationRequest == null) {
        var patientNhsNumber = getNhsNumberFromParameters(parameters).get().getValue();
        patientMigrationRequestDao.addNewRequest(patientNhsNumber, conversationId, headers.get(TO_ODS), headers.get(FROM_ODS));
        int addedId = patientMigrationRequestDao.getMigrationRequestId(conversationId);
        migrationStatusLogDao.addMigrationStatusLog(REQUEST_RECEIVED, dateUtils.getCurrentOffsetDateTime(), addedId);
        var pssMessage = createTransferRequestMessage(patientNhsNumber, headers, conversationId);
        pssQueuePublisher.sendToPssQueue(pssMessage);
    } else {
        return migrationStatusLogDao.getLatestMigrationStatusLog(patientMigrationRequest.getId());
    }
    return null;
}
Also used : PatientMigrationRequest(uk.nhs.adaptors.connector.model.PatientMigrationRequest)

Example 12 with PatientMigrationRequest

use of uk.nhs.adaptors.connector.model.PatientMigrationRequest in project nia-patient-switching-standard-adaptor by NHSDigital.

the class InboundMessageMergingService method mergeAndBundleMessage.

public void mergeAndBundleMessage(String conversationId) throws JAXBException, JsonProcessingException {
    if (!StringUtils.hasText(conversationId)) {
        throw new ValidationException(CONVERSATION_ID_HAS_NOT_BEEN_GIVEN);
    }
    PatientMigrationRequest migrationRequest = migrationRequestDao.getMigrationRequest(conversationId);
    var inboundMessage = objectMapper.readValue(migrationRequest.getInboundMessage(), InboundMessage.class);
    RCMRIN030000UK06Message payload = unmarshallString(inboundMessage.getPayload(), RCMRIN030000UK06Message.class);
    try {
        var attachmentLogs = getUndeletedLogsForConversation(conversationId);
        var attachmentsContainSkeletonMessage = attachmentLogs.stream().anyMatch(log -> log.getSkeleton().equals(true));
        if (attachmentsContainSkeletonMessage) {
            findAndReplaceSkeleton(attachmentLogs, inboundMessage, conversationId);
        }
        // process attachments
        var bypassPayloadLoadingArray = new String[attachmentLogs.size()];
        Arrays.fill(bypassPayloadLoadingArray, "");
        var messageAttachments = attachmentHandlerService.buildInboundAttachmentsFromAttachmentLogs(attachmentLogs, Arrays.asList(bypassPayloadLoadingArray), conversationId);
        var newPayloadStr = attachmentReferenceUpdaterService.updateReferenceToAttachment(messageAttachments, conversationId, inboundMessage.getPayload());
        // process bundle
        inboundMessage.setPayload(newPayloadStr);
        payload = unmarshallString(inboundMessage.getPayload(), RCMRIN030000UK06Message.class);
        var bundle = bundleMapperService.mapToBundle(payload, migrationRequest.getLosingPracticeOdsCode());
        migrationStatusLogService.updatePatientMigrationRequestAndAddMigrationStatusLog(conversationId, fhirParser.encodeToJson(bundle), objectMapper.writeValueAsString(inboundMessage), EHR_EXTRACT_TRANSLATED);
    } catch (InlineAttachmentProcessingException | SAXException | TransformerException | BundleMappingException | JAXBException | AttachmentNotFoundException | JsonProcessingException e) {
        LOGGER.error("failed to merge Large Message Parts", e);
        nackAckPreparationService.sendNackMessage(EHR_EXTRACT_CANNOT_BE_PROCESSED, payload, conversationId);
    }
}
Also used : AttachmentNotFoundException(uk.nhs.adaptors.pss.translator.exception.AttachmentNotFoundException) ValidationException(javax.xml.bind.ValidationException) JAXBException(javax.xml.bind.JAXBException) XmlUnmarshallUtil.unmarshallString(uk.nhs.adaptors.pss.translator.util.XmlUnmarshallUtil.unmarshallString) SAXException(org.xml.sax.SAXException) PatientMigrationRequest(uk.nhs.adaptors.connector.model.PatientMigrationRequest) BundleMappingException(uk.nhs.adaptors.pss.translator.exception.BundleMappingException) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) TransformerException(javax.xml.transform.TransformerException) RCMRIN030000UK06Message(org.hl7.v3.RCMRIN030000UK06Message) InlineAttachmentProcessingException(uk.nhs.adaptors.pss.translator.exception.InlineAttachmentProcessingException)

Example 13 with PatientMigrationRequest

use of uk.nhs.adaptors.connector.model.PatientMigrationRequest in project nia-patient-switching-standard-adaptor by NHSDigital.

the class COPCMessageHandler method extractFragmentsAndLog.

private void extractFragmentsAndLog(PatientMigrationRequest migrationRequest, PatientAttachmentLog parentAttachmentLog, String conversationId, InboundMessage message) throws ParseException, SAXException, ValidationException, InlineAttachmentProcessingException {
    List<EbxmlReference> attachmentReferenceDescription = new ArrayList<>();
    attachmentReferenceDescription.addAll(xmlParseUtilService.getEbxmlAttachmentsData(message));
    // first item is always the message payload reference so skip it
    for (var index = 1; index < attachmentReferenceDescription.size(); index++) {
        var payloadReference = attachmentReferenceDescription.get(index);
        var descriptionString = "";
        var messageId = "";
        var fileUpload = false;
        // in this instance there should only ever be one CID on a fragment index file
        if (payloadReference.getHref().contains("cid:")) {
            messageId = payloadReference.getHref().substring(payloadReference.getHref().indexOf("cid:") + "cid:".length());
            descriptionString = message.getAttachments().get(0).getDescription();
            // upload the file
            attachmentHandlerService.storeAttachments(message.getAttachments(), conversationId);
            fileUpload = true;
        } else {
            var localMessageId = payloadReference.getHref().substring(payloadReference.getHref().indexOf("mid:") + "mid:".length());
            messageId = localMessageId;
            var externalAttachmentResult = message.getExternalAttachments().stream().filter(attachment -> attachment.getMessageId().equals(localMessageId)).findFirst();
            if (externalAttachmentResult == null || externalAttachmentResult.stream().count() != 1) {
                throw new ValidationException("External Attachment in payload header does not match a received External Attachment ID");
            }
            var externalAttachment = externalAttachmentResult.get();
            descriptionString = externalAttachment.getDescription();
        }
        PatientAttachmentLog fragmentLog = patientAttachmentLogService.findAttachmentLog(messageId, conversationId);
        if (fragmentLog != null) {
            updateFragmentLog(fragmentLog, parentAttachmentLog, descriptionString, index - 1, parentAttachmentLog.getLargeAttachment());
            patientAttachmentLogService.updateAttachmentLog(fragmentLog, conversationId);
        } else {
            PatientAttachmentLog newFragmentLog = buildPatientAttachmentLog(messageId, descriptionString, parentAttachmentLog.getMid(), migrationRequest.getId(), index - 1, fileUpload, parentAttachmentLog.getLargeAttachment());
            patientAttachmentLogService.addAttachmentLog(newFragmentLog);
        }
    }
}
Also used : Arrays(java.util.Arrays) AttachmentNotFoundException(uk.nhs.adaptors.pss.translator.exception.AttachmentNotFoundException) RequiredArgsConstructor(lombok.RequiredArgsConstructor) Autowired(org.springframework.beans.factory.annotation.Autowired) NackAckPreparationService(uk.nhs.adaptors.pss.translator.service.NackAckPreparationService) XmlUnmarshallUtil.unmarshallString(uk.nhs.adaptors.pss.translator.util.XmlUnmarshallUtil.unmarshallString) PatientAttachmentLog(uk.nhs.adaptors.connector.model.PatientAttachmentLog) COPCIN000001UK01Message(org.hl7.v3.COPCIN000001UK01Message) ArrayList(java.util.ArrayList) BundleMappingException(uk.nhs.adaptors.pss.translator.exception.BundleMappingException) Document(org.w3c.dom.Document) ParseException(java.text.ParseException) PatientMigrationRequest(uk.nhs.adaptors.connector.model.PatientMigrationRequest) InboundMessageMergingService(uk.nhs.adaptors.pss.translator.service.InboundMessageMergingService) PatientAttachmentLogService(uk.nhs.adaptors.connector.service.PatientAttachmentLogService) EbxmlReference(uk.nhs.adaptors.pss.translator.model.EbxmlReference) AttachmentHandlerService(uk.nhs.adaptors.pss.translator.service.AttachmentHandlerService) XPathService(uk.nhs.adaptors.pss.translator.service.XPathService) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) AttachmentLogException(uk.nhs.adaptors.pss.translator.exception.AttachmentLogException) InboundMessage(uk.nhs.adaptors.pss.translator.mhs.model.InboundMessage) JAXBException(javax.xml.bind.JAXBException) List(java.util.List) Component(org.springframework.stereotype.Component) Slf4j(lombok.extern.slf4j.Slf4j) SAXException(org.xml.sax.SAXException) InlineAttachmentProcessingException(uk.nhs.adaptors.pss.translator.exception.InlineAttachmentProcessingException) EHR_EXTRACT_CANNOT_BE_PROCESSED(uk.nhs.adaptors.pss.translator.model.NACKReason.EHR_EXTRACT_CANNOT_BE_PROCESSED) ValidationException(javax.xml.bind.ValidationException) PatientMigrationRequestDao(uk.nhs.adaptors.connector.dao.PatientMigrationRequestDao) Comparator(java.util.Comparator) XmlParseUtilService(uk.nhs.adaptors.pss.translator.util.XmlParseUtilService) ValidationException(javax.xml.bind.ValidationException) PatientAttachmentLog(uk.nhs.adaptors.connector.model.PatientAttachmentLog) ArrayList(java.util.ArrayList) EbxmlReference(uk.nhs.adaptors.pss.translator.model.EbxmlReference)

Aggregations

PatientMigrationRequest (uk.nhs.adaptors.connector.model.PatientMigrationRequest)13 Test (org.junit.jupiter.api.Test)5 InlineAttachmentProcessingException (uk.nhs.adaptors.pss.translator.exception.InlineAttachmentProcessingException)5 InboundMessage (uk.nhs.adaptors.pss.translator.mhs.model.InboundMessage)5 RCMRIN030000UK06Message (org.hl7.v3.RCMRIN030000UK06Message)4 SAXException (org.xml.sax.SAXException)4 BundleMappingException (uk.nhs.adaptors.pss.translator.exception.BundleMappingException)4 XmlUnmarshallUtil.unmarshallString (uk.nhs.adaptors.pss.translator.util.XmlUnmarshallUtil.unmarshallString)4 JsonProcessingException (com.fasterxml.jackson.core.JsonProcessingException)3 ParseException (java.text.ParseException)3 ValidationException (javax.xml.bind.ValidationException)3 Document (org.w3c.dom.Document)3 MigrationStatusLog (uk.nhs.adaptors.connector.model.MigrationStatusLog)3 PatientAttachmentLog (uk.nhs.adaptors.connector.model.PatientAttachmentLog)3 AttachmentNotFoundException (uk.nhs.adaptors.pss.translator.exception.AttachmentNotFoundException)3 DataFormatException (ca.uhn.fhir.parser.DataFormatException)2 JAXBException (javax.xml.bind.JAXBException)2 Bundle (org.hl7.fhir.dstu3.model.Bundle)2 COPCIN000001UK01Message (org.hl7.v3.COPCIN000001UK01Message)2 ArrayList (java.util.ArrayList)1