From 5d6fa01df769c4e2f08653515b018bb71bcae0f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 5 Mar 2021 10:59:42 +0300 Subject: [PATCH 01/15] Refactored CMS Kit and added TODOs. --- .../CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs | 2 +- .../MediaDescriptorAdminAppService.cs | 2 ++ .../Volo/CmsKit/Admin/Pages/PageAdminAppService.cs | 7 +++++-- .../Volo/CmsKit/CmsKitErrorCodes.cs | 1 + .../src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Blog.cs | 7 ++++++- .../Volo/CmsKit/Blogs/BlogFeature.cs | 8 +++++++- .../Volo/CmsKit/Blogs/BlogFeatureManager.cs | 8 +++++--- .../Volo/CmsKit/Blogs/BlogPostManager.cs | 6 ++++++ .../CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs | 4 +++- .../CmsKit/Blogs/BlogSlugAlreadyExistException.cs | 7 +++---- .../Volo/CmsKit/Blogs/Extensions/SlugExtensions.cs | 2 +- .../DefaultMediaDescriptorDefinitionStore.cs | 11 +++++++---- .../MediaDescriptors/EntityCantHaveMediaException.cs | 4 ++-- .../Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs | 2 +- 14 files changed, 50 insertions(+), 21 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs index d074d1f455..3ffaeca4a6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs @@ -32,7 +32,7 @@ namespace Volo.CmsKit.Admin.Blogs EventBus = eventBus; } - [Authorize(CmsKitAdminPermissions.Blogs.Features)] + [Authorize(CmsKitAdminPermissions.Blogs.Features)] //TODO: Move to the class level (all methods check the same permission)? public virtual async Task> GetListAsync(Guid blogId) { var blogFeatures = await BlogFeatureManager.GetListAsync(blogId); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs index 45774ca1f2..fca41500bf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs @@ -33,6 +33,7 @@ namespace Volo.CmsKit.Admin.MediaDescriptors { var definition = await MediaDescriptorDefinitionStore.GetDefinitionAsync(inputStream.EntityType); + /* TODO: Shouldn't CreatePolicies be a dictionary and we check for inputStream.EntityType? */ await CheckAnyOfPoliciesAsync(definition.CreatePolicies); var newId = GuidGenerator.Create(); @@ -53,6 +54,7 @@ namespace Volo.CmsKit.Admin.MediaDescriptors var definition = await MediaDescriptorDefinitionStore.GetDefinitionAsync(mediaDescriptor.EntityType); + /* TODO: Shouldn't DeletePolicies be a dictionary and we check for inputStream.EntityType? */ await CheckAnyOfPoliciesAsync(definition.DeletePolicies); await MediaContainer.DeleteAsync(id.ToString()); diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs index 102b2a6afd..18e57f0f23 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs @@ -48,8 +48,10 @@ namespace Volo.CmsKit.Admin.Pages [Authorize(CmsKitAdminPermissions.Pages.Create)] public virtual async Task CreateAsync(CreatePageInputDto input) { + /* TODO: This should be in a domain service, like PageManager.CreateAsync(...) + Otherwise, we can't ensure the slug check is applied. + The same pattern is already done for BlogManager */ await CheckPageSlugAsync(input.Slug); - var page = new Page(GuidGenerator.Create(), input.Title, input.Slug, input.Content, CurrentTenant.Id); await PageRepository.InsertAsync(page); @@ -64,11 +66,12 @@ namespace Volo.CmsKit.Admin.Pages if (page.Slug != input.Slug) { + /* TODO: This should be in a domain service, like PageManager.SetSlugAsync(page, input.Slug) */ await CheckPageSlugAsync(input.Slug); + page.SetSlug(input.Slug); } page.SetTitle(input.Title); - page.SetSlug(input.Slug); page.SetContent(input.Content); await PageRepository.UpdateAsync(page); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs index 064c504fb4..8ceeb7c924 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs @@ -8,6 +8,7 @@ public const string EntityNotTaggable = "CmsKit:Tag:0002"; } + // TODO: Unused? Remove, if so. public const string ContentAlreadyExist = "CmsKit:0002"; public static class Pages diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Blog.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Blog.cs index 313b282a1f..7a63e7dbf7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Blog.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Blog.cs @@ -17,7 +17,12 @@ namespace Volo.CmsKit.Blogs public virtual Guid? TenantId { get; protected set; } - protected internal Blog(Guid id, [NotNull] string name, [NotNull] string slug, [CanBeNull] Guid? tenantId = null) : base(id) + protected internal Blog( + Guid id, + [NotNull] string name, + [NotNull] string slug, + [CanBeNull] Guid? tenantId = null + ) : base(id) { SetName(name); SetSlug(slug); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs index 8ec02a1875..ff73a798cb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs @@ -11,7 +11,7 @@ namespace Volo.CmsKit.Blogs public string FeatureName { get; protected set; } - public bool IsEnabled { get; set; } = true; + public bool IsEnabled { get; protected internal set; } public BlogFeature(Guid blogId, [NotNull] string featureName, bool isEnabled = true) { @@ -20,6 +20,12 @@ namespace Volo.CmsKit.Blogs IsEnabled = isEnabled; } + /* + TODO: Overriding Equals is not a good practice for entities (see https://github.com/abpframework/abp/issues/1728) + Also, the implementation is not a true equal implementation. It just special comparison for a specific case + (used in BlogFeatureManager.GetListAsync). Remove Equals and just do the logic in-place, or create a static + method like BlogFeature.IsSameBlogFeature(BlogFeature other). + */ public bool Equals(BlogFeature other) { return BlogId == other?.BlogId && FeatureName == other?.FeatureName; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs index 809a7ab9d2..f9f4efd37a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs @@ -2,9 +2,6 @@ using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Domain.Services; -using Volo.Abp.EventBus.Distributed; -using Volo.Abp.EventBus.Local; -using Volo.Abp.Uow; namespace Volo.CmsKit.Blogs { @@ -26,6 +23,11 @@ namespace Volo.CmsKit.Blogs { var blogFeatures = await BlogFeatureRepository.GetListAsync(blogId); + /* TODO: Creating transient entities in DefaultBlogFeatureProvider.GetDefaultFeaturesAsync + is not a good idea. Returned list will contain mixed (some in db some in-memory). + For example, if I delete/update one of the BlogFeature comes from in-memory, + I will have an strange behaviour. You should find another way. + */ var defaultFeatures = await DefaultBlogFeatureProvider.GetDefaultFeaturesAsync(blogId); defaultFeatures.ForEach(x => blogFeatures.AddIfNotContains(x)); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs index 3e15b91117..9a4f627da7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs @@ -34,6 +34,12 @@ namespace Volo.CmsKit.Blogs Check.NotNullOrEmpty(title, nameof(title)); Check.NotNullOrEmpty(slug, nameof(slug)); + /* TODO: BlogRepository.GetAsync already throws the same exception. + So, if you get Blog you don't have to check its existence. + Actually, you SHOULD not check. What if I've created the Blog, but + not saved to database, and I am creating a post inside it in same UOW. + In this case, you throw an unnecessary exception. + */ await CheckBlogExistenceAsync(blog.Id); var blogPost = new BlogPost( diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs index a2cdf68f39..c880b9e5da 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs @@ -6,11 +6,13 @@ namespace Volo.CmsKit.Blogs { public class BlogPostSlugAlreadyExistException : BusinessException { + //TODO: Delete this constructor, not used internal BlogPostSlugAlreadyExistException(string code = null, string message = null, string details = null, Exception innerException = null, Microsoft.Extensions.Logging.LogLevel logLevel = Microsoft.Extensions.Logging.LogLevel.Warning) : base(code, message, details, innerException, logLevel) { } - internal BlogPostSlugAlreadyExistException(SerializationInfo serializationInfo, System.Runtime.Serialization.StreamingContext context) : base(serializationInfo, context) + public BlogPostSlugAlreadyExistException(SerializationInfo serializationInfo, StreamingContext context) + : base(serializationInfo, context) { } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogSlugAlreadyExistException.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogSlugAlreadyExistException.cs index e50f2f623c..1adb95ac33 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogSlugAlreadyExistException.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogSlugAlreadyExistException.cs @@ -8,14 +8,13 @@ namespace Volo.CmsKit.Blogs public class BlogSlugAlreadyExistException : BusinessException { public BlogSlugAlreadyExistException(string slug) + : base(code: CmsKitErrorCodes.Blogs.SlugAlreadyExists) { - Code = CmsKitErrorCodes.Blogs.SlugAlreadyExists; - WithData(nameof(Blog.Slug), slug); } - public BlogSlugAlreadyExistException( - SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context) + public BlogSlugAlreadyExistException(SerializationInfo serializationInfo, StreamingContext context) + : base(serializationInfo, context) { } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Extensions/SlugExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Extensions/SlugExtensions.cs index a625d4687f..4934dc56de 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Extensions/SlugExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Extensions/SlugExtensions.cs @@ -6,7 +6,7 @@ namespace Volo.CmsKit.Blogs.Extensions public static class SlugExtensions { static readonly SlugHelper SlugHelper = new (); - public static string NormalizeSlug(this string value) + public static string NormalizeSlug(this string value) //TODO: Should not be an extension method. { return SlugHelper.GenerateSlug(value?.Unidecode()); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/DefaultMediaDescriptorDefinitionStore.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/DefaultMediaDescriptorDefinitionStore.cs index 752f921da7..e3caed9904 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/DefaultMediaDescriptorDefinitionStore.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/DefaultMediaDescriptorDefinitionStore.cs @@ -29,17 +29,20 @@ namespace Volo.CmsKit.MediaDescriptors { Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); - var result = Options.EntityTypes.SingleOrDefault(x => x.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase)) ?? - throw new EntityCantHaveMediaException(entityType); + var definition = Options.EntityTypes.SingleOrDefault( + x => x.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase) + ) ?? throw new EntityCantHaveMediaException(entityType); - return Task.FromResult(result); + return Task.FromResult(definition); } public virtual Task IsDefinedAsync([NotNull] string entityType) { Check.NotNullOrEmpty(entityType, nameof(entityType)); - var isDefined = Options.EntityTypes.Any(a => a.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase)); + var isDefined = Options.EntityTypes.Any( + a => a.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase) + ); return Task.FromResult(isDefined); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/EntityCantHaveMediaException.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/EntityCantHaveMediaException.cs index 29d60126a1..911e8d2366 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/EntityCantHaveMediaException.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/EntityCantHaveMediaException.cs @@ -9,10 +9,10 @@ namespace Volo.CmsKit.MediaDescriptors { } - public EntityCantHaveMediaException(string entityType) + public EntityCantHaveMediaException(string entityType) + : base(code: CmsKitErrorCodes.MediaDescriptors.EntityTypeDoesntExist) { EntityType = entityType; - Code = CmsKitErrorCodes.MediaDescriptors.EntityTypeDoesntExist; WithData(nameof(entityType), EntityType); } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs index 81cc527800..e6e35720f6 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs @@ -33,7 +33,7 @@ namespace Volo.CmsKit.Blogs blogPost.Author = await (await GetDbContextAsync()) .Set() - .FirstOrDefaultAsync(x =>x.Id == blogPost.AuthorId); + .FirstOrDefaultAsync(x =>x.Id == blogPost.AuthorId, GetCancellationToken(cancellationToken)); return blogPost; } From b5b9fa5b1c72afeb4512305777491022d958ae6e Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 5 Mar 2021 16:19:53 +0300 Subject: [PATCH 02/15] CmsKit - Refactor BlogFeature Permission placement in AppService --- .../Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs index 3ffaeca4a6..51d1332127 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs @@ -1,12 +1,9 @@ using Microsoft.AspNetCore.Authorization; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; using Volo.Abp.EventBus.Distributed; using Volo.Abp.GlobalFeatures; -using Volo.CmsKit.Admin.Blogs; using Volo.CmsKit.Blogs; using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.Permissions; @@ -14,6 +11,7 @@ using Volo.CmsKit.Permissions; namespace Volo.CmsKit.Admin.Blogs { [RequiresGlobalFeature(typeof(BlogsFeature))] + [Authorize(CmsKitAdminPermissions.Blogs.Features)] public class BlogFeatureAdminAppService : CmsKitAdminAppServiceBase, IBlogFeatureAdminAppService { protected IBlogFeatureRepository BlogFeatureRepository { get; } @@ -32,7 +30,6 @@ namespace Volo.CmsKit.Admin.Blogs EventBus = eventBus; } - [Authorize(CmsKitAdminPermissions.Blogs.Features)] //TODO: Move to the class level (all methods check the same permission)? public virtual async Task> GetListAsync(Guid blogId) { var blogFeatures = await BlogFeatureManager.GetListAsync(blogId); @@ -40,7 +37,6 @@ namespace Volo.CmsKit.Admin.Blogs return ObjectMapper.Map, List>(blogFeatures); } - [Authorize(CmsKitAdminPermissions.Blogs.Features)] public virtual Task SetAsync(Guid blogId, BlogFeatureInputDto dto) { return BlogFeatureManager.SetAsync(blogId, dto.FeatureName, dto.IsEnabled); From b057109fad451856766f28400c9d0cc7d8fd4a1a Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 5 Mar 2021 17:27:45 +0300 Subject: [PATCH 03/15] CmsKit - Add page manager --- .../CmsKit/Admin/Pages/PageAdminAppService.cs | 30 +++----- .../Volo/CmsKit/Pages/Page.cs | 4 +- .../Volo/CmsKit/Pages/PageManager.cs | 56 +++++++++++++++ .../Pages/PageManager_Test.cs | 70 +++++++++++++++++++ 4 files changed, 137 insertions(+), 23 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs create mode 100644 modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs index 18e57f0f23..3d025d1463 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs @@ -16,10 +16,15 @@ namespace Volo.CmsKit.Admin.Pages public class PageAdminAppService : CmsKitAdminAppServiceBase, IPageAdminAppService { protected IPageRepository PageRepository { get; } - - public PageAdminAppService(IPageRepository pageRepository) + + protected PageManager PageManager { get; } + + public PageAdminAppService( + IPageRepository pageRepository, + PageManager pageManager) { PageRepository = pageRepository; + PageManager = pageManager; } public virtual async Task GetAsync(Guid id) @@ -48,11 +53,7 @@ namespace Volo.CmsKit.Admin.Pages [Authorize(CmsKitAdminPermissions.Pages.Create)] public virtual async Task CreateAsync(CreatePageInputDto input) { - /* TODO: This should be in a domain service, like PageManager.CreateAsync(...) - Otherwise, we can't ensure the slug check is applied. - The same pattern is already done for BlogManager */ - await CheckPageSlugAsync(input.Slug); - var page = new Page(GuidGenerator.Create(), input.Title, input.Slug, input.Content, CurrentTenant.Id); + var page = await PageManager.CreateAsync(input.Title, input.Slug, input.Content); await PageRepository.InsertAsync(page); @@ -64,12 +65,7 @@ namespace Volo.CmsKit.Admin.Pages { var page = await PageRepository.GetAsync(id); - if (page.Slug != input.Slug) - { - /* TODO: This should be in a domain service, like PageManager.SetSlugAsync(page, input.Slug) */ - await CheckPageSlugAsync(input.Slug); - page.SetSlug(input.Slug); - } + await PageManager.SetSlugAsync(page, input.Slug); page.SetTitle(input.Title); page.SetContent(input.Content); @@ -84,13 +80,5 @@ namespace Volo.CmsKit.Admin.Pages { await PageRepository.DeleteAsync(id); } - - protected virtual async Task CheckPageSlugAsync(string slug) - { - if (await PageRepository.ExistsAsync(slug)) - { - throw new PageSlugAlreadyExistsException(slug); - } - } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs index dd759ebd08..409d504952 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs @@ -20,7 +20,7 @@ namespace Volo.CmsKit.Pages { } - public Page(Guid id, [NotNull] string title, [NotNull] string slug, string content = null, Guid? tenantId = null) : base(id) + internal Page(Guid id, [NotNull] string title, [NotNull] string slug, string content = null, Guid? tenantId = null) : base(id) { TenantId = tenantId; @@ -34,7 +34,7 @@ namespace Volo.CmsKit.Pages Title = Check.NotNullOrEmpty(title, nameof(title), PageConsts.MaxTitleLength); } - public virtual void SetSlug(string slug) + internal virtual void SetSlug(string slug) { Slug = Check.NotNullOrEmpty(slug, nameof(slug), PageConsts.MaxSlugLength); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs new file mode 100644 index 0000000000..c150e69e52 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs @@ -0,0 +1,56 @@ +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.Domain.Services; + +namespace Volo.CmsKit.Pages +{ + public class PageManager : DomainService + { + protected IPageRepository PageRepository { get; } + + public PageManager(IPageRepository pageRepository) + { + PageRepository = pageRepository; + } + + public virtual async Task CreateAsync( + [NotNull] string title, + [NotNull] string slug, + [CanBeNull] string content = null) + { + Check.NotNullOrEmpty(title, nameof(title)); + Check.NotNullOrEmpty(slug, nameof(slug)); + + await CheckPageSlugAsync(slug); + + return new Page( + GuidGenerator.Create(), + title, + slug, + content, + CurrentTenant.Id); + } + + public virtual async Task SetSlugAsync(Page page, string newSlug) + { + if (page.Slug != newSlug) + { + await CheckPageSlugAsync(newSlug); + page.SetSlug(newSlug); + } + } + + protected virtual async Task CheckPageSlugAsync(string slug) + { + if (await PageRepository.ExistsAsync(slug)) + { + throw new PageSlugAlreadyExistsException(slug); + } + } + } +} diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs new file mode 100644 index 0000000000..10dc874399 --- /dev/null +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs @@ -0,0 +1,70 @@ +using Shouldly; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Volo.CmsKit.Pages +{ + public class PageManager_Test : CmsKitDomainTestBase + { + private readonly PageManager pageManager; + private readonly CmsKitTestData testData; + private readonly IPageRepository pageRepository; + + public PageManager_Test() + { + pageManager = GetRequiredService(); + testData = GetRequiredService(); + pageRepository = GetRequiredService(); + } + + public async Task CreateAsync_ShouldWorkProperly_WithNonExistingSlug() + { + var title = "My awesome page"; + var slug = "my-awesome-page"; + var content = "

My Awesome Page

This is my awesome page content!

"; + + var page = await pageManager.CreateAsync(title, slug, content); + + page.ShouldNotBeNull(); + page.Title.ShouldBe(title); + page.Slug.ShouldBe(slug); + page.Content.ShouldBe(content); + } + + public async Task CreateAsync_ShouldThrowException_WithExistingSlug() + { + var title = "My awesome page"; + var slug = testData.Page_1_Slug; + var content = "

My Awesome Page

This is my awesome page content!

"; + + var exception = await Should.ThrowAsync(async () => + await pageManager.CreateAsync(title, slug, content)); + + exception.ShouldNotBeNull(); + } + + public async Task SetSlugAsync_ShouldWorkProperly_WithNonExistingSlug() + { + var newSlug = "freshly-generated-new-slug"; + var page = await pageRepository.GetAsync(testData.Page_1_Id); + + await pageManager.SetSlugAsync(page, newSlug); + + page.Slug.ShouldBe(newSlug); + } + + public async Task SetSlugAsync_ShouldThrowException_WithExistingSlug() + { + var newSlug = testData.Page_2_Slug; + var page = await pageRepository.GetAsync(testData.Page_1_Id); + + var exception = await Should.ThrowAsync(async () => + await pageManager.SetSlugAsync(page, newSlug)); + + exception.ShouldNotBeNull(); + } + } +} From 4939388cc9f184f47d5238fc81b26b1a8ff8b22c Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 5 Mar 2021 17:28:38 +0300 Subject: [PATCH 04/15] CmsKit - Remove unused Error codes --- .../Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs index 8ceeb7c924..39e9ba4784 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs @@ -8,9 +8,6 @@ public const string EntityNotTaggable = "CmsKit:Tag:0002"; } - // TODO: Unused? Remove, if so. - public const string ContentAlreadyExist = "CmsKit:0002"; - public static class Pages { public const string SlugAlreadyExist = "CmsKit:Page:0001"; From 8592b7039521520cc3bf9eb1a43b60f35170bca6 Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 5 Mar 2021 17:35:43 +0300 Subject: [PATCH 05/15] CmsKit - Remove unnecessary Blog Existence check in BlogPostManager --- .../Volo/CmsKit/Blogs/BlogPostManager.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs index 9a4f627da7..05241bab48 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs @@ -34,14 +34,6 @@ namespace Volo.CmsKit.Blogs Check.NotNullOrEmpty(title, nameof(title)); Check.NotNullOrEmpty(slug, nameof(slug)); - /* TODO: BlogRepository.GetAsync already throws the same exception. - So, if you get Blog you don't have to check its existence. - Actually, you SHOULD not check. What if I've created the Blog, but - not saved to database, and I am creating a post inside it in same UOW. - In this case, you throw an unnecessary exception. - */ - await CheckBlogExistenceAsync(blog.Id); - var blogPost = new BlogPost( GuidGenerator.Create(), blog.Id, From 1350a1c97b05e854cdb367fb476073b6a8518e0a Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 5 Mar 2021 17:36:18 +0300 Subject: [PATCH 06/15] CmsKit - Remove unused ctor of BlogPostSlugAlreadyExistException --- .../Volo/CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs index c880b9e5da..16fae16735 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs @@ -6,11 +6,6 @@ namespace Volo.CmsKit.Blogs { public class BlogPostSlugAlreadyExistException : BusinessException { - //TODO: Delete this constructor, not used - internal BlogPostSlugAlreadyExistException(string code = null, string message = null, string details = null, Exception innerException = null, Microsoft.Extensions.Logging.LogLevel logLevel = Microsoft.Extensions.Logging.LogLevel.Warning) : base(code, message, details, innerException, logLevel) - { - } - public BlogPostSlugAlreadyExistException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context) { From 060c0c2d8d40d6e511bc0680fce3a110c5e5b13c Mon Sep 17 00:00:00 2001 From: enisn Date: Mon, 8 Mar 2021 09:53:05 +0300 Subject: [PATCH 07/15] CmsKit - Remove IEqulityComparer from BlogFeature --- .../Volo/CmsKit/Blogs/BlogFeature.cs | 13 +------------ .../CmsKit/Blogs/BlogFeatureEqualityComparer.cs | 17 +++++++++++++++++ .../Volo/CmsKit/Blogs/BlogFeatureManager.cs | 5 +++-- 3 files changed, 21 insertions(+), 14 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureEqualityComparer.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs index ff73a798cb..e1bb05fa3f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs @@ -5,7 +5,7 @@ using Volo.Abp.Domain.Entities.Auditing; namespace Volo.CmsKit.Blogs { - public class BlogFeature : FullAuditedAggregateRoot, IEquatable + public class BlogFeature : FullAuditedAggregateRoot { public Guid BlogId { get; protected set; } @@ -19,16 +19,5 @@ namespace Volo.CmsKit.Blogs FeatureName = Check.NotNullOrWhiteSpace(featureName, nameof(featureName)); IsEnabled = isEnabled; } - - /* - TODO: Overriding Equals is not a good practice for entities (see https://github.com/abpframework/abp/issues/1728) - Also, the implementation is not a true equal implementation. It just special comparison for a specific case - (used in BlogFeatureManager.GetListAsync). Remove Equals and just do the logic in-place, or create a static - method like BlogFeature.IsSameBlogFeature(BlogFeature other). - */ - public bool Equals(BlogFeature other) - { - return BlogId == other?.BlogId && FeatureName == other?.FeatureName; - } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureEqualityComparer.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureEqualityComparer.cs new file mode 100644 index 0000000000..7037148bc9 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureEqualityComparer.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace Volo.CmsKit.Blogs +{ + public class BlogFeatureEqualityComparer : IEqualityComparer + { + public bool Equals(BlogFeature x, BlogFeature y) + { + return x?.BlogId == y?.BlogId && x?.FeatureName == y?.FeatureName; + } + + public int GetHashCode(BlogFeature obj) + { + return obj.GetHashCode(); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs index f9f4efd37a..e92e795864 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Volo.Abp.Domain.Services; @@ -30,9 +31,9 @@ namespace Volo.CmsKit.Blogs */ var defaultFeatures = await DefaultBlogFeatureProvider.GetDefaultFeaturesAsync(blogId); - defaultFeatures.ForEach(x => blogFeatures.AddIfNotContains(x)); + defaultFeatures.ForEach(x => blogFeatures.Add(x)); - return blogFeatures; + return blogFeatures.Distinct(new BlogFeatureEqualityComparer()).ToList(); } public async Task SetAsync(Guid blogId, string featureName, bool isEnabled) From 5f67166daedc84a2e2f96310e4d43fe842754428 Mon Sep 17 00:00:00 2001 From: enisn Date: Mon, 8 Mar 2021 09:53:25 +0300 Subject: [PATCH 08/15] CmsKit - Remove ContentConsts --- .../Volo/CmsKit/Contents/ContentConsts.cs | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Contents/ContentConsts.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Contents/ContentConsts.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Contents/ContentConsts.cs deleted file mode 100644 index d6d69a6a39..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Contents/ContentConsts.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using Volo.CmsKit.Entities; - -namespace Volo.CmsKit.Contents -{ - public static class ContentConsts - { - public static int MaxEntityTypeLength { get; set; } = CmsEntityConsts.MaxEntityTypeLength; - - public static int MaxEntityIdLength { get; set; } = CmsEntityConsts.MaxEntityIdLength; - - // TODO: consider - public static int MaxValueLength { get; set; } = int.MaxValue; - } -} \ No newline at end of file From 816b7eca880463e9390de5c6251147bc707b2845 Mon Sep 17 00:00:00 2001 From: enisn Date: Mon, 8 Mar 2021 10:11:31 +0300 Subject: [PATCH 09/15] CmsKit - Convert Slug Normalizataion to static method from extension method --- .../CmsKit/Admin/Pages/CreatePageInputDto.cs | 1 - .../CmsKit/Admin/Pages/UpdatePageInputDto.cs | 1 - ...msKitCommonApplicationAutoMapperProfile.cs | 2 -- .../Volo/CmsKit/Blogs/Blog.cs | 3 +-- .../Volo/CmsKit/Blogs/BlogPost.cs | 3 +-- .../Volo/CmsKit/Blogs/BlogPostManager.cs | 6 ++++- .../SlugExtensions.cs => SlugNormalizer.cs} | 6 ++--- .../CmsKitEntityFrameworkCoreModule.cs | 1 - .../CmsKit/MongoDB/CmsKitMongoDbContext.cs | 3 +-- .../MongoDB/CmsKitMongoDbContextExtensions.cs | 3 +-- .../CmsKit/MongoDB/ICmsKitMongoDbContext.cs | 3 +-- .../Pages/PageAdminAppService_Tests.cs | 6 ++--- .../Blogs/SlugExtensions_Tests.cs | 27 +++++++------------ 13 files changed, 25 insertions(+), 40 deletions(-) rename modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/{Blogs/Extensions/SlugExtensions.cs => SlugNormalizer.cs} (51%) diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/CreatePageInputDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/CreatePageInputDto.cs index 174278d829..24d5c1d894 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/CreatePageInputDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/CreatePageInputDto.cs @@ -1,7 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; using Volo.Abp.Validation; -using Volo.CmsKit.Contents; using Volo.CmsKit.Pages; namespace Volo.CmsKit.Admin.Pages diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs index eff3cb2919..58dbd71516 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs @@ -1,7 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; using Volo.Abp.Validation; -using Volo.CmsKit.Contents; using Volo.CmsKit.Pages; namespace Volo.CmsKit.Admin.Pages diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/CmsKitCommonApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/CmsKitCommonApplicationAutoMapperProfile.cs index 976a3d0e4e..aff12d05c1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/CmsKitCommonApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/CmsKitCommonApplicationAutoMapperProfile.cs @@ -1,7 +1,5 @@ using AutoMapper; using Volo.CmsKit.Blogs; -using Volo.CmsKit.Contents; -using Volo.CmsKit.Pages; using Volo.CmsKit.Tags; using Volo.CmsKit.Users; diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Blog.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Blog.cs index 7a63e7dbf7..9d800abbdb 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Blog.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Blog.cs @@ -3,7 +3,6 @@ using System; using Volo.Abp; using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.MultiTenancy; -using Volo.CmsKit.Blogs.Extensions; namespace Volo.CmsKit.Blogs { @@ -38,7 +37,7 @@ namespace Volo.CmsKit.Blogs { Check.NotNullOrWhiteSpace(slug, nameof(slug), BlogConsts.MaxNameLength); - Slug = slug.NormalizeSlug(); + Slug = SlugNormalizer.Normalize(slug); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs index 251a9c2895..4f45894af8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs @@ -3,7 +3,6 @@ using System; using Volo.Abp; using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.MultiTenancy; -using Volo.CmsKit.Blogs.Extensions; using Volo.CmsKit.Users; namespace Volo.CmsKit.Blogs @@ -61,7 +60,7 @@ namespace Volo.CmsKit.Blogs { Check.NotNullOrWhiteSpace(slug, nameof(slug), BlogPostConsts.MaxSlugLength, BlogPostConsts.MinSlugLength); - Slug = slug.NormalizeSlug(); + Slug = SlugNormalizer.Normalize(slug); } public virtual void SetShortDescription(string shortDescription) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs index 05241bab48..c49c0537b3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs @@ -12,13 +12,17 @@ namespace Volo.CmsKit.Blogs { protected IBlogPostRepository BlogPostRepository { get; } protected IBlogRepository BlogRepository { get; } + protected IDefaultBlogFeatureProvider BlogFeatureProvider { get; } + public BlogPostManager( IBlogPostRepository blogPostRepository, - IBlogRepository blogRepository) + IBlogRepository blogRepository, + IDefaultBlogFeatureProvider blogFeatureProvider) { BlogPostRepository = blogPostRepository; BlogRepository = blogRepository; + BlogFeatureProvider = blogFeatureProvider; } public virtual async Task CreateAsync( diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Extensions/SlugExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/SlugNormalizer.cs similarity index 51% rename from modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Extensions/SlugExtensions.cs rename to modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/SlugNormalizer.cs index 4934dc56de..30b23e4ba4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Extensions/SlugExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/SlugNormalizer.cs @@ -1,12 +1,12 @@ using Slugify; using Unidecode.NET; -namespace Volo.CmsKit.Blogs.Extensions +namespace Volo.CmsKit { - public static class SlugExtensions + public static class SlugNormalizer { static readonly SlugHelper SlugHelper = new (); - public static string NormalizeSlug(this string value) //TODO: Should not be an extension method. + public static string Normalize(string value) { return SlugHelper.GenerateSlug(value?.Unidecode()); } diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs index 0bbb9ea58b..dd8e11f1f0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs @@ -4,7 +4,6 @@ using Volo.Abp.Modularity; using Volo.Abp.Users.EntityFrameworkCore; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; -using Volo.CmsKit.Contents; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Pages; using Volo.CmsKit.Ratings; diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs index 4d8f86b823..7034b37f98 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs @@ -1,9 +1,8 @@ using MongoDB.Driver; using Volo.Abp.Data; using Volo.Abp.MongoDB; -using Volo.CmsKit.Comments; -using Volo.CmsKit.Contents; using Volo.CmsKit.Blogs; +using Volo.CmsKit.Comments; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Pages; using Volo.CmsKit.Ratings; diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs index 8585f988f9..e96ed841a8 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs @@ -1,9 +1,8 @@ using System; using Volo.Abp; using Volo.Abp.MongoDB; -using Volo.CmsKit.Comments; -using Volo.CmsKit.Contents; using Volo.CmsKit.Blogs; +using Volo.CmsKit.Comments; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Pages; using Volo.CmsKit.Ratings; diff --git a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs index 5110bca501..1dbbfc0f98 100644 --- a/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs +++ b/modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs @@ -1,9 +1,8 @@ using MongoDB.Driver; using Volo.Abp.Data; using Volo.Abp.MongoDB; -using Volo.CmsKit.Comments; -using Volo.CmsKit.Contents; using Volo.CmsKit.Blogs; +using Volo.CmsKit.Comments; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Pages; using Volo.CmsKit.Ratings; diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs index 766c482ddd..60ee25f28d 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs @@ -1,10 +1,8 @@ -using System; +using Shouldly; +using System; using System.Linq; using System.Threading.Tasks; -using Shouldly; -using Volo.Abp.Uow; using Volo.CmsKit.Admin.Pages; -using Volo.CmsKit.Contents; using Xunit; namespace Volo.CmsKit.Pages diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/SlugExtensions_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/SlugExtensions_Tests.cs index 3eb7ee52f7..268cfbab71 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/SlugExtensions_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/SlugExtensions_Tests.cs @@ -1,12 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Shouldly; using Xunit; -using Volo.CmsKit.Blogs.Extensions; -using Shouldly; -using Unidecode.NET; namespace Volo.CmsKit.Blogs { @@ -20,7 +13,7 @@ namespace Volo.CmsKit.Blogs var expected = "my-awesome-name"; // Act - var actual = name.NormalizeSlug(); + var actual = SlugNormalizer.Normalize(name); // Assert actual.ShouldBe(expected); @@ -33,7 +26,7 @@ namespace Volo.CmsKit.Blogs var expected = "my-perfect-title-v.2"; // Act - var actual = name.NormalizeSlug(); + var actual = SlugNormalizer.Normalize(name); // Assert actual.ShouldBe(expected); @@ -47,7 +40,7 @@ namespace Volo.CmsKit.Blogs var expected = "are-you-gonna-die"; // Act - var actual = name.NormalizeSlug(); + var actual = SlugNormalizer.Normalize(name); // Assert actual.ShouldBe(expected); @@ -61,7 +54,7 @@ namespace Volo.CmsKit.Blogs var expected = "we-machines-challenge"; // Act - var actual = name.NormalizeSlug(); + var actual = SlugNormalizer.Normalize(name); // Assert actual.ShouldBe(expected); @@ -75,7 +68,7 @@ namespace Volo.CmsKit.Blogs var expected = "go-and-code-part-2"; // Act - var actual = name.NormalizeSlug(); + var actual = SlugNormalizer.Normalize(name); // Assert actual.ShouldBe(expected); @@ -89,7 +82,7 @@ namespace Volo.CmsKit.Blogs var expected = "moe-klassnoe-nazvanie"; // Act - var actual = name.NormalizeSlug(); + var actual = SlugNormalizer.Normalize(name); // Assert actual.ShouldBe(expected); @@ -103,7 +96,7 @@ namespace Volo.CmsKit.Blogs var expected = "ozel-turkce-karakterler-gusioc"; // Act - var actual = name.NormalizeSlug(); + var actual = SlugNormalizer.Normalize(name); // Assert actual.ShouldBe(expected); @@ -117,7 +110,7 @@ namespace Volo.CmsKit.Blogs var expected = "wo-de-zhen-bang-tou-xian"; // Act - var actual = name.NormalizeSlug(); + var actual = SlugNormalizer.Normalize(name); // Assert actual.ShouldBe(expected); @@ -131,7 +124,7 @@ namespace Volo.CmsKit.Blogs var expected = "lets-rock"; // Act - var actual = name.NormalizeSlug(); + var actual = SlugNormalizer.Normalize(name); // Assert actual.ShouldBe(expected); From b3c6cf8b205e94b7a182cc7f231867dd47ecb498 Mon Sep 17 00:00:00 2001 From: enisn Date: Mon, 8 Mar 2021 10:12:30 +0300 Subject: [PATCH 10/15] CmsKit - Remove TagsEnttityType Todo --- .../src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs index cb189571f7..5779106a94 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs @@ -39,11 +39,6 @@ namespace Volo.CmsKit options.Reactions.AddOrReplace(StandardReactions.Pray); }); - - if (GlobalFeatureManager.Instance.IsEnabled()) - { - // TODO: Configure TagEntityTypes here... - } } private static LocalizableString L(string name) From fcb7b21b519dbf8fee5b6a0063f5d0fe4c5a3259 Mon Sep 17 00:00:00 2001 From: enisn Date: Mon, 8 Mar 2021 10:14:34 +0300 Subject: [PATCH 11/15] CmsKit - Add CommentDetailedDto --- .../Comments/{CommentDto.cs => CommentDetailedDto.cs} | 4 ++-- .../CmsKit/Public/Comments/CommentWithDetailsDto.cs | 2 +- .../CmsKit/Public/Comments/ICommentPublicAppService.cs | 4 ++-- .../CmsKit/Public/Comments/CommentPublicAppService.cs | 10 +++++----- .../Public/PublicApplicationAutoMapperProfile.cs | 2 +- .../CmsKit/Public/Comments/CommentPublicController.cs | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) rename modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/{CommentDto.cs => CommentDetailedDto.cs} (67%) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDetailedDto.cs similarity index 67% rename from modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs rename to modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDetailedDto.cs index 0c6e2a21bf..e1098aefe7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDetailedDto.cs @@ -3,7 +3,7 @@ namespace Volo.CmsKit.Public.Comments { [Serializable] - public class CommentDto + public class CommentDetailedDto { public Guid Id { get; set; } @@ -19,6 +19,6 @@ namespace Volo.CmsKit.Public.Comments public DateTime CreationTime { get; set; } - public CmsUserDto Author { get; set; } //TODO: Should only have AuthorId for the basic dto. see https://docs.abp.io/en/abp/latest/Best-Practices/Application-Services + public CmsUserDto Author { get; set; } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs index 3c5b074a86..5bc6a923b1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs @@ -18,7 +18,7 @@ namespace Volo.CmsKit.Public.Comments public DateTime CreationTime { get; set; } - public List Replies { get; set; } + public List Replies { get; set; } public CmsUserDto Author { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs index 8ac8c92988..f441de78cc 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs @@ -9,9 +9,9 @@ namespace Volo.CmsKit.Public.Comments { Task> GetListAsync(string entityType, string entityId); - Task CreateAsync(string entityType, string entityId, CreateCommentInput input); + Task CreateAsync(string entityType, string entityId, CreateCommentInput input); - Task UpdateAsync(Guid id, UpdateCommentInput input); + Task UpdateAsync(Guid id, UpdateCommentInput input); Task DeleteAsync(Guid id); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs index d5dd555b71..e67de25b5a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs @@ -48,7 +48,7 @@ namespace Volo.CmsKit.Public.Comments } [Authorize] - public virtual async Task CreateAsync(string entityType, string entityId, CreateCommentInput input) + public virtual async Task CreateAsync(string entityType, string entityId, CreateCommentInput input) { var user = await CmsUserLookupService.GetByIdAsync(CurrentUser.GetId()); @@ -75,11 +75,11 @@ namespace Volo.CmsKit.Public.Comments Id = comment.Id }); - return ObjectMapper.Map(comment); + return ObjectMapper.Map(comment); } [Authorize] - public virtual async Task UpdateAsync(Guid id, UpdateCommentInput input) + public virtual async Task UpdateAsync(Guid id, UpdateCommentInput input) { var comment = await CommentRepository.GetAsync(id); @@ -92,7 +92,7 @@ namespace Volo.CmsKit.Public.Comments var updatedComment = await CommentRepository.UpdateAsync(comment); - return ObjectMapper.Map(updatedComment); + return ObjectMapper.Map(updatedComment); } [Authorize] @@ -123,7 +123,7 @@ namespace Volo.CmsKit.Public.Comments parentComment.Replies = comments .Where(c => c.Comment.RepliedCommentId == parentComment.Id) - .Select(c => ObjectMapper.Map(c.Comment)) + .Select(c => ObjectMapper.Map(c.Comment)) .ToList(); foreach (var reply in parentComment.Replies) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs index b8684f2463..6166c0a9d9 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs @@ -18,7 +18,7 @@ namespace Volo.CmsKit.Public { CreateMap(); - CreateMap() + CreateMap() .Ignore(x=> x.Author); CreateMap() diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs index 1b5b2cc64d..8bd78a38d4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs @@ -30,14 +30,14 @@ namespace Volo.CmsKit.Public.Comments [HttpPost] [Route("{entityType}/{entityId}")] - public Task CreateAsync(string entityType, string entityId, CreateCommentInput input) + public Task CreateAsync(string entityType, string entityId, CreateCommentInput input) { return CommentPublicAppService.CreateAsync(entityType, entityId, input); } [HttpPut] [Route("{id}")] - public Task UpdateAsync(Guid id, UpdateCommentInput input) + public Task UpdateAsync(Guid id, UpdateCommentInput input) { return CommentPublicAppService.UpdateAsync(id, input); } From 8052b3524933cbf84cbdf67651e813ed4686a265 Mon Sep 17 00:00:00 2001 From: enisn Date: Mon, 8 Mar 2021 10:27:08 +0300 Subject: [PATCH 12/15] Revert "CmsKit - Add CommentDetailedDto" This reverts commit fcb7b21b519dbf8fee5b6a0063f5d0fe4c5a3259. --- .../Comments/{CommentDetailedDto.cs => CommentDto.cs} | 4 ++-- .../CmsKit/Public/Comments/CommentWithDetailsDto.cs | 2 +- .../CmsKit/Public/Comments/ICommentPublicAppService.cs | 4 ++-- .../CmsKit/Public/Comments/CommentPublicAppService.cs | 10 +++++----- .../Public/PublicApplicationAutoMapperProfile.cs | 2 +- .../CmsKit/Public/Comments/CommentPublicController.cs | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) rename modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/{CommentDetailedDto.cs => CommentDto.cs} (67%) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDetailedDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs similarity index 67% rename from modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDetailedDto.cs rename to modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs index e1098aefe7..0c6e2a21bf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDetailedDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentDto.cs @@ -3,7 +3,7 @@ namespace Volo.CmsKit.Public.Comments { [Serializable] - public class CommentDetailedDto + public class CommentDto { public Guid Id { get; set; } @@ -19,6 +19,6 @@ namespace Volo.CmsKit.Public.Comments public DateTime CreationTime { get; set; } - public CmsUserDto Author { get; set; } + public CmsUserDto Author { get; set; } //TODO: Should only have AuthorId for the basic dto. see https://docs.abp.io/en/abp/latest/Best-Practices/Application-Services } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs index 5bc6a923b1..3c5b074a86 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CommentWithDetailsDto.cs @@ -18,7 +18,7 @@ namespace Volo.CmsKit.Public.Comments public DateTime CreationTime { get; set; } - public List Replies { get; set; } + public List Replies { get; set; } public CmsUserDto Author { get; set; } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs index f441de78cc..8ac8c92988 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/ICommentPublicAppService.cs @@ -9,9 +9,9 @@ namespace Volo.CmsKit.Public.Comments { Task> GetListAsync(string entityType, string entityId); - Task CreateAsync(string entityType, string entityId, CreateCommentInput input); + Task CreateAsync(string entityType, string entityId, CreateCommentInput input); - Task UpdateAsync(Guid id, UpdateCommentInput input); + Task UpdateAsync(Guid id, UpdateCommentInput input); Task DeleteAsync(Guid id); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs index e67de25b5a..d5dd555b71 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs @@ -48,7 +48,7 @@ namespace Volo.CmsKit.Public.Comments } [Authorize] - public virtual async Task CreateAsync(string entityType, string entityId, CreateCommentInput input) + public virtual async Task CreateAsync(string entityType, string entityId, CreateCommentInput input) { var user = await CmsUserLookupService.GetByIdAsync(CurrentUser.GetId()); @@ -75,11 +75,11 @@ namespace Volo.CmsKit.Public.Comments Id = comment.Id }); - return ObjectMapper.Map(comment); + return ObjectMapper.Map(comment); } [Authorize] - public virtual async Task UpdateAsync(Guid id, UpdateCommentInput input) + public virtual async Task UpdateAsync(Guid id, UpdateCommentInput input) { var comment = await CommentRepository.GetAsync(id); @@ -92,7 +92,7 @@ namespace Volo.CmsKit.Public.Comments var updatedComment = await CommentRepository.UpdateAsync(comment); - return ObjectMapper.Map(updatedComment); + return ObjectMapper.Map(updatedComment); } [Authorize] @@ -123,7 +123,7 @@ namespace Volo.CmsKit.Public.Comments parentComment.Replies = comments .Where(c => c.Comment.RepliedCommentId == parentComment.Id) - .Select(c => ObjectMapper.Map(c.Comment)) + .Select(c => ObjectMapper.Map(c.Comment)) .ToList(); foreach (var reply in parentComment.Replies) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs index 6166c0a9d9..b8684f2463 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/PublicApplicationAutoMapperProfile.cs @@ -18,7 +18,7 @@ namespace Volo.CmsKit.Public { CreateMap(); - CreateMap() + CreateMap() .Ignore(x=> x.Author); CreateMap() diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs index 8bd78a38d4..1b5b2cc64d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.HttpApi/Volo/CmsKit/Public/Comments/CommentPublicController.cs @@ -30,14 +30,14 @@ namespace Volo.CmsKit.Public.Comments [HttpPost] [Route("{entityType}/{entityId}")] - public Task CreateAsync(string entityType, string entityId, CreateCommentInput input) + public Task CreateAsync(string entityType, string entityId, CreateCommentInput input) { return CommentPublicAppService.CreateAsync(entityType, entityId, input); } [HttpPut] [Route("{id}")] - public Task UpdateAsync(Guid id, UpdateCommentInput input) + public Task UpdateAsync(Guid id, UpdateCommentInput input) { return CommentPublicAppService.UpdateAsync(id, input); } From 1074aff04366bf45126f2e4a0a3430bb2aeadc7c Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 9 Mar 2021 11:53:24 +0300 Subject: [PATCH 13/15] CmsKit - Refactor default blog features --- .../CmsKit/Admin/Blogs/BlogAdminAppService.cs | 15 ++++++++--- .../Admin/Blogs/BlogFeatureAdminAppService.cs | 2 +- .../Blogs/BlogFeatureEqualityComparer.cs | 17 ------------ .../Volo/CmsKit/Blogs/BlogFeatureManager.cs | 26 +++++++------------ 4 files changed, 22 insertions(+), 38 deletions(-) delete mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureEqualityComparer.cs diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs index 574f6f737a..a803ea8695 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs @@ -16,13 +16,18 @@ namespace Volo.CmsKit.Admin.Blogs { protected IBlogRepository BlogRepository { get; } protected BlogManager BlogManager { get; } - - public BlogAdminAppService(IBlogRepository blogRepository, BlogManager blogManager) + protected BlogFeatureManager BlogFeatureManager{ get; } + + public BlogAdminAppService( + IBlogRepository blogRepository, + BlogManager blogManager, + BlogFeatureManager blogFeatureManager = null) { BlogRepository = blogRepository; BlogManager = blogManager; + BlogFeatureManager = blogFeatureManager; } - + public virtual async Task GetAsync(Guid id) { var blog = await BlogRepository.GetAsync(id); @@ -48,7 +53,9 @@ namespace Volo.CmsKit.Admin.Blogs { var blog = await BlogManager.CreateAsync(input.Name, input.Slug); - await BlogRepository.InsertAsync(blog); + await BlogRepository.InsertAsync(blog, autoSave: true); + + await BlogFeatureManager.SetDefaultsAsync(blog.Id); return ObjectMapper.Map(blog); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs index 51d1332127..a0ba1c460e 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs @@ -32,7 +32,7 @@ namespace Volo.CmsKit.Admin.Blogs public virtual async Task> GetListAsync(Guid blogId) { - var blogFeatures = await BlogFeatureManager.GetListAsync(blogId); + var blogFeatures = await BlogFeatureRepository.GetListAsync(blogId); return ObjectMapper.Map, List>(blogFeatures); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureEqualityComparer.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureEqualityComparer.cs deleted file mode 100644 index 7037148bc9..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureEqualityComparer.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; - -namespace Volo.CmsKit.Blogs -{ - public class BlogFeatureEqualityComparer : IEqualityComparer - { - public bool Equals(BlogFeature x, BlogFeature y) - { - return x?.BlogId == y?.BlogId && x?.FeatureName == y?.FeatureName; - } - - public int GetHashCode(BlogFeature obj) - { - return obj.GetHashCode(); - } - } -} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs index e92e795864..cea6d894f0 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs @@ -20,22 +20,6 @@ namespace Volo.CmsKit.Blogs DefaultBlogFeatureProvider = defaultBlogFeatureProvider; } - public async Task> GetListAsync(Guid blogId) - { - var blogFeatures = await BlogFeatureRepository.GetListAsync(blogId); - - /* TODO: Creating transient entities in DefaultBlogFeatureProvider.GetDefaultFeaturesAsync - is not a good idea. Returned list will contain mixed (some in db some in-memory). - For example, if I delete/update one of the BlogFeature comes from in-memory, - I will have an strange behaviour. You should find another way. - */ - var defaultFeatures = await DefaultBlogFeatureProvider.GetDefaultFeaturesAsync(blogId); - - defaultFeatures.ForEach(x => blogFeatures.Add(x)); - - return blogFeatures.Distinct(new BlogFeatureEqualityComparer()).ToList(); - } - public async Task SetAsync(Guid blogId, string featureName, bool isEnabled) { var blogFeature = await BlogFeatureRepository.FindAsync(blogId, featureName); @@ -50,5 +34,15 @@ namespace Volo.CmsKit.Blogs await BlogFeatureRepository.UpdateAsync(blogFeature); } } + + public async Task SetDefaultsAsync(Guid blogId) + { + var defaultFeatures = await DefaultBlogFeatureProvider.GetDefaultFeaturesAsync(blogId); + + foreach (var feature in defaultFeatures) + { + await SetAsync(blogId, feature.FeatureName, isEnabled: true); + } + } } } From 65608b31cefc98062fe247a405f20a627d2552de Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 9 Mar 2021 12:16:07 +0300 Subject: [PATCH 14/15] CmsKit - Update tests --- .../Blogs/BlogFeatureAdminAppService_Test.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs index 54ce2d6de5..56bf3d2cd3 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs @@ -61,7 +61,7 @@ namespace Volo.CmsKit.Blogs result.ShouldNotBeNull(); result.ShouldNotBeEmpty(); - result.Count.ShouldBeGreaterThan(2); // 2 are seeded and there are built-in Features. + result.Count.ShouldBeGreaterThanOrEqualTo(2); // 2 are seeded and there are built-in Features. } } } From 6a67bce1014f855ec434bd58236faf9ff302837f Mon Sep 17 00:00:00 2001 From: enisn Date: Tue, 9 Mar 2021 13:25:50 +0300 Subject: [PATCH 15/15] CmsKit - Convert BusinessExceptions to AbpAuthorizationException --- .../Volo/CmsKit/Public/Comments/CommentPublicAppService.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs index d5dd555b71..f716660d23 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.Options; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; +using Volo.Abp.Authorization; using Volo.Abp.EventBus.Distributed; using Volo.Abp.Uow; using Volo.Abp.Users; @@ -85,7 +86,7 @@ namespace Volo.CmsKit.Public.Comments if (comment.CreatorId != CurrentUser.GetId()) { - throw new BusinessException(); //TODO: AbpAuthorizationException! + throw new AbpAuthorizationException(); } comment.SetText(input.Text); @@ -102,7 +103,7 @@ namespace Volo.CmsKit.Public.Comments if (comment.CreatorId != CurrentUser.GetId()) { - throw new BusinessException(); //TODO: AbpAuthorizationException! + throw new AbpAuthorizationException(); } await CommentRepository.DeleteWithRepliesAsync(comment);