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); } }
/// <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"); } }