public async Task <IActionResult> EditRecipeAction(string id, string recipeActionId, string statusMessage, string recipeActionGroupId)
        {
            var recipe = await _recipeManager.GetRecipe(id, _userManager.GetUserId(User));

            if (recipe == null)
            {
                return(GetNotFoundActionResult());
            }

            RecipeAction recipeAction = null;

            if (!string.IsNullOrEmpty(recipeActionId))
            {
                recipeAction = recipe.RecipeActions.SingleOrDefault(action => action.Id == recipeActionId);
                if (recipeAction == null)
                {
                    return(GetNotFoundActionResult());
                }
            }

            return(View(new EditRecipeActionViewModel()
            {
                RecipeId = id,
                ActionId = recipeAction?.ActionId,
                RecipeActionGroupId = recipeActionGroupId,
                RecipeAction = recipeAction,
                StatusMessage = statusMessage,
                Actions = new SelectList(_actionDescriptors, nameof(IActionDescriptor.ActionId),
                                         nameof(IActionDescriptor.Name), recipeAction?.ActionId)
            }));
        }
예제 #2
0
        public IActionResult GetRecipe(int id)
        {
            var recipe = _recipeManager.GetRecipe(id);

            if (recipe != null)
            {
                return(Ok(recipe));
            }
            return(NotFound());
        }
예제 #3
0
        public async Task <IActionResult> RemoveRecipe(string id)
        {
            var recipe = await _recipeManager.GetRecipe(id, _userManager.GetUserId(User));

            if (recipe == null)
            {
                return(GetNotFoundActionResult());
            }

            return(View(new RemoveRecipeViewModel()
            {
                Recipe = recipe
            }));
        }
        public async Task <IActionResult> EditRecipeTrigger(string id, string recipeTriggerId, string statusMessage)
        {
            var recipe = await _recipeManager.GetRecipe(id, _userManager.GetUserId(User));

            if (recipe == null)
            {
                return(GetNotFoundActionResult());
            }

            return(View(new EditRecipeTriggerViewModel()
            {
                RecipeId = id,
                TriggerId = recipe.RecipeTrigger?.TriggerId,
                RecipeTrigger = recipe.RecipeTrigger,
                StatusMessage = statusMessage,
                Triggers = new SelectList(_triggerDescriptors, nameof(ITriggerDescriptor.TriggerId),
                                          nameof(ITriggerDescriptor.Name), recipe.RecipeTrigger?.TriggerId)
            }));
        }
예제 #5
0
        private async Task <(IActionResult Error, RecipeAction Data)> GetRecipeAction(string identifier)
        {
            if (!_memoryCache.TryGetValue(identifier, out RecipeAction data))
            {
                return(RedirectToAction("GetRecipes", "Recipes", new
                {
                    statusMessage = "Error:Data could not be found or data session expired"
                }), null);
            }

            var recipe = await _recipeManager.GetRecipe(data.RecipeId, GetUserId());

            if (recipe == null)
            {
                return(RedirectToAction("GetRecipes", "Recipes", new
                {
                    statusMessage = "Error:Data could not be found or data session expired"
                }), null);
            }

            if (!string.IsNullOrEmpty(data.RecipeActionGroupId))
            {
                var recipeActionGroup = recipe.RecipeActionGroups.Single(group =>
                                                                         group.Id.Equals(data.RecipeActionGroupId, StringComparison.InvariantCultureIgnoreCase));
                var actions = recipeActionGroup.RecipeActions.OrderBy(action => action.Order);

                var matched = actions.Select((action, i) => (action, i))
                              .Where(tuple => tuple.Item1.ActionId == data.Id);

                var index = matched.Any()
                    ? actions.Select((action, i) => (action, i))
                            .Where(tuple => tuple.Item1.ActionId == data.Id)
                            .Select(tuple => tuple.Item2)
                            .FirstOrDefault()
                    : -1;
                if (index == -1 && actions.Any())
                {
                    RecipeActionIdInGroupBeforeThisOne = actions.Last().Id;
                }
                else if (index > 0)
                {
                    RecipeActionIdInGroupBeforeThisOne = actions.ElementAt(index - 1).Id;
                }
            }

            return(null, data);
        }
예제 #6
0
        public async Task <ExternalServiceData> ExecuteWitchcraftToComputeExternalService()
        {
            var data   = GetData();
            var recipe = await _recipeManager.GetRecipe(data.RecipeId);

            if (recipe == null)
            {
                return(null);
            }

            var actionData = new Dictionary <string, (object data, string json)>();

            if (!string.IsNullOrEmpty(data.RecipeActionId))
            {
                var recipeAction = recipe.RecipeActions.SingleOrDefault(action =>
                                                                        action.Id.Equals(data.RecipeActionId, StringComparison.InvariantCultureIgnoreCase));
                if (recipeAction == null)
                {
                    return(null);
                }

                var dispatchResult = await _actionDispatcher.Dispatch(actionData,
                                                                      recipeAction);

                actionData.Add("PreviousAction", (dispatchResult.First().Data, dispatchResult.First().DataJson));
                actionData.Add("ActionData0", (dispatchResult.First().Data, dispatchResult.First().DataJson));
            }

            if (!string.IsNullOrEmpty(data.RecipeActionGroupId))
            {
                var recipeActionGroup = recipe.RecipeActionGroups.SingleOrDefault(action =>
                                                                                  action.Id.Equals(data.RecipeActionGroupId, StringComparison.InvariantCultureIgnoreCase));
                if (recipeActionGroup == null)
                {
                    return(null);
                }

                await _actionDispatcher.Dispatch(actionData,
                                                 recipeActionGroup);
            }

            var value = InterpolationHelper.InterpolateString(data.Value,
                                                              actionData.ToDictionary(pair => pair.Key, pair => pair.Value.data));

            return(await _externalServiceManager.GetExternalServiceData(value, _data.UserId));
        }
        public JsonResult Edit(int?id)
        {
            var result = new RecipeEditViewModel();

            if (id.HasValue)
            {
                result.Recipe = _recipeManager.GetRecipe(id.Value);
            }
            else
            {
                result.Recipe = new Recipe();
            }
            result.Effects     = _ingredientManager.GetAllEffects();
            result.Moods       = _ingredientManager.GetAllMoods();
            result.Ingredients = _ingredientManager.GetAllIngredients();

            return(Json(result, JsonRequestBehavior.AllowGet));
        }
