Exemple #1
0
        public override async Task <IViewProviderResult> BuildUpdateAsync(Topic topic, IViewProviderContext context)
        {
            // Ensure entity exists before attempting to update
            var entity = await _entityStore.GetByIdAsync(topic.Id);

            if (entity == null)
            {
                return(await BuildIndexAsync(topic, context));
            }

            // Validate model
            if (await ValidateModelAsync(topic, context.Updater))
            {
                // Get selected categories
                var categoriesToAdd = GetCategoriesToAdd();
                if (categoriesToAdd != null)
                {
                    // Build categories to remove
                    var categoriesToRemove = new List <int>();
                    foreach (var categoryId in await GetCategoryIdsByEntityIdAsync(topic))
                    {
                        if (!categoriesToAdd.Contains(categoryId))
                        {
                            categoriesToRemove.Add(categoryId);
                        }
                    }

                    // Remove categories
                    foreach (var categoryId in categoriesToRemove)
                    {
                        var entityCategory = await _entityCategoryStore.GetByEntityIdAndCategoryIdAsync(topic.Id, categoryId);

                        if (entityCategory != null)
                        {
                            await _entityCategoryManager.DeleteAsync(entityCategory);
                        }
                    }

                    // Get current user
                    var user = await _contextFacade.GetAuthenticatedUserAsync();

                    // Add new entity category relationships
                    foreach (var categoryId in categoriesToAdd)
                    {
                        // Ensure relationship does not already exist
                        var entityCategory = await _entityCategoryStore.GetByEntityIdAndCategoryIdAsync(topic.Id, categoryId);

                        if (entityCategory == null)
                        {
                            // Add relationship
                            await _entityCategoryManager.CreateAsync(new EntityCategory()
                            {
                                EntityId       = topic.Id,
                                CategoryId     = categoryId,
                                CreatedUserId  = user?.Id ?? 0,
                                ModifiedUserId = user?.Id ?? 0,
                            });
                        }
                    }

                    //// Update entity with first found category
                    //foreach (var id in categoriesToAdd)
                    //{
                    //    topic.CategoryId = id;
                    //    await _entityStore.UpdateAsync(topic);
                    //    break;
                    //}

                    // Update added category meta data
                    foreach (var id in categoriesToAdd)
                    {
                        await _categoryDetailsUpdater.UpdateAsync(id);
                    }

                    // Update removed category meta data
                    foreach (var id in categoriesToRemove)
                    {
                        await _categoryDetailsUpdater.UpdateAsync(id);
                    }
                }
            }

            return(await BuildEditAsync(topic, context));
        }
        // ----------

        async Task <ICommandResultBase> InstallInternalAsync(IShellFeature feature)
        {
            // Validate

            if (feature == null)
            {
                throw new ArgumentNullException(nameof(feature));
            }

            if (string.IsNullOrEmpty(feature.ModuleId))
            {
                throw new ArgumentNullException(nameof(feature.ModuleId));
            }

            var user = await _contextFacade.GetAuthenticatedUserAsync();

            // Get all feature tags
            var categories = await _categoryStore.QueryAsync()
                             .Select <CategoryQueryParams>(Q =>
            {
                Q.FeatureId.Equals(feature.Id);
            })
                             .ToList();

            // Associate every category with at least 1 entity

            var output = new CommandResultBase();

            if (categories != null)
            {
                var entityFeature = await GetEntityFeatureAsync(feature);

                if (entityFeature == null)
                {
                    return(output.Failed($"A feature named {feature.ModuleId.Replace(".Categories", "")} is not enabled!"));
                }

                // Get entities for feature
                var entities = await _entityStore.QueryAsync()
                               .Select <EntityQueryParams>(q =>
                {
                    q.FeatureId.Equals(entityFeature.Id);
                    q.CategoryId.Equals(0);
                })
                               .ToList();

                // Keeps track of entities already added to categories
                var alreadyAdded = new Dictionary <int, Entity>();

                // Interate categories building random entities
                // not already added to a category and adding
                // those random entities to the current category
                foreach (var category in categories?.Data)
                {
                    // Get random entities
                    var randomEntities = GetRandomEntities(entities?.Data, alreadyAdded);

                    // Ensure we have some random entities, they may have already al been added
                    if (randomEntities == null)
                    {
                        return(output.Success());
                    }

                    // Add random entities to category
                    foreach (var randomEntity in randomEntities)
                    {
                        // Get the full entity
                        var entity = await _entityStore.GetByIdAsync(randomEntity.Id);

                        // Update
                        entity.CategoryId     = category.Id;
                        entity.ModifiedUserId = user?.Id ?? 0;
                        entity.ModifiedDate   = DateTime.UtcNow;

                        // Persist
                        var entityResult = await _entityManager.UpdateAsync(entity);

                        if (entityResult.Succeeded)
                        {
                            // Add entity / category relationship
                            var result = await _entityCategoryManager.CreateAsync(new EntityCategory()
                            {
                                EntityId      = entityResult.Response.Id,
                                CategoryId    = category.Id,
                                CreatedUserId = user?.Id ?? 0,
                                CreatedDate   = DateTime.UtcNow
                            });

                            if (!result.Succeeded)
                            {
                                return(output.Failed(result.Errors.ToArray()));
                            }
                        }
                        else
                        {
                            return(output.Failed(entityResult.Errors.ToArray()));
                        }
                    }
                }
            }

            return(output.Success());
        }