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