private List <DynamicContentFolder> LoadFoldersRecursive(DynamicContentFolder folder)
        {
            var retVal          = new List <DynamicContentFolder>();
            var childrenFolders = _dynamicContentSearchService.SearchFolders(new DynamicContentFolderSearchCriteria {
                FolderId = folder?.Id, Take = int.MaxValue
            }).Results.ToList();

            foreach (var childFolder in childrenFolders)
            {
                retVal.Add(childFolder);
                retVal.AddRange(LoadFoldersRecursive(childFolder));
            }
            return(retVal);
        }
        private async Task <IList <DynamicContentFolder> > LoadFoldersRecursiveAsync(DynamicContentFolder folder)
        {
            var result = new List <DynamicContentFolder>();

            var childrenFolders = (await _folderSearchService.SearchFoldersAsync(new DynamicContentFolderSearchCriteria {
                FolderId = folder?.Id, Take = int.MaxValue
            })).Results.ToList();

            foreach (var childFolder in childrenFolders)
            {
                result.Add(childFolder);
                result.AddRange(await LoadFoldersRecursiveAsync(childFolder));
            }

            return(result);
        }
Exemple #3
0
        public void PostInitialize(IApplicationBuilder appBuilder)
        {
            _appBuilder = appBuilder;

            var settingsRegistrar = appBuilder.ApplicationServices.GetRequiredService <ISettingsRegistrar>();

            settingsRegistrar.RegisterSettings(ModuleConstants.Settings.General.AllSettings, ModuleInfo.Id);

            var permissionsProvider = appBuilder.ApplicationServices.GetRequiredService <IPermissionsRegistrar>();

            permissionsProvider.RegisterPermissions(ModuleConstants.Security.Permissions.AllPermissions.Select(x =>
                                                                                                               new Permission()
            {
                GroupName = "Marketing",
                ModuleId  = ModuleInfo.Id,
                Name      = x
            }).ToArray());

            var eventHandlerRegistrar = appBuilder.ApplicationServices.GetService <IHandlerRegistrar>();

            //Create order observer. record order coupon usage
            eventHandlerRegistrar.RegisterHandler <DynamicContentItemChangedEvent>(async(message, token) => await appBuilder.ApplicationServices.GetService <DynamicContentItemEventHandlers>().Handle(message));

            using (var serviceScope = appBuilder.ApplicationServices.CreateScope())
            {
                var dbContext = serviceScope.ServiceProvider.GetRequiredService <MarketingDbContext>();
                dbContext.Database.MigrateIfNotApplied(MigrationName.GetUpdateV2MigrationName(ModuleInfo.Id));
                dbContext.Database.EnsureCreated();
                dbContext.Database.Migrate();
            }

            var dynamicContentService = appBuilder.ApplicationServices.GetService <IDynamicContentService>();

            foreach (var id in new[] { ModuleConstants.MarketingConstants.ContentPlacesRootFolderId, ModuleConstants.MarketingConstants.CotentItemRootFolderId })
            {
                var folders    = dynamicContentService.GetFoldersByIdsAsync(new[] { id }).GetAwaiter().GetResult();
                var rootFolder = folders.FirstOrDefault();
                if (rootFolder == null)
                {
                    rootFolder = new DynamicContentFolder
                    {
                        Id   = id,
                        Name = id
                    };
                    dynamicContentService.SaveFoldersAsync(new[] { rootFolder }).GetAwaiter().GetResult();
                }
            }

            //Create standard dynamic properties for dynamic content item
            var dynamicPropertyService  = appBuilder.ApplicationServices.GetService <IDynamicPropertyService>();
            var contentItemTypeProperty = new DynamicProperty
            {
                Id           = "Marketing_DynamicContentItem_Type_Property",
                IsDictionary = true,
                Name         = "Content type",
                ObjectType   = typeof(DynamicContentItem).FullName,
                ValueType    = DynamicPropertyValueType.ShortText,
                CreatedBy    = "Auto",
            };

            dynamicPropertyService.SaveDynamicPropertiesAsync(new[] { contentItemTypeProperty }).GetAwaiter().GetResult();

            var extensionManager = appBuilder.ApplicationServices.GetService <IMarketingExtensionManager>();

            extensionManager.PromotionCondition = new PromotionConditionAndRewardTree {
                Children = GetConditionsAndRewards()
            };
            extensionManager.ContentCondition = new DynamicContentConditionTree()
            {
                Children = GetDynamicContentConditions()
            };

            //Next lines allow to use polymorph types in API controller methods
            var mvcJsonOptions = appBuilder.ApplicationServices.GetService <IOptions <MvcJsonOptions> >();

            mvcJsonOptions.Value.SerializerSettings.Converters.Add(new PolymorphicMarketingJsonConverter(appBuilder.ApplicationServices.GetService <IMarketingExtensionManager>()));
            mvcJsonOptions.Value.SerializerSettings.Converters.Add(new RewardJsonConverter());

            AbstractTypeFactory <IConditionTree> .RegisterType <PromotionConditionAndRewardTree>();

            AbstractTypeFactory <IConditionTree> .RegisterType <DynamicContentConditionTree>();

            AbstractTypeFactory <IConditionTree> .RegisterType <BlockContentCondition>();

            AbstractTypeFactory <IConditionTree> .RegisterType <BlockCustomerCondition>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionIsRegisteredUser>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionIsEveryone>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionIsFirstTimeBuyer>();

            AbstractTypeFactory <IConditionTree> .RegisterType <BlockCatalogCondition>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionAtNumItemsInCart>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionAtNumItemsInCategoryAreInCart>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionAtNumItemsOfEntryAreInCart>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionCartSubtotalLeast>();

            AbstractTypeFactory <IConditionTree> .RegisterType <BlockCartCondition>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionCategoryIs>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionCodeContains>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionCurrencyIs>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionEntryIs>();

            AbstractTypeFactory <IConditionTree> .RegisterType <ConditionInStockQuantity>();

            AbstractTypeFactory <IConditionTree> .RegisterType <BlockReward>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardCartGetOfAbsSubtotal>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardCartGetOfRelSubtotal>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardItemGetFreeNumItemOfProduct>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardItemGetOfAbs>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardItemGetOfAbsForNum>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardItemGetOfRel>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardItemGetOfRelForNum>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardItemGiftNumItem>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardShippingGetOfAbsShippingMethod>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardShippingGetOfRelShippingMethod>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardPaymentGetOfAbs>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardPaymentGetOfRel>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardItemForEveryNumInGetOfRel>();

            AbstractTypeFactory <IConditionTree> .RegisterType <RewardItemForEveryNumOtherItemInGetOfRel>();

            AbstractTypeFactory <PromotionReward> .RegisterType <GiftReward>();

            AbstractTypeFactory <PromotionReward> .RegisterType <CartSubtotalReward>();

            AbstractTypeFactory <PromotionReward> .RegisterType <CatalogItemAmountReward>();

            AbstractTypeFactory <PromotionReward> .RegisterType <PaymentReward>();

            AbstractTypeFactory <PromotionReward> .RegisterType <ShipmentReward>();

            AbstractTypeFactory <PromotionReward> .RegisterType <SpecialOfferReward>();
        }