예제 #8
0
        private async Task <(IActionResult Error, RecipeTrigger Data)> GetRecipeTrigger(string identifier)
        {
            if (!_memoryCache.TryGetValue(identifier, out RecipeTrigger data))
            {
                return(RedirectToAction("GetRecipes", "Recipes", new
                {
                    statusMessage = "Error:Data could not be found or data session expired"
                }), null);
            }

            var recipe = await _recipeManager.GetRecipe(data.RecipeId, _userManager.GetUserId(User));

            if (recipe == null)
            {
                return(RedirectToAction("GetRecipes", "Recipes", new
                {
                    statusMessage = "Error:Data could not be found or data session expired"
                }), null);
            }

            return(null, data);
        }
예제 #9
0
        public async Task <IViewComponentResult> InvokeAsync(string recipeId)
        {
            var recipe = await _recipeManager.GetRecipe(recipeId);

            var properties = new Dictionary <string, object>();

            if (recipe?.RecipeTrigger != null)
            {
                var descriptor = _triggerDescriptors.First(triggerDescriptor =>
                                                           triggerDescriptor.TriggerId == recipe?.RecipeTrigger.TriggerId);

                if (descriptor.GetType().IsSubclassOfRawGeneric(typeof(BaseTriggerHandler <,>)))
                {
                    var type = descriptor.GetType().BaseType.GetGenericArguments().First();
                    properties = GetRecursiveAvailableProperties(type);
                }
            }

            return(View(new RecipeActionFooterViewModel()
            {
                Properties = properties,
                NoRecipeTrigger = recipe?.RecipeTrigger == null
            }));
        }
        public async Task <IViewComponentResult> InvokeAsync(string recipeId, string recipeActionIdInGroupBeforeThisOne)
        {
            var recipe = await _recipeManager.GetRecipe(recipeId);

            var properties = new Dictionary <string, object>();

            if (recipe?.RecipeTrigger != null)
            {
                var descriptor = _triggerDescriptors.FirstOrDefault(triggerDescriptor =>
                                                                    triggerDescriptor.TriggerId == recipe?.RecipeTrigger.TriggerId);

                if (descriptor != null && descriptor.GetType().IsSubclassOfRawGeneric(typeof(BaseTriggerHandler <,>)))
                {
                    var type = descriptor.GetType().BaseType.GetGenericArguments().First();
                    properties.Add("TriggerData", GetRecursiveAvailableProperties(type));
                }
            }

            if (!string.IsNullOrEmpty(recipeActionIdInGroupBeforeThisOne))
            {
                var previousAction = recipe.RecipeActions.FirstOrDefault(action =>
                                                                         action.Id.Equals(recipeActionIdInGroupBeforeThisOne, StringComparison.InvariantCultureIgnoreCase));

                if (previousAction != null)
                {
                    var type = _actionDescriptors.FirstOrDefault(handler =>
                                                                 handler.ActionId == previousAction.ActionId)?.ActionResultDataType;

                    properties.Add("PreviousAction", GetRecursiveAvailableProperties(type));


                    var recipeActionGroupId = previousAction.RecipeActionGroupId;
                    var recipeActionGroup   = recipe.RecipeActionGroups.SingleOrDefault(group =>
                                                                                        group.Id.Equals(recipeActionGroupId, StringComparison.InvariantCultureIgnoreCase));
                    if (recipeActionGroup != null)
                    {
                        var actions = recipeActionGroup.RecipeActions.OrderBy(action => action.Order);
                        for (var i = 0; i < actions.Count(); i++)
                        {
                            var currentAction = actions.ElementAt(i);

                            if (currentAction.Id.Equals(recipeActionIdInGroupBeforeThisOne,
                                                        StringComparison.InvariantCultureIgnoreCase))
                            {
                                break;
                            }

                            type = _actionDescriptors.FirstOrDefault(handler =>
                                                                     handler.ActionId == currentAction.ActionId)?.ActionResultDataType;

                            properties.Add($"ActionData{i}", GetRecursiveAvailableProperties(type));
                        }
                    }
                }
            }

            return(View(new RecipeActionFooterViewModel()
            {
                Properties = properties,
                NoRecipeTrigger = recipe?.RecipeTrigger == null
            }));
        }