public async Task LinkPatient(LinkReferenceRequest request) { var cmUserId = request.Patient.Id; var cmSuffix = cmUserId.Substring( cmUserId.LastIndexOf("@", StringComparison.Ordinal) + 1); var patient = new LinkEnquiry( cmSuffix, cmUserId, request.Patient.ReferenceNumber, request.Patient.CareContexts); try { var doesRequestExists = await discoveryRequestRepository.RequestExistsFor( request.TransactionId, request.Patient?.Id, request.Patient?.ReferenceNumber); ErrorRepresentation errorRepresentation = null; if (!doesRequestExists) { errorRepresentation = new ErrorRepresentation( new Error(ErrorCode.DiscoveryRequestNotFound, ErrorMessage.DiscoveryRequestNotFound)); } var patientReferenceRequest = new PatientLinkEnquiry(request.TransactionId, request.RequestId, patient); var patientLinkEnquiryRepresentation = new PatientLinkEnquiryRepresentation(); var(linkReferenceResponse, error) = errorRepresentation != null ? (patientLinkEnquiryRepresentation, errorRepresentation) : await linkPatient.LinkPatients(patientReferenceRequest); var linkedPatientRepresentation = new LinkEnquiryRepresentation(); if (linkReferenceResponse != null) { linkedPatientRepresentation = linkReferenceResponse.Link; } var response = new GatewayLinkResponse( linkedPatientRepresentation, error?.Error, new Resp(request.RequestId), request.TransactionId, DateTime.Now.ToUniversalTime(), Guid.NewGuid()); await gatewayClient.SendDataToGateway(PATH_ON_LINK_INIT, response, cmSuffix); } catch (Exception exception) { Log.Error(exception, exception.StackTrace); } }
public virtual async Task <ValueTuple <PatientLinkEnquiryRepresentation, ErrorRepresentation> > LinkPatients( PatientLinkEnquiry request) { var(patient, error) = await PatientAndCareContextValidation(request); if (error != null) { Log.Error(error.Error.Message); return(null, error); } var linkRefNumber = referenceNumberGenerator.NewGuid(); using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { if (!await SaveInitiatedLinkRequest(request.RequestId, request.TransactionId, linkRefNumber) .ConfigureAwait(false)) { return(null, new ErrorRepresentation(new Error(ErrorCode.DuplicateRequestId, ErrorMessage.DuplicateRequestId)) ); } var careContextReferenceNumbers = request.Patient.CareContexts .Select(context => context.ReferenceNumber) .ToArray(); var(_, exception) = await linkPatientRepository.SaveRequestWith( linkRefNumber, request.Patient.ConsentManagerId, request.Patient.ConsentManagerUserId, request.Patient.ReferenceNumber, careContextReferenceNumbers) .ConfigureAwait(false); if (exception != null) { return(null, new ErrorRepresentation(new Error(ErrorCode.ServerInternalError, ErrorMessage.DatabaseStorageError))); } var session = new Session( linkRefNumber, new Communication(CommunicationMode.MOBILE, patient.PhoneNumber), new OtpGenerationDetail(otpService.Value.SenderSystemName, OtpAction.LINK_PATIENT_CARECONTEXT.ToString())); var otpGeneration = await patientVerification.SendTokenFor(session); if (otpGeneration != null) { return(null, new ErrorRepresentation(new Error(ErrorCode.OtpGenerationFailed, otpGeneration.Message))); } await discoveryRequestRepository.Delete(request.TransactionId, request.Patient.ConsentManagerUserId) .ConfigureAwait(false); scope.Complete(); } var time = new TimeSpan(0, 0, otpService.Value.OffsetInMinutes, 0); var expiry = DateTime.Now.Add(time).ToUniversalTime().ToString(Constants.DateTimeFormat); var meta = new LinkReferenceMeta(nameof(CommunicationMode.MOBILE), patient.PhoneNumber, expiry); var patientLinkReferenceResponse = new PatientLinkEnquiryRepresentation( new LinkEnquiryRepresentation(linkRefNumber, "MEDIATED", meta)); return(patientLinkReferenceResponse, null); }