Exemple #4
0
        public void PostInitialize(IApplicationBuilder appBuilder)
        {
            _appBuilder = appBuilder;

            var settingsRegistrar = appBuilder.ApplicationServices.GetRequiredService <ISettingsRegistrar>();

            settingsRegistrar.RegisterSettings(ModuleConstants.Settings.General.AllSettings, ModuleInfo.Id);

            var permissionsRegistrar = appBuilder.ApplicationServices.GetRequiredService <IPermissionsRegistrar>();

            permissionsRegistrar.RegisterPermissions(ModuleConstants.Security.Permissions.AllPermissions.Select(x =>
                                                                                                                new Permission()
            {
                GroupName = "Marketing",
                ModuleId  = ModuleInfo.Id,
                Name      = x
            }).ToArray());

            //Register Permission scopes
            AbstractTypeFactory <PermissionScope> .RegisterType <MarketingStoreSelectedScope>();

            permissionsRegistrar.WithAvailabeScopesForPermissions(new[] { ModuleConstants.Security.Permissions.Read }, new MarketingStoreSelectedScope());


            var eventHandlerRegistrar = appBuilder.ApplicationServices.GetService <IHandlerRegistrar>();

            //Create order observer. record order coupon usage
            eventHandlerRegistrar.RegisterHandler <OrderChangedEvent>(async(message, token) => await appBuilder.ApplicationServices.GetService <CouponUsageRecordHandler>().Handle(message));

            eventHandlerRegistrar.RegisterHandler <PromotionChangedEvent>(async(message, token) => await appBuilder.ApplicationServices.GetService <LogChangesChangedEventHandler>().Handle(message));
            eventHandlerRegistrar.RegisterHandler <CouponChangedEvent>(async(message, token) => await appBuilder.ApplicationServices.GetService <LogChangesChangedEventHandler>().Handle(message));

            using (var serviceScope = appBuilder.ApplicationServices.CreateScope())
            {
                var dbContext = serviceScope.ServiceProvider.GetRequiredService <MarketingDbContext>();
                dbContext.Database.MigrateIfNotApplied(MigrationName.GetUpdateV2MigrationName(ModuleInfo.Id));
                dbContext.Database.EnsureCreated();
                dbContext.Database.Migrate();
            }

            var dynamicPropertyRegistrar = appBuilder.ApplicationServices.GetRequiredService <IDynamicPropertyRegistrar>();

            dynamicPropertyRegistrar.RegisterType <DynamicContentItem>();

            var dynamicContentService = appBuilder.ApplicationServices.GetService <IDynamicContentService>();

            foreach (var id in new[] { ModuleConstants.MarketingConstants.ContentPlacesRootFolderId, ModuleConstants.MarketingConstants.CotentItemRootFolderId })
            {
                var folders    = dynamicContentService.GetFoldersByIdsAsync(new[] { id }).GetAwaiter().GetResult();
                var rootFolder = folders.FirstOrDefault();
                if (rootFolder == null)
                {
                    rootFolder = new DynamicContentFolder
                    {
                        Id   = id,
                        Name = id
                    };
                    dynamicContentService.SaveFoldersAsync(new[] { rootFolder }).GetAwaiter().GetResult();
                }
            }

            //Create standard dynamic properties for dynamic content item
            var dynamicPropertyService  = appBuilder.ApplicationServices.GetService <IDynamicPropertyService>();
            var contentItemTypeProperty = new DynamicProperty
            {
                Id           = "Marketing_DynamicContentItem_Type_Property",
                IsDictionary = true,
                Name         = "Content type",
                ObjectType   = typeof(DynamicContentItem).FullName,
                ValueType    = DynamicPropertyValueType.ShortText,
                CreatedBy    = "Auto",
            };

            dynamicPropertyService.SaveDynamicPropertiesAsync(new[] { contentItemTypeProperty }).GetAwaiter().GetResult();

            PolymorphJsonConverter.RegisterTypeForDiscriminator(typeof(PromotionReward), nameof(PromotionReward.Id));

            //Register the resulting trees expressions into the AbstractFactory<IConditionTree>
            foreach (var conditionTree in AbstractTypeFactory <PromotionConditionAndRewardTreePrototype> .TryCreateInstance().Traverse <IConditionTree>(x => x.AvailableChildren))
            {
                AbstractTypeFactory <IConditionTree> .RegisterType(conditionTree.GetType());
            }
            foreach (var conditionTree in AbstractTypeFactory <DynamicContentConditionTreePrototype> .TryCreateInstance().Traverse <IConditionTree>(x => x.AvailableChildren))
            {
                AbstractTypeFactory <IConditionTree> .RegisterType(conditionTree.GetType());
            }
        }