示例#1
0
        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);
            }
        }
示例#2
0
        private async Task <TResult> NotFoundResult(SetContainedViewRequest <TResult> input)
        {
            var r = new FlowResultResolverRequest <TResult>
            {
                ScreenModel = new UiFlowStepUnauthorized()
            };

            r.CopyCallbacksFrom(input);

            return(await _flowResultResolver.Execute(r));
        }
示例#3
0
        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);
            }
        }
示例#4
0
        //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);
        }