public static async Task <EmailConfirmationInfo> Orchestrator_SendEmailConfirmation(
            [OrchestrationTrigger] IDurableOrchestrationContext context,
            ILogger log)
        {
            if (!context.IsReplaying)
            {
                log.LogInformation("SendEmailConfirmation orchestration started.");
            }

            EmailConfirmationInput input = context.GetInput <EmailConfirmationInput>();

            var confirmationInfo = new EmailConfirmationInfo
            {
                Id              = context.NewGuid(),
                RequestUri      = input.RequestUri,
                Email           = input.Email,
                OrchestrationId = context.InstanceId,
                Result          = "Sent"
            };

            await context.CallActivityAsync(nameof(Activity_SendEmailConfirmation), confirmationInfo);

            using (var cts = new CancellationTokenSource())
            {
                DateTime timeoutAt   = context.CurrentUtcDateTime.AddSeconds(30);
                Task     timeoutTask = context.CreateTimer(timeoutAt, cts.Token);

                Task <string> confirmResultTask = context.WaitForExternalEvent <string>(_eventName);

                if (!context.IsReplaying)
                {
                    context.SetCustomStatus($"Waiting for human interaction or timeout at: {timeoutAt.ToString("hh:mm:ss")} UTC.");
                }

                Task winnerTask = await Task.WhenAny(confirmResultTask, timeoutTask);

                if (winnerTask == confirmResultTask)
                {
                    cts.Cancel();
                    confirmationInfo.Result = confirmResultTask.Result;
                }
                else
                {
                    confirmationInfo.Result = "Timed Out";
                }
            }

            await context.CallActivityAsync(nameof(Activity_SaveEmailConfirmationResult), confirmationInfo);

            return(confirmationInfo);
        }
        public static async Task <HttpResponseMessage> Client_StartEmailConfirmation(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestMessage request,
            [DurableClient] IDurableClient starter)
        {
            // All this process is just for demo purpose to take advantage of the Durable Functions features.

            string email = request.RequestUri.ParseQueryString()["email"];

            if (string.IsNullOrWhiteSpace(email))
            {
                return(request.CreateResponse(HttpStatusCode.BadRequest, "Missing email field in the query."));
            }

            var input = new EmailConfirmationInput(email, request.RequestUri);

            string instanceId = await starter.StartNewAsync(nameof(Orchestrator_SendEmailConfirmation), input);

            return(starter.CreateCheckStatusResponse(request, instanceId));
        }
        public async Task <IActionResult> ConfirmEmail([FromBody] EmailConfirmationInput input)
        {
            var user = await this.userManager.FindByEmailAsync(input.Email);

            var result = await this.userManager.ConfirmEmailAsync(user, input.Token);

            if (result.Succeeded)
            {
                return(this.Ok());
            }

            var error = new ApiErrorModel()
            {
                Code        = nameof(user),
                Description = "Email wasn't confirmed",
            };

            return(this.BadRequest(new List <ApiErrorModel> {
                error
            }));
        }
        public async Task ConfirmEmail(EmailConfirmationInput model)
        {
            await this.httpService.Post("api/users/email/confirm", model);

            this.appDataService.StateHasChanged();
        }