public static async Task RunOrchestrator()

in Source/Function/EnrollmentVerificator.cs [22:77]


        public static async Task RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext ctx)
        {
            var data = ctx.GetInput<EnrollmentHttpRequest>();
            var notificationRequest = new RequestNotification(ctx.InstanceId, data.MobileNumber, data.Email, data.FirstName, data.LastName);
            var customerInfoRequest = new CustomerInfoRequest(data.MobileNumber, ctx.InstanceId, data.Id);

            await ctx.CallActivityAsync(Activities.StoreCustomerInformation, customerInfoRequest);

            if (data.Channel  == ChannelType.Email)
            {
                await ctx.CallActivityAsync(Activities.Email.EnrollmentRequestNotification, notificationRequest);
            }
            else
            {
                await ctx.CallActivityAsync(Activities.Sms.EnrollmentRequestNotification, notificationRequest);
            }

            using (var timeoutCts = new CancellationTokenSource())
            {
                Task<EnrollmentStatusEnum> approvalEvent = ctx.WaitForExternalEvent<EnrollmentStatusEnum>(Events.ApprovalEvent);

                DateTime reminderDueTime = ctx.CurrentUtcDateTime.AddHours(7);
                Task reminderTimeout = ctx.CreateTimer(reminderDueTime, timeoutCts.Token);

                if (approvalEvent == await Task.WhenAny(approvalEvent, reminderTimeout))
                {                   
                    var dataStatus = new UpdateStatus(data.Id, data.MobileNumber, approvalEvent.Result, data.Email);
                    
                    await ctx.CallActivityAsync(Activities.UpdateEnrollmentStatus, dataStatus);
                    if (data.Channel == ChannelType.Email)
                    {
                        await ctx.CallActivityAsync(Activities.Email.SendEnrollmentFinishedNotification, dataStatus);
                    }
                    else
                    {
                        await ctx.CallActivityAsync(Activities.Sms.SendEnrollmentFinishedNotification, dataStatus);
                    }

                    timeoutCts.Cancel();
                }
                else
                {
                    if (data.Channel == ChannelType.Email)
                    {
                        await ctx.CallActivityAsync(Activities.Sms.SendReminderEnrollmentNotification, data.MobileNumber);
                    }
                    else
                    {
                        await ctx.CallActivityAsync(Activities.Email.SendReminderEnrollmentNotification, data.Email);
                    }
                }

                await ctx.CallActivityAsync(Activities.CleanCustomerInfoTable, data.MobileNumber);
            }
        }