private async Task StartNewSurveyAsync(string phoneNumber, ILambdaLogger logger)
        {
            // save info about the respondent
            logger.LogLine($"Saving survey response for {Sanitizer.MaskPhoneNumber(phoneNumber)}");
            var phoneNumberHash = Sanitizer.HashPhoneNumber(phoneNumber);
            var surveyResponse  = new SurveyResponse
            {
                PhoneNumberHash = phoneNumberHash,
                TaskToken       = "",
                Responses       = new Dictionary <string, string>()
            };
            await _DataAccess.SaveSurveyResponeAsync(surveyResponse).ConfigureAwait(false);

            // start the workflow
            logger.LogLine($"Starting workflow for {Sanitizer.MaskPhoneNumber(phoneNumber)}");
            using (var client = StepFunctionClientFactory.GetClient())
            {
                var state = new State
                {
                    PhoneNumber = phoneNumber
                };
                var req = new StartExecutionRequest
                {
                    Name            = phoneNumberHash + Guid.NewGuid().ToString("N"),
                    StateMachineArn = ServerlessConfig.StateMachineArn,
                    Input           = JsonConvert.SerializeObject(state)
                };
                await client.StartExecutionAsync(req).ConfigureAwait(false);
            }
        }
 private static async Task CompleteWaitForResponseAsync(string taskToken, State state)
 {
     using (var client = StepFunctionClientFactory.GetClient())
     {
         var req = new SendTaskSuccessRequest
         {
             TaskToken = taskToken,
             Output    = JsonConvert.SerializeObject(state)
         };
         await client.SendTaskSuccessAsync(req).ConfigureAwait(false);
     }
 }
 private static async Task FailWaitForResponseAsync(string taskToken)
 {
     using (var client = StepFunctionClientFactory.GetClient())
     {
         var req = new SendTaskFailureRequest
         {
             TaskToken = taskToken,
             Cause     = "User requested do-over",
             Error     = "Restart"
         };
         await client.SendTaskFailureAsync(req).ConfigureAwait(false);
     }
 }
Exemplo n.º 4
0
        /// <summary>
        /// Waits for an SMS activity to begin, then handles it.
        /// </summary>
        public async Task WaitSmsAsync(ILambdaContext context)
        {
            var startTime     = DateTime.Now;
            var timeAvailable = TimeSpan.FromMinutes(4);

            using (var client = StepFunctionClientFactory.GetClient())
            {
                TimeSpan timeLeft;
                do
                {
                    context.Logger.LogLine("Polling GetActivityTask");
                    var arn = ServerlessConfig.WaitSmsResponseActivityArn;
                    var req = new GetActivityTaskRequest {
                        ActivityArn = arn
                    };
                    var result = await client.GetActivityTaskAsync(req).ConfigureAwait(false);

                    if (result.Input != null && result.TaskToken != null)
                    {
                        context.Logger.LogLine("Received token");

                        // get the current state for the activity
                        var state = JsonConvert.DeserializeObject <State>(result.Input);

                        // save the task token to the survey response and persist the current state
                        // so we can restore it later.
                        var surveyResponse = await _DataAccess.GetSurveyResponseAsync(Sanitizer.HashPhoneNumber(state.PhoneNumber))
                                             .ConfigureAwait(false);

                        surveyResponse.TaskToken  = result.TaskToken;
                        surveyResponse.SavedState = state;
                        await _DataAccess.SaveSurveyResponeAsync(surveyResponse).ConfigureAwait(false);

                        // ask the question -- do this last so that the current state is persisted with the task token
                        await AskQuestionAsync(state.PhoneNumber, Survey.GetQuestion(state.Question)).ConfigureAwait(false);
                    }

                    timeLeft = timeAvailable - (DateTime.Now - startTime);
                } while (timeLeft.TotalMilliseconds >= 65000);

                context.Logger.LogLine("Polling loop terminated");
            }
        }