public static async Task <string> RunOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context)
        {
            //Gets the orchestration input
            var submission = context.GetInput <Submission>();

            submission.InstanceId = context.InstanceId;

            //For each content url, starts a new activity to download their contents
            var downloadActivityTasks = new List <Task <SubmittedContent> >();

            foreach (var submittedContent in submission.Contents)
            {
                downloadActivityTasks.Add(
                    context.CallActivityAsync <SubmittedContent>(
                        "SubmissionApprovalProcess_DownloadFileActivity", submittedContent));
            }

            //When all download activities completes, recover their contents
            await Task.WhenAll(downloadActivityTasks);

            foreach (var task in downloadActivityTasks)
            {
                SubmittedContent downloadSubmittedContent = task.Result;
                submission.Contents.First(c => c.Url == downloadSubmittedContent.Url).Content =
                    downloadSubmittedContent.Content;
            }

            //Notifies the approver by mail to approve or decline the submission
            await context.CallActivityAsync(
                "SubmissionApprovalProcess_SubmitForApproval", submission);

            //Waits for the approval or declining by the approver, or, if no action is taken in two minutes
            //finish the process setting the submission status as ignored
            using (var timeoutCts = new CancellationTokenSource())
            {
                DateTime    dueTime        = context.CurrentUtcDateTime.AddMinutes(5);
                Task        durableTimeout = context.CreateTimer(dueTime, timeoutCts.Token);
                Task <bool> approval       = context.WaitForExternalEvent <bool>("SubmissionApprovalEvent");
                if (approval == await Task.WhenAny(approval, durableTimeout))
                {
                    timeoutCts.Cancel();
                    submission.Status = approval.Result ? "APPROVED" : "DECLINED";
                }
                else
                {
                    submission.Status = "IGNORED";
                }
            }

            //Set a custom status for this process
            context.SetCustomStatus(new { ApprovalStatus = submission.Status });

            //Notify the requester of the process completion
            await context.CallActivityAsync(
                "SubmissionApprovalProcess_NotifyCompletionActivity", submission);

            //Return the status of the submission and completes the process
            return(submission.Status);
        }
Exemple #2
0
        public static async Task <SubmittedContent> DownloadFile(
            [ActivityTrigger] SubmittedContent submittedContent)
        {
            submittedContent.Content = await _httpClient.GetStringAsync(submittedContent.Url);

            return(submittedContent);
        }