From 73fc328fd6e5108e2e47ec682a00fda923021a6c Mon Sep 17 00:00:00 2001 From: Ahmet Date: Wed, 24 Feb 2021 12:32:30 +0300 Subject: [PATCH] refactored blog admin app service and added blog manager --- .../CmsKit/Admin/Blogs/BlogAdminAppService.cs | 69 ++++++++++++++----- .../Volo/CmsKit/CmsKitErrorCodes.cs | 5 ++ .../CmsKit/Localization/Resources/en.json | 1 + .../Volo/CmsKit/Blogs/BlogManager.cs | 46 +++++++++++++ .../BlogPostSlugAlreadyExistException.cs | 2 +- .../Blogs/BlogSlugAlreadyExistException.cs | 22 ++++++ .../Volo/CmsKit/Blogs/IBlogRepository.cs | 19 ++++- 7 files changed, 146 insertions(+), 18 deletions(-) create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogManager.cs create mode 100644 modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogSlugAlreadyExistException.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 5c833f5256..4f0d93d015 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 @@ -1,10 +1,8 @@ using Microsoft.AspNetCore.Authorization; using System; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; -using Volo.Abp.Application.Services; -using Volo.Abp.Domain.Repositories; +using Volo.Abp.Application.Dtos; using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Blogs; using Volo.CmsKit.GlobalFeatures; @@ -14,24 +12,63 @@ namespace Volo.CmsKit.Admin.Blogs { [RequiresGlobalFeature(typeof(BlogsFeature))] [Authorize(CmsKitAdminPermissions.Blogs.Default)] - public class BlogAdminAppService : CrudAppService, IBlogAdminAppService + public class BlogAdminAppService : CmsKitAdminAppServiceBase, IBlogAdminAppService { - public BlogAdminAppService(IRepository repository) : base(repository) + protected IBlogRepository BlogRepository { get; } + protected BlogManager BlogManager { get; } + + public BlogAdminAppService(IBlogRepository blogRepository, BlogManager blogManager) { - GetListPolicyName = CmsKitAdminPermissions.Blogs.Default; - GetPolicyName = CmsKitAdminPermissions.Blogs.Default; - CreatePolicyName = CmsKitAdminPermissions.Blogs.Create; - UpdatePolicyName = CmsKitAdminPermissions.Blogs.Update; - DeletePolicyName = CmsKitAdminPermissions.Blogs.Delete; + BlogRepository = blogRepository; + BlogManager = blogManager; + } + + public virtual async Task GetAsync(Guid id) + { + var blog = await BlogRepository.GetAsync(id); + + return ObjectMapper.Map(blog); + } + + public virtual async Task> GetListAsync(BlogGetListInput input) + { + var totalCount = await BlogRepository.GetCountAsync(input.Filter); + + var blogs = await BlogRepository.GetListAsync( + input.Filter, + input.Sorting, + input.MaxResultCount, + input.SkipCount); + + return new PagedResultDto(totalCount, ObjectMapper.Map, List>(blogs)); + } + + [Authorize(CmsKitAdminPermissions.Blogs.Create)] + public virtual async Task CreateAsync(BlogDto input) + { + var blog = await BlogManager.CreateAsync(input.Name, input.Slug); + + await BlogRepository.InsertAsync(blog); + + return ObjectMapper.Map(blog); + } + + [Authorize(CmsKitAdminPermissions.Blogs.Update)] + public virtual async Task UpdateAsync(Guid id, BlogDto input) + { + var blog = await BlogRepository.GetAsync(id); + + blog = await BlogManager.UpdateAsync(blog, input.Name, input.Slug); + + await BlogRepository.UpdateAsync(blog); + + return ObjectMapper.Map(blog); } - protected override async Task> CreateFilteredQueryAsync(BlogGetListInput input) + [Authorize(CmsKitAdminPermissions.Blogs.Delete)] + public virtual Task DeleteAsync(Guid id) { - var queryable = await base.CreateFilteredQueryAsync(input); - return queryable - .WhereIf( - !input.Filter.IsNullOrWhiteSpace(), - x => x.Name.ToLower().Contains(input.Filter)); + return BlogRepository.DeleteAsync(id); } } } 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 3251bcb230..8dda9df563 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 @@ -16,6 +16,11 @@ } public static class Blogs + { + public const string SlugAlreadyExist = "CmsKit:Blog:0001"; + } + + public static class BlogPosts { public const string SlugAlreadyExist = "CmsKit:BlogPost:0001"; } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 45e2e56a9b..212d495459 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -3,6 +3,7 @@ "texts": { "CmsKit:0002": "Content already exists!", "CmsKit:0003": "The entity {0} is not taggable.", + "CmsKit:Blog:0001": "The given slug ({Slug}) already exists!", "CmsKit:BlogPost:0001": "The given slug already exists!", "CmsKit:Media:0001": "'{Name}' is not a valid media name.", "CmsKit:Page:0001": "The given url ({0}) already exists.", diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogManager.cs new file mode 100644 index 0000000000..e92ababf15 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogManager.cs @@ -0,0 +1,46 @@ +using System; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Volo.Abp.Domain.Services; +using Volo.Abp.MultiTenancy; + +namespace Volo.CmsKit.Blogs +{ + public class BlogManager : DomainService + { + protected IBlogRepository BlogRepository { get; } + + public BlogManager(IBlogRepository blogRepository) + { + BlogRepository = blogRepository; + } + + public virtual async Task CreateAsync([NotNull] string name, [NotNull] string slug) + { + await CheckSlugAsync(slug); + + return new Blog(GuidGenerator.Create(), name, slug, CurrentTenant.GetId()); + } + + public virtual async Task UpdateAsync([NotNull] Blog blog, [NotNull] string name, [NotNull] string slug) + { + if (slug != blog.Slug) + { + await CheckSlugAsync(slug); + } + + blog.SetName(name); + blog.SetSlug(slug); + + return blog; + } + + protected virtual async Task CheckSlugAsync([NotNull] string slug) + { + if (await BlogRepository.SlugExistsAsync(slug)) + { + throw new BlogSlugAlreadyExistException(slug); + } + } + } +} \ No newline at end of file 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 034cb8e60d..a2cdf68f39 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 @@ -19,7 +19,7 @@ namespace Volo.CmsKit.Blogs Slug = slug; BlogId = blogId; - Code = CmsKitErrorCodes.Blogs.SlugAlreadyExist; + Code = CmsKitErrorCodes.BlogPosts.SlugAlreadyExist; WithData(nameof(Slug), Slug); WithData(nameof(BlogId), BlogId); 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 new file mode 100644 index 0000000000..7ec2287115 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogSlugAlreadyExistException.cs @@ -0,0 +1,22 @@ +using System; +using System.Runtime.Serialization; +using Volo.Abp; + +namespace Volo.CmsKit.Blogs +{ + [Serializable] + public class BlogSlugAlreadyExistException : BusinessException + { + public BlogSlugAlreadyExistException(string slug) + { + Code = CmsKitErrorCodes.Blogs.SlugAlreadyExist; + + WithData(nameof(Blog.Slug), slug); + } + + public BlogSlugAlreadyExistException( + SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context) + { + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogRepository.cs b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogRepository.cs index 2feb057111..26b150d93d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogRepository.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogRepository.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Volo.Abp.Domain.Repositories; @@ -7,7 +8,23 @@ namespace Volo.CmsKit.Blogs { public interface IBlogRepository : IBasicRepository { - public Task GetBySlugAsync(string slug, CancellationToken cancellationToken = default); + Task> GetListAsync( + string filter = null, + string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + CancellationToken cancellationToken = default + ); + + Task GetCountAsync( + string filter = null, + CancellationToken cancellationToken = default + ); + + Task GetBySlugAsync(string slug, CancellationToken cancellationToken = default); + Task ExistsAsync(Guid blogId, CancellationToken cancellationToken = default); + + Task SlugExistsAsync(string slug, CancellationToken cancellationToken = default); } }