public async Task <IActionResult> Init(InitializeUiFlowRequest request) { using (_profiler.Profile(nameof(UiFlowController), nameof(Init))) { Logger.Trace(() => $"Starting - {nameof(Init)} --> {request} "); var result = await this.HandleActionAsync(async() => { var input = ControllerContext.RouteData.Values.ToExpandoObject(Request.Query); return(await _flowInitialViewResolver.Execute( new InitialViewRequest <IActionResult> { ContainerFlowHandler = request.ContainerFlowHandler, FlowInput = input.ToExpandoObject(), FlowType = ResolveFlowTypeFromValueOrUrl(request.FlowType), StartType = request.StartType, OnBuildView = async model => { var resolverRequest = new FlowResultResolverRequest <IActionResult> { ScreenModel = model }; AddDefaultCallbackHandlers(resolverRequest); return await _resultResolver.Execute(resolverRequest); } })); }); Logger.Trace(() => $"Completed - {nameof(Init)} --> {request} "); return(result); } }
private async Task <TResult> NotFoundResult(SetContainedViewRequest <TResult> input) { var r = new FlowResultResolverRequest <TResult> { ScreenModel = new UiFlowStepUnauthorized() }; r.CopyCallbacksFrom(input); return(await _flowResultResolver.Execute(r)); }
public async Task <IActionResult> Current(CurrentViewRequest request) { using (_profiler.Profile(nameof(UiFlowController), nameof(Current))) { Logger.Trace(() => $"Starting - {nameof(Current)} --> {request} "); var result = await this.HandleActionAsync(async() => { var stepViewCustomizations = (IDictionary <string, object>)ControllerContext.RouteData.Values.ToExpandoObject(Request.Query); return(await _flowCurrentViewResolver.Execute( new CurrentViewRequest <IActionResult> { FlowHandler = request.FlowHandler, ViewParameters = stepViewCustomizations, BuildResultOnFlowNotFound = () => Task.FromResult((IActionResult)BadRequest()), BuildResultOnRequestRedirectTo = async(flowHandler) => (IActionResult)RedirectToAction(nameof(Current), GetFlowTypeFromUrl(), await stepViewCustomizations.MergeObjects(preserveLast: true, new CurrentViewRequest { FlowHandler = flowHandler }).ToValidRouteValueAsync(HttpContext)), OnAddModelError = (memberName, errorMessage) => ModelState.AddModelError(memberName, errorMessage), OnBuildView = (bvi) => { var viewPath = $"{bvi.FlowType}/Views/{bvi.ViewName}"; return Task.FromResult(bvi.BuildPartial ? PartialView(viewPath, bvi.ScreenModel) : (IActionResult)View(viewPath, bvi.ScreenModel)); }, OnCallbackCallerFlow = async model => { var resolverRequest = new FlowResultResolverRequest <IActionResult> { ScreenModel = model }; AddDefaultCallbackHandlers(resolverRequest); return await _resultResolver.Execute(resolverRequest); }, ResolveAsComponentOnly = false })); }); Logger.Trace(() => $"Completed - {nameof(Current)} --> {request} "); return(result); } }
//TODO: THIS SHOULD BE THE COMMAND CONCERN AND ENCAPSULATED IN IT private async Task <IActionResult> RecordAndResolve(UiFlowScreenModel sourceStep) { IActionResult result = null; var form = HttpContext.Request.Form; if (!form.ContainsKey(FlowFormKey)) { result = BadRequest(); } else { var currentToken = form[FlowFormKey].ToString(); var lastToken = await _store.GetAsync(LastProcessedTokenKey); if (lastToken == currentToken) { var ctx = await _contextRepository.GetCurrentSnapshot(sourceStep.FlowHandler); var uiFlowStepData = ctx.GetCurrentStepData <UiFlowScreenModel>(); while (uiFlowStepData == null) { await Task.Delay(100); ctx = await _contextRepository.GetCurrentSnapshot(sourceStep.FlowHandler); uiFlowStepData = ctx.GetCurrentStepData <UiFlowScreenModel>(); } var request = new FlowResultResolverRequest <IActionResult> { ScreenModel = uiFlowStepData }; AddDefaultCallbackHandlers(request); result = await _resultResolver.Execute(request); } await _store.SetAsync(LastProcessedTokenKey, currentToken); } return(result); }