public LinkEnquiryRepresentation(string referenceNumber, string authenticationType, LinkReferenceMeta meta) { ReferenceNumber = referenceNumber; AuthenticationType = authenticationType; Meta = meta; }
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); }