From bbd4865f4b30a87c55ba007945cfdb5d68163531 Mon Sep 17 00:00:00 2001 From: enisn Date: Thu, 3 Jun 2021 10:33:07 +0300 Subject: [PATCH] CmsKit - Domain logic of menus --- .../GlobalFeatures/GlobalCmsKitFeatures.cs | 3 + .../Volo/CmsKit/GlobalFeatures/MenuFeature.cs | 17 ++++ .../Volo/CmsKit/Menus/MenuItemConsts.cs | 8 ++ .../Volo/CmsKit/Menus/IMenuRepository.cs | 10 ++ .../Volo/CmsKit/Menus/Menu.cs | 14 +++ .../Volo/CmsKit/Menus/MenuItem.cs | 91 +++++++++++++++++++ .../Volo/CmsKit/Menus/MenuManager.cs | 19 ++++ .../EntityFrameworkCore/CmsKitDbContext.cs | 5 +- .../CmsKitDbContextModelCreatingExtensions.cs | 27 ++++++ .../Volo/CmsKit/Menus/EfCoreMenuRepository.cs | 14 +++ .../MongoDB/Menus/MongoMenuRepository.cs | 18 ++++ 11 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MenuFeature.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Menus/MenuItemConsts.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/IMenuRepository.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/Menu.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuItem.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuManager.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Menus/EfCoreMenuRepository.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Menus/MongoMenuRepository.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs index ed0b01e69f..1f090f8f17 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs @@ -23,6 +23,8 @@ namespace Volo.CmsKit.GlobalFeatures public CmsUserFeature User => GetFeature(); + public MenuFeature Menu => GetFeature(); + public GlobalCmsKitFeatures([NotNull] GlobalFeatureManager featureManager) : base(featureManager) { @@ -34,6 +36,7 @@ namespace Volo.CmsKit.GlobalFeatures AddFeature(new PagesFeature(this)); AddFeature(new BlogsFeature(this)); AddFeature(new CmsUserFeature(this)); + AddFeature(new MenuFeature(this)); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MenuFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MenuFeature.cs new file mode 100644 index 0000000000..5868f68b3e --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MenuFeature.cs @@ -0,0 +1,17 @@ +using JetBrains.Annotations; +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit.GlobalFeatures +{ + [GlobalFeatureName(Name)] + public class MenuFeature : GlobalFeature + { + public const string Name = "CmsKit.Menus"; + + internal MenuFeature( + [NotNull] GlobalCmsKitFeatures cmsKit) : base(cmsKit) + { + + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Menus/MenuItemConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Menus/MenuItemConsts.cs new file mode 100644 index 0000000000..4ae1d494eb --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Menus/MenuItemConsts.cs @@ -0,0 +1,8 @@ +namespace Volo.CmsKit.Menus +{ + public static class MenuItemConsts + { + public const int MaxDisplayNameLength = 64; + public const int MaxUrlLength = 1024; + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/IMenuRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/IMenuRepository.cs new file mode 100644 index 0000000000..e72cc9c08c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/IMenuRepository.cs @@ -0,0 +1,10 @@ +using System; +using Volo.Abp.Domain.Repositories; + +namespace Volo.CmsKit.Menus +{ + public interface IMenuRepository : IBasicRepository + { + + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/Menu.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/Menu.cs new file mode 100644 index 0000000000..8b6a413085 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/Menu.cs @@ -0,0 +1,14 @@ +using JetBrains.Annotations; +using System; +using System.Collections; +using System.Collections.Generic; +using Volo.Abp; +using Volo.Abp.Domain.Entities.Auditing; + +namespace Volo.CmsKit.Menus +{ + public class Menu : FullAuditedAggregateRoot + { + public ICollection Items { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuItem.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuItem.cs new file mode 100644 index 0000000000..91d9f33c0e --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuItem.cs @@ -0,0 +1,91 @@ +using JetBrains.Annotations; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Domain.Entities.Auditing; + +namespace Volo.CmsKit.Menus +{ + public class MenuItem : AuditedEntity + { + /// + /// Parent Id. + /// + public Guid MenuId { get; set; } + + /// + /// Presents another Id. + /// If it's , then it's a root menu item. + /// + public Guid? ParentMenuId { get; set; } + + [NotNull] + public string DisplayName { get; protected set; } + + public bool IsActive { get; set; } + + [NotNull] + public string Url { get; protected set; } + + public string Icon { get; set; } + + public int Order { get; set; } + + public string Target { get; set; } + + public string ElementId { get; set; } + + public string CssClass { get; set; } + + public string RequiredPermissionName { get; set; } + + public Guid? PageId { get; protected set; } + + + public MenuItem(Guid id, + Guid menuId, + [NotNull] string displayName, + [NotNull] string url, + bool isActive = true, + [CanBeNull] Guid? parentMenuId = null, + [CanBeNull] string icon = null, + int order = 1000, + [CanBeNull] string target = null, + [CanBeNull] string elementId = null, + [CanBeNull] string cssClass = null, + [CanBeNull] string requiredPermissionName = null) + :base(id) + { + MenuId = menuId; + SetDisplayName(displayName); + IsActive = isActive; + ParentMenuId = parentMenuId; + SetUrl(url); + Icon = icon; + Order = order; + Target = target; + ElementId = elementId; + CssClass = cssClass; + RequiredPermissionName = requiredPermissionName; + } + + public void SetDisplayName([NotNull] string displayName) + { + DisplayName = Check.NotNullOrEmpty(displayName, nameof(displayName), MenuItemConsts.MaxDisplayNameLength); + } + + public void SetUrl([NotNull]string url) + { + Url = Check.NotNullOrEmpty(url, nameof(url), MenuItemConsts.MaxUrlLength); + } + + internal void SetPageId(Guid pageId) + { + PageId = pageId; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuManager.cs new file mode 100644 index 0000000000..8fcc8f207c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuManager.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; +using Volo.CmsKit.Pages; + +namespace Volo.CmsKit.Menus +{ + public class MenuManager : DomainService + { + public virtual void SetPageUrl(MenuItem menuItem, Page page) + { + menuItem.SetPageId(page.Id); + menuItem.SetUrl(page.Slug.EnsureStartsWith('/')); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs index 7fc05ea042..5d16417c47 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs @@ -4,6 +4,7 @@ using Volo.Abp.EntityFrameworkCore; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.MediaDescriptors; +using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; using Volo.CmsKit.Ratings; using Volo.CmsKit.Reactions; @@ -26,7 +27,9 @@ namespace Volo.CmsKit.EntityFrameworkCore public DbSet BlogPosts { get; set; } public DbSet BlogFeatures { get; set; } public DbSet MediaDescriptors { get; set; } - + public DbSet Menus { get; set; } + public DbSet MenuItems { get; set; } + public CmsKitDbContext(DbContextOptions options) : base(options) { diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index 284d4b0e33..c015122992 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -8,6 +8,7 @@ using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.MediaDescriptors; +using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; using Volo.CmsKit.Ratings; using Volo.CmsKit.Reactions; @@ -232,6 +233,32 @@ namespace Volo.CmsKit.EntityFrameworkCore { builder.Ignore(); } + + if (GlobalFeatureManager.Instance.IsEnabled()) + { + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "Menus", options.Schema); + + b.ConfigureByConvention(); + }); + + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "MenuItems", options.Schema); + + b.ConfigureByConvention(); + + b.Property(x => x.DisplayName).IsRequired().HasMaxLength(MenuItemConsts.MaxDisplayNameLength); + + b.Property(x => x.Url).IsRequired().HasMaxLength(MenuItemConsts.MaxUrlLength); + }); + } + else + { + builder.Ignore(); + builder.Ignore(); + } } } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Menus/EfCoreMenuRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Menus/EfCoreMenuRepository.cs new file mode 100644 index 0000000000..f7b9cb9348 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Menus/EfCoreMenuRepository.cs @@ -0,0 +1,14 @@ +using System; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.CmsKit.EntityFrameworkCore; + +namespace Volo.CmsKit.Menus +{ + public class EfCoreMenuRepository : EfCoreRepository, IMenuRepository + { + public EfCoreMenuRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Menus/MongoMenuRepository.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Menus/MongoMenuRepository.cs new file mode 100644 index 0000000000..91850a8eda --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Menus/MongoMenuRepository.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.MongoDB; +using Volo.CmsKit.Menus; + +namespace Volo.CmsKit.MongoDB.Menus +{ + public class MongoMenuRepository : MongoDbRepository, IMenuRepository + { + public MongoMenuRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + } +}