Browse Source

Merge pull request #12073 from abpframework/pr/11963

Adds Status to BlogPosts
pull/12141/head
Enis Necipoglu 4 years ago
committed by GitHub
parent
commit
309865135a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2118
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.Designer.cs
  2. 26
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.cs
  3. 3
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs
  4. 3
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs
  5. 7
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs
  6. 3
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostListDto.cs
  7. 6
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs
  8. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs
  9. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs
  10. 45
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs
  11. 24
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs
  12. 25
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs
  13. 11
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml
  14. 16
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs
  15. 21
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js
  16. 50
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js
  17. 26
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js
  18. 7
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs
  19. 9
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json
  20. 9
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json
  21. 19
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs
  22. 24
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs
  23. 2
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs
  24. 12
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs
  25. 22
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs
  26. 4
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs
  27. 82
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs
  28. 61
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs
  29. 4
      modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/BlogPostManager_Tests.cs
  30. 121
      modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs
  31. 2
      modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs

2118
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.Designer.cs

File diff suppressed because it is too large

26
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20220324203918_Added_BlogPostStatus.cs

@ -0,0 +1,26 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Volo.CmsKit.Migrations
{
public partial class Added_BlogPostStatus : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "Status",
table: "CmsBlogPosts",
type: "int",
nullable: false,
defaultValue: 0);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Status",
table: "CmsBlogPosts");
}
}
}

3
modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs

@ -1341,6 +1341,9 @@ namespace Volo.CmsKit.Migrations
.HasMaxLength(256)
.HasColumnType("nvarchar(256)");
b.Property<int>("Status")
.HasColumnType("int");
b.Property<Guid?>("TenantId")
.HasColumnType("uniqueidentifier")
.HasColumnName("TenantId");

3
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostDto.cs

@ -2,6 +2,7 @@
using Volo.Abp.Application.Dtos;
using Volo.Abp.Auditing;
using Volo.Abp.Domain.Entities;
using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs;
@ -25,4 +26,6 @@ public class BlogPostDto : EntityDto<Guid>, IHasCreationTime, IHasModificationTi
public DateTime? LastModificationTime { get; set; }
public string ConcurrencyStamp { get; set; }
public BlogPostStatus Status { get; set; }
}

7
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs

@ -1,5 +1,6 @@
using System;
using Volo.Abp.Application.Dtos;
using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs;
@ -8,6 +9,8 @@ public class BlogPostGetListInput : PagedAndSortedResultRequestDto
public string Filter { get; set; }
public Guid? BlogId { get; set; }
public Guid? AuthorId { get; set; }
}
public BlogPostStatus? Status { get; set; }
}

3
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostListDto.cs

@ -1,6 +1,7 @@
using System;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Auditing;
using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs;
@ -24,4 +25,6 @@ public class BlogPostListDto : EntityDto<Guid>, IHasCreationTime, IHasModificati
public DateTime CreationTime { get; set; }
public DateTime? LastModificationTime { get; set; }
public BlogPostStatus? Status { get; set; }
}

6
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs

@ -1,4 +1,5 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace Volo.CmsKit.Admin.Blogs;
@ -12,4 +13,9 @@ public interface IBlogPostAdminAppService
CreateBlogPostDto,
UpdateBlogPostDto>
{
Task PublishAsync(Guid id);
Task DraftAsync(Guid id);
Task<BlogPostDto> CreateAndPublishAsync(CreateBlogPostDto input);
}

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissionDefinitionProvider.cs

@ -55,6 +55,8 @@ public class CmsKitAdminPermissionDefinitionProvider : PermissionDefinitionProvi
.RequireGlobalFeatures(typeof(BlogsFeature));
blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Delete, L("Permission:BlogPostManagement.Delete"))
.RequireGlobalFeatures(typeof(BlogsFeature));
blogPostManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Publish, L("Permission:BlogPostManagement.Publish"))
.RequireGlobalFeatures(typeof(BlogsFeature));
var menuManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.Menus.Default, L("Permission:MenuManagement"))
.RequireGlobalFeatures(typeof(MenuFeature));

1
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Permissions/CmsKitAdminPermissions.cs

@ -51,6 +51,7 @@ public class CmsKitAdminPermissions
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
public const string Publish = Default + ".Publish";
}
public static class Menus

45
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs

@ -47,13 +47,15 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe
var blog = await BlogRepository.GetAsync(input.BlogId);
var blogPost = await BlogPostManager.CreateAsync(
author,
blog,
input.Title,
input.Slug,
input.ShortDescription,
input.Content,
input.CoverImageMediaId);
author,
blog,
input.Title,
input.Slug,
BlogPostStatus.Draft,
input.ShortDescription,
input.Content,
input.CoverImageMediaId
);
await BlogPostRepository.InsertAsync(blogPost);
@ -100,6 +102,7 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe
var blogs = (await BlogRepository.GetListAsync()).ToDictionary(x => x.Id);
var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.AuthorId,
statusFilter: input.Status,
input.MaxResultCount, input.SkipCount, input.Sorting);
var count = await BlogPostRepository.GetCountAsync(input.Filter, input.BlogId, input.AuthorId);
@ -120,4 +123,32 @@ public class BlogPostAdminAppService : CmsKitAppServiceBase, IBlogPostAdminAppSe
{
await BlogPostRepository.DeleteAsync(id);
}
[Authorize(CmsKitAdminPermissions.BlogPosts.Publish)]
public virtual async Task PublishAsync(Guid id)
{
var blogPost = await BlogPostRepository.GetAsync(id);
blogPost.SetPublished();
await BlogPostRepository.UpdateAsync(blogPost);
}
[Authorize(CmsKitAdminPermissions.BlogPosts.Update)]
public virtual async Task DraftAsync(Guid id)
{
var blogPost = await BlogPostRepository.GetAsync(id);
blogPost.SetDraft();
await BlogPostRepository.UpdateAsync(blogPost);
}
[Authorize(CmsKitAdminPermissions.BlogPosts.Create)]
[Authorize(CmsKitAdminPermissions.BlogPosts.Publish)]
public virtual async Task<BlogPostDto> CreateAndPublishAsync(CreateBlogPostDto input)
{
var blogPost = await CreateAsync(input);
await CurrentUnitOfWork.SaveChangesAsync();
await PublishAsync(blogPost.Id);
blogPost.Status = BlogPostStatus.Published;
return blogPost;
}
}

24
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi.Client/ClientProxies/BlogPostAdminClientProxy.Generated.cs

@ -55,4 +55,28 @@ public partial class BlogPostAdminClientProxy : ClientProxyBase<IBlogPostAdminAp
{ typeof(UpdateBlogPostDto), input }
});
}
public virtual async Task PublishAsync(Guid id)
{
await RequestAsync(nameof(PublishAsync), new ClientProxyRequestTypeValue
{
{ typeof(Guid), id },
});
}
public virtual async Task DraftAsync(Guid id)
{
await RequestAsync(nameof(DraftAsync), new ClientProxyRequestTypeValue
{
{ typeof(Guid), id },
});
}
public virtual async Task<BlogPostDto> CreateAndPublishAsync(CreateBlogPostDto input)
{
return await RequestAsync<BlogPostDto>(nameof(CreateAndPublishAsync), new ClientProxyRequestTypeValue
{
{ typeof(CreateBlogPostDto), input }
});
}
}

25
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs

@ -61,4 +61,29 @@ public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppS
{
return BlogPostAdminAppService.UpdateAsync(id, input);
}
[HttpPost]
[Route("{id}/publish")]
[Authorize(CmsKitAdminPermissions.BlogPosts.Publish)]
public virtual Task PublishAsync(Guid id)
{
return BlogPostAdminAppService.PublishAsync(id);
}
[HttpPost]
[Route("{id}/draft")]
[Authorize(CmsKitAdminPermissions.BlogPosts.Update)]
public virtual Task DraftAsync(Guid id)
{
return BlogPostAdminAppService.DraftAsync(id);
}
[HttpPost]
[Route("create-and-publish")]
[Authorize(CmsKitAdminPermissions.BlogPosts.Create)]
[Authorize(CmsKitAdminPermissions.BlogPosts.Publish)]
public virtual Task<BlogPostDto> CreateAndPublishAsync(CreateBlogPostDto input)
{
return BlogPostAdminAppService.CreateAndPublishAsync(input);
}
}

11
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml

@ -1,6 +1,7 @@
@page
@using System.Globalization
@using Microsoft.AspNetCore.Authorization
@using Volo.Abp.AspNetCore.Mvc.UI.Packages.TuiEditor
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar
@using Volo.CmsKit.Admin.Web.Pages
@ -10,9 +11,10 @@
@using Volo.CmsKit.Blogs
@using Volo.Abp.AspNetCore.Mvc.UI.Packages.Uppy
@using Volo.Abp.AspNetCore.Mvc.UI.Packages.Slugify
@using Volo.CmsKit.Permissions
@inherits CmsKitAdminPageBase
@inject IAuthorizationService AuthorizationService
@model CreateModel
@{
@ -69,6 +71,7 @@
data-input-id="@Html.IdFor(x => x.ViewModel.Content)"
data-language="@(CultureInfo.CurrentUICulture.TwoLetterISOLanguageName)">
</div>
<input type="hidden" id="ViewModel_Status" name="ViewModel.Status" value="" class="form-control ">
</abp-dynamic-form>
<div id="blog-post-tags-wrapper">
@ -84,6 +87,10 @@
</abp-card-body>
<abp-card-footer>
<abp-button button-type="Primary" type="submit" text="@L["Submit"].Value" id="button-blog-post-create" />
<abp-button button-type="Primary" type="button" text="@L["Draft"].Value" id="button-blog-post-create" />
@if ((await AuthorizationService.AuthorizeAsync(CmsKitAdminPermissions.BlogPosts.Publish)).Succeeded)
{
<abp-button button-type="Primary" type="button" text="@L["Publish"].Value" id="button-blog-post-publish"/>
}
</abp-card-footer>
</abp-card>

16
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Create.cshtml.cs

@ -31,9 +31,17 @@ public class CreateModel : CmsKitAdminPageModel
{
var dto = ObjectMapper.Map<CreateBlogPostViewModel, CreateBlogPostDto>(ViewModel);
var created = await BlogPostAdminAppService.CreateAsync(dto);
BlogPostDto createResult;
if (ViewModel.Status == BlogPostStatus.Published)
{
createResult = await BlogPostAdminAppService.CreateAndPublishAsync(dto);
}
else
{
createResult = await BlogPostAdminAppService.CreateAsync(dto);
}
return new OkObjectResult(created);
return new OkObjectResult(createResult);
}
[AutoMap(typeof(CreateBlogPostDto), ReverseMap = true)]
@ -65,5 +73,9 @@ public class CreateModel : CmsKitAdminPageModel
[HiddenInput]
public Guid? CoverImageMediaId { get; set; }
[HiddenInput]
[DynamicFormIgnore]
public BlogPostStatus Status { get; set; }
}
}

21
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/create.js

@ -2,13 +2,20 @@ $(function () {
var l = abp.localization.getResource("CmsKit");
var blogPostStatus = {
Draft: 0,
Published: 1
};
var $selectBlog = $('#BlogSelectionSelect');
var $formCreate = $('#form-blog-post-create');
var $title = $('#ViewModel_Title');
var $shortDescription = $('#ViewModel_ShortDescription');
var $coverImage = $('#ViewModel_CoverImageMediaId');
var $url = $('#ViewModel_Slug');
var $status = $('#ViewModel_Status');
var $buttonSubmit = $('#button-blog-post-create');
var $buttonPublish = $('#button-blog-post-publish');
var $pageContentInput = $('#ViewModel_Content');
var $tagsInput = $('.tag-editor-form input[name=tags]');
var $fileInput = $('#BlogPostCoverImage');
@ -59,9 +66,23 @@ $(function () {
$buttonSubmit.click(function (e) {
e.preventDefault();
$status.val(blogPostStatus.Draft);
submitCoverImage();
});
$buttonPublish.click(function (e) {
abp.message.confirm(
l('BlogPostPublishConfirmationMessage', $title.val()),
function (isConfirmed) {
if (isConfirmed) {
e.preventDefault();
$status.val(blogPostStatus.Published);
submitCoverImage();
}
}
);
});
function submitEntityTags(blogPostId) {
var tags = $tagsInput.val().split(',').map(x => x.trim()).filter(x => x);

50
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js

@ -1,7 +1,11 @@
$(function () {
var l = abp.localization.getResource("CmsKit");
var blogPostStatus = {
Draft: 0,
Published: 1
};
var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin;
var getFilter = function () {
@ -33,6 +37,40 @@ $(function () {
location.href = "BlogPosts/Update/" + data.record.id
}
},
{
text: l('Publish'),
visible: function(data) {
return data?.status !== blogPostStatus.Published && abp.auth.isGranted('CmsKit.BlogPosts.Publish');
},
confirmMessage: function (data) {
return l("BlogPostPublishConfirmationMessage", data.record.title)
},
action: function (data) {
blogsService
.publish(data.record.id)
.then(function () {
dataTable.ajax.reload();
abp.notify.success(l('SuccessfullyPublished'));
});
}
},
{
text: l('Draft'),
visible: function(data) {
return data?.status !== blogPostStatus.Draft && abp.auth.isGranted('CmsKit.BlogPosts.Update');
},
confirmMessage: function (data) {
return l("BlogPostDraftConfirmationMessage", data.record.title)
},
action: function (data) {
blogsService
.draft(data.record.id)
.then(function () {
dataTable.ajax.reload();
abp.notify.success(l('SuccessfullySaved'));
});
}
},
{
text: l('Delete'),
visible: abp.auth.isGranted('CmsKit.BlogPosts.Delete'),
@ -71,7 +109,15 @@ $(function () {
orderable: true,
data: 'creationTime',
dataFormat: "datetime"
}
},
{
title: l("Status"),
orderable: true,
data: "status",
render: function (data) {
return l("CmsKit.BlogPost.Status." + data);
}
},
]
}));

26
modules/cms-kit/src/Volo.CmsKit.Admin.Web/wwwroot/client-proxies/cms-kit-admin-proxy.js

@ -378,7 +378,7 @@
volo.cmsKit.admin.blogs.blogPostAdmin.getList = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'blogId', value: input.blogId }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts' + abp.utils.buildQueryString([{ name: 'filter', value: input.filter }, { name: 'blogId', value: input.blogId }, { name: 'authorId', value: input.authorId }, { name: 'status', value: input.status }, { name: 'sorting', value: input.sorting }, { name: 'skipCount', value: input.skipCount }, { name: 'maxResultCount', value: input.maxResultCount }]) + '',
type: 'GET'
}, ajaxParams));
};
@ -391,6 +391,30 @@
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.publish = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/publish',
type: 'POST',
dataType: null
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.draft = function(id, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/' + id + '/draft',
type: 'POST',
dataType: null
}, ajaxParams));
};
volo.cmsKit.admin.blogs.blogPostAdmin.createAndPublish = function(input, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/cms-kit-admin/blogs/blog-posts/create-and-publish',
type: 'POST',
data: JSON.stringify(input)
}, ajaxParams));
};
})();
})();

7
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Blogs/BlogPostStatus.cs

@ -0,0 +1,7 @@
namespace Volo.CmsKit.Blogs;
public enum BlogPostStatus
{
Draft,
Published
}

9
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json

@ -85,6 +85,7 @@
"Permission:BlogPostManagement.Create": "Create",
"Permission:BlogPostManagement.Delete": "Delete",
"Permission:BlogPostManagement.Update": "Update",
"Permission:BlogPostManagement.Publish": "Publish",
"Permission:CmsKit": "CmsKit",
"Permission:Comments": "Comment Management",
"Permission:Comments.Delete": "Delete",
@ -166,6 +167,14 @@
"Script": "Script",
"Style": "Style",
"SavedSuccessfully": "Saved successfully",
"CmsKit.BlogPost.Status.0": "Draft",
"CmsKit.BlogPost.Status.1": "Published",
"BlogPostPublishConfirmationMessage": "Are you sure to publish the blog post \"{0}\"?",
"SuccessfullyPublished": "Successfully published!",
"Draft": "Draft",
"Publish": "Publish",
"BlogPostDraftConfirmationMessage": "Are you sure to set the blog post \"{0}\" as draft?",
"SelectAnAuthor": "Select an author",
"GoToTop": "Go to top",
"InThisDocument": "In this document",
"RemoveCoverImageConfirmationMessage": "Are you sure to remove the cover image?",

9
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json

@ -85,6 +85,7 @@
"Permission:BlogPostManagement.Create": "Oluşturma",
"Permission:BlogPostManagement.Delete": "Silme",
"Permission:BlogPostManagement.Update": "Güncelleme",
"Permission:BlogPostManagement.Publish": "Yayınlama",
"Permission:CmsKit": "CmsKit",
"Permission:Comments": "Yorum Yönetimi",
"Permission:Comments.Delete": "Silmek",
@ -165,6 +166,14 @@
"Script": "Script",
"Style": "Style",
"SavedSuccessfully": "Başarıyla kaydedildi",
"CmsKit.BlogPost.Status.0": "Taslak",
"CmsKit.BlogPost.Status.1": "Yayınlandı",
"BlogPostPublishConfirmationMessage": "\"{0}\" başlıklı gönderiyi yayınlamak istediğinize emin misiniz?",
"SuccessfullyPublished": "Başarıyla yayınlandı",
"Draft": "Taslak olarak kaydet",
"Publish": "Yayınla",
"BlogPostDraftConfirmationMessage": "\"{0}\" başlıklı gönderiyi taslak haline getirmek istediğinize emin misiniz?",
"SelectAnAuthor": "Bir yazar seçin",
"GoToTop": "Yukarı Git",
"InThisDocument": "Bu belgede",
"RemoveCoverImageConfirmationMessage": "Kapak resmini kaldırmak istediğinize emin misiniz?",

19
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs

@ -29,7 +29,9 @@ public class BlogPost : FullAuditedAggregateRoot<Guid>, IMultiTenant
public Guid AuthorId { get; set; }
public virtual CmsUser Author { get; set; }
public virtual BlogPostStatus Status { get; set; }
protected BlogPost()
{
}
@ -43,7 +45,9 @@ public class BlogPost : FullAuditedAggregateRoot<Guid>, IMultiTenant
[CanBeNull] string shortDescription = null,
[CanBeNull] string content = null,
[CanBeNull] Guid? coverImageMediaId = null,
[CanBeNull] Guid? tenantId = null) : base(id)
[CanBeNull] Guid? tenantId = null,
[CanBeNull] BlogPostStatus? state = null
) : base(id)
{
TenantId = tenantId;
BlogId = blogId;
@ -53,6 +57,7 @@ public class BlogPost : FullAuditedAggregateRoot<Guid>, IMultiTenant
SetShortDescription(shortDescription);
SetContent(content);
CoverImageMediaId = coverImageMediaId;
Status = state ?? BlogPostStatus.Draft;
}
public virtual void SetTitle(string title)
@ -76,4 +81,14 @@ public class BlogPost : FullAuditedAggregateRoot<Guid>, IMultiTenant
{
Content = Check.Length(content, nameof(content), BlogPostConsts.MaxContentLength);
}
public virtual void SetDraft()
{
Status = BlogPostStatus.Draft;
}
public virtual void SetPublished()
{
Status = BlogPostStatus.Published;
}
}

24
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs

@ -30,6 +30,7 @@ public class BlogPostManager : DomainService
[NotNull] Blog blog,
[NotNull] string title,
[NotNull] string slug,
[NotNull] BlogPostStatus status,
[CanBeNull] string shortDescription = null,
[CanBeNull] string content = null,
[CanBeNull] Guid? coverImageMediaId = null)
@ -40,17 +41,18 @@ public class BlogPostManager : DomainService
Check.NotNullOrEmpty(slug, nameof(slug));
var blogPost = new BlogPost(
GuidGenerator.Create(),
blog.Id,
author.Id,
title,
slug,
shortDescription,
content,
coverImageMediaId,
CurrentTenant.Id
);
GuidGenerator.Create(),
blog.Id,
author.Id,
title,
slug,
shortDescription,
content,
coverImageMediaId,
CurrentTenant.Id,
status
);
await CheckSlugExistenceAsync(blog.Id, blogPost.Slug);
return blogPost;

2
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs

@ -13,12 +13,14 @@ public interface IBlogPostRepository : IBasicRepository<BlogPost, Guid>
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
BlogPostStatus? statusFilter = null,
CancellationToken cancellationToken = default);
Task<List<BlogPost>> GetListAsync(
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
BlogPostStatus? statusFilter = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
string sorting = null,

12
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs

@ -43,12 +43,14 @@ public class EfCoreBlogPostRepository : EfCoreRepository<CmsKitDbContext, BlogPo
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
BlogPostStatus? statusFilter = null,
CancellationToken cancellationToken = default)
{
var queryable = (await GetDbSetAsync())
.WhereIf(blogId.HasValue, x => x.BlogId == blogId)
.WhereIf(authorId.HasValue, x => x.AuthorId == authorId)
.WhereIf(!string.IsNullOrEmpty(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter));
.WhereIf(blogId.HasValue, x => x.BlogId == blogId)
.WhereIf(authorId.HasValue, x => x.AuthorId == authorId)
.WhereIf(statusFilter.HasValue, x => x.Status == statusFilter)
.WhereIf(!string.IsNullOrEmpty(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter));
var count = await queryable.CountAsync(GetCancellationToken(cancellationToken));
return count;
@ -58,6 +60,7 @@ public class EfCoreBlogPostRepository : EfCoreRepository<CmsKitDbContext, BlogPo
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
BlogPostStatus? statusFilter = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
string sorting = null,
@ -71,7 +74,8 @@ public class EfCoreBlogPostRepository : EfCoreRepository<CmsKitDbContext, BlogPo
var queryable = blogPostsDbSet
.WhereIf(blogId.HasValue, x => x.BlogId == blogId)
.WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter))
.WhereIf(authorId.HasValue, x => x.AuthorId == authorId);
.WhereIf(authorId.HasValue, x => x.AuthorId == authorId)
.WhereIf(statusFilter.HasValue, x => x.Status == statusFilter);
queryable = queryable.OrderBy(sorting.IsNullOrEmpty() ? $"{nameof(BlogPost.CreationTime)} desc" : sorting);

22
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs

@ -44,6 +44,7 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
BlogPostStatus? statusFilter = null,
CancellationToken cancellationToken = default)
{
cancellationToken = GetCancellationToken(cancellationToken);
@ -52,14 +53,15 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
.WhereIf<BlogPost, IMongoQueryable<BlogPost>>(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter))
.WhereIf<BlogPost, IMongoQueryable<BlogPost>>(blogId.HasValue, x => x.BlogId == blogId)
.WhereIf<BlogPost, IMongoQueryable<BlogPost>>(authorId.HasValue, x => x.AuthorId == authorId)
.WhereIf<BlogPost, IMongoQueryable<BlogPost>>(statusFilter.HasValue, x => x.Status == statusFilter)
.CountAsync(cancellationToken);
}
public virtual async Task<List<BlogPost>> GetListAsync(
string filter = null,
Guid? blogId = null,
Guid? authorId = null,
BlogPostStatus? statusFilter = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
string sorting = null,
@ -74,7 +76,8 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
var queryable = blogPostQueryable
.WhereIf(blogId.HasValue, x => x.BlogId == blogId)
.WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter))
.WhereIf(authorId.HasValue, x => x.AuthorId == authorId);
.WhereIf(authorId.HasValue, x => x.AuthorId == authorId)
.WhereIf(statusFilter.HasValue, x => x.Status == statusFilter);
queryable = queryable.OrderBy(sorting.IsNullOrEmpty() ? $"{nameof(BlogPost.CreationTime)} desc" : sorting);
@ -108,7 +111,7 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
public async Task<List<CmsUser>> GetAuthorsHasBlogPostsAsync(int skipCount, int maxResultCount, string sorting, string filter, CancellationToken cancellationToken = default)
{
var queryable = (await CreateAuthorsQueryableAsync())
var queryable = (await CreateAuthorsQueryableAsync(cancellationToken))
.Skip(skipCount)
.Take(maxResultCount)
.OrderBy(sorting.IsNullOrEmpty() ? nameof(CmsUser.UserName) : sorting)
@ -120,21 +123,24 @@ public class MongoBlogPostRepository : MongoDbRepository<CmsKitMongoDbContext, B
public async Task<int> GetAuthorsHasBlogPostsCountAsync(string filter, CancellationToken cancellationToken = default)
{
return await AsyncExecuter.CountAsync(
(await CreateAuthorsQueryableAsync())
(await CreateAuthorsQueryableAsync(cancellationToken))
.WhereIf(!filter.IsNullOrEmpty(), x => x.UserName.Contains(filter.ToLower())));
}
public async Task<CmsUser> GetAuthorHasBlogPostAsync(Guid id, CancellationToken cancellationToken = default)
{
return await AsyncExecuter.FirstOrDefaultAsync(await CreateAuthorsQueryableAsync(), x => x.Id == id)
return await AsyncExecuter.FirstOrDefaultAsync(await CreateAuthorsQueryableAsync(cancellationToken), x => x.Id == id)
?? throw new EntityNotFoundException(typeof(CmsUser), id);
}
private async Task<IQueryable<CmsUser>> CreateAuthorsQueryableAsync()
private async Task<IQueryable<CmsUser>> CreateAuthorsQueryableAsync(CancellationToken cancellationToken = default)
{
var blogPostQueryable = (await GetQueryableAsync());
cancellationToken = GetCancellationToken(cancellationToken);
var blogPostQueryable = (await GetQueryableAsync())
.Where(x => x.Status == BlogPostStatus.Published);
var usersQueryable = (await GetDbContextAsync()).Collection<CmsUser>().AsQueryable();
var usersQueryable = (await GetDbContextAsync(cancellationToken)).Collection<CmsUser>().AsQueryable();
return blogPostQueryable
.Join(

4
modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs

@ -38,11 +38,11 @@ public class BlogPostPublicAppService : CmsKitPublicAppServiceBase, IBlogPostPub
{
var blog = await BlogRepository.GetBySlugAsync(blogSlug);
var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.AuthorId, input.MaxResultCount,
var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id, input.AuthorId, BlogPostStatus.Published, input.MaxResultCount,
input.SkipCount, input.Sorting);
return new PagedResultDto<BlogPostPublicDto>(
await BlogPostRepository.GetCountAsync(blogId: blog.Id, authorId: input.AuthorId),
await BlogPostRepository.GetCountAsync(blogId: blog.Id, statusFilter: BlogPostStatus.Published, authorId: input.AuthorId),
ObjectMapper.Map<List<BlogPost>, List<BlogPostPublicDto>>(blogPosts));
}

82
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs

@ -156,4 +156,86 @@ public class BlogPostAdminAppService_Tests : CmsKitApplicationTestBase
exception.EntityType.ShouldBe(typeof(BlogPost));
exception.Id.ShouldBe(cmsKitTestData.Page_2_Id);
}
[Fact]
public async Task PublishAsync_ShouldWorkProperly()
{
var newPost = await CreateBlogPost();
newPost.Status.ShouldBe(BlogPostStatus.Draft);
await blogPostAdminAppService.PublishAsync(newPost.Id);
var post = await blogPostAdminAppService.GetAsync(newPost.Id);
post.Status.ShouldBe(BlogPostStatus.Published);
}
[Fact]
public async Task DraftAsync_ShouldWorkProperly()
{
var newPost = await CreateBlogPost();
newPost.Status.ShouldBe(BlogPostStatus.Draft);
await blogPostAdminAppService.PublishAsync(newPost.Id);
var post = await blogPostAdminAppService.GetAsync(newPost.Id);
post.Status.ShouldBe(BlogPostStatus.Published);
await blogPostAdminAppService.DraftAsync(newPost.Id);
post = await blogPostAdminAppService.GetAsync(newPost.Id);
post.Status.ShouldBe(BlogPostStatus.Draft);
}
[Fact]
public async Task CreateAndPublishAsync_ShouldWorkProperly()
{
var title = "My awesome new Post";
var slug = "my-awesome-new-post";
var shortDescription = "This blog is all about awesomeness 🤗!";
var content = "Another blog post shared on internet";
var created = await blogPostAdminAppService.CreateAndPublishAsync(new CreateBlogPostDto
{
BlogId = cmsKitTestData.Blog_Id,
Title = title,
Slug = slug,
ShortDescription = shortDescription,
Content = content
});
created.Id.ShouldNotBe(Guid.Empty);
created.Status.ShouldBe(BlogPostStatus.Published);
var blogPost = await blogPostRepository.GetAsync(created.Id);
blogPost.Title.ShouldBe(title);
blogPost.Slug.ShouldBe(slug);
blogPost.ShortDescription.ShouldBe(shortDescription);
blogPost.Content.ShouldBe(content);
blogPost.Status.ShouldBe(BlogPostStatus.Published);
}
private async Task<BlogPostDto> CreateBlogPost()
{
var title = "My awesome new Post";
var slug = "my-awesome-new-post";
var shortDescription = "This blog is all about awesomeness 🤗!";
var content = "Another blog post shared on internet";
var created = await blogPostAdminAppService.CreateAsync(new CreateBlogPostDto
{
BlogId = cmsKitTestData.Blog_Id,
Title = title,
Slug = slug,
ShortDescription = shortDescription,
Content = content
});
created.Id.ShouldNotBe(Guid.Empty);
var blogPost = await blogPostRepository.GetAsync(created.Id);
blogPost.Title.ShouldBe(title);
blogPost.Slug.ShouldBe(slug);
blogPost.ShortDescription.ShouldBe(shortDescription);
blogPost.Content.ShouldBe(content);
return created;
}
}

61
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostPublicAppService_Tests.cs

@ -85,6 +85,7 @@ public class BlogPostPublicAppService_Tests : CmsKitApplicationTestBase
blog,
cmsKitTestData.BlogPost_1_Title + "by user2",
cmsKitTestData.BlogPost_1_Slug + "by user2",
BlogPostStatus.Published,
"Short desc 1",
"Blog Post 1 Content"
);
@ -118,4 +119,64 @@ public class BlogPostPublicAppService_Tests : CmsKitApplicationTestBase
blogPosts.Items.ShouldNotBeEmpty();
blogPosts.Items.Count.ShouldBe(2);
}
[Fact]
public async Task GetListAsync_ShouldNotGet_UnPublishedItems()
{
var user2 = await userRepository.GetAsync(cmsKitTestData.User2Id);
var blog = await blogRepository.GetAsync(cmsKitTestData.Blog_Id);
var draftBlogPost1 = await blogPostManager.CreateAsync(
user2,
blog,
cmsKitTestData.BlogPost_1_Title + "draft1",
cmsKitTestData.BlogPost_1_Slug + "draft1",
BlogPostStatus.Draft,
"Short desc 1",
"Blog Post 1 Content"
);
var draftBlogPost2 = await blogPostManager.CreateAsync(
user2,
blog,
cmsKitTestData.BlogPost_1_Title + "draft2",
cmsKitTestData.BlogPost_1_Slug + "draft2",
BlogPostStatus.Draft,
"Short desc 1",
"Blog Post 1 Content"
);
var publishedBlogPost1 = await blogPostManager.CreateAsync(
user2,
blog,
cmsKitTestData.BlogPost_1_Title + "published1",
cmsKitTestData.BlogPost_1_Slug + "published1",
BlogPostStatus.Published,
"Short desc 1",
"Blog Post 1 Content"
);
await blogPostRepository.InsertAsync(draftBlogPost1);
await blogPostRepository.InsertAsync(draftBlogPost2);
await blogPostRepository.InsertAsync(publishedBlogPost1);
//should get all not filtered by user
var blogPosts = await blogPostAppService.GetListAsync(cmsKitTestData.BlogSlug,
new BlogPostGetListInput {});
blogPosts.ShouldNotBeNull();
blogPosts.TotalCount.ShouldBe(3);
blogPosts.Items.ShouldNotBeEmpty();
blogPosts.Items.Count.ShouldBe(3);
blogPosts.Items.Any(x => x.Id == draftBlogPost1.Id).ShouldBeFalse();
blogPosts.Items.Any(x => x.Id == draftBlogPost2.Id).ShouldBeFalse();
blogPosts.Items.Any(x => x.Id == publishedBlogPost1.Id).ShouldBeTrue();
var allItemsFromRepository = await blogPostRepository.GetListAsync();
allItemsFromRepository.ShouldNotBeNull();
allItemsFromRepository.Count.ShouldBe(5);//3 new added 2 already existing
allItemsFromRepository.Any(x => x.Id == draftBlogPost1.Id).ShouldBeTrue();
allItemsFromRepository.Any(x => x.Id == draftBlogPost2.Id).ShouldBeTrue();
allItemsFromRepository.Any(x => x.Id == publishedBlogPost1.Id).ShouldBeTrue();
}
}

4
modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/BlogPostManager_Tests.cs

@ -41,7 +41,7 @@ public class BlogPostManager_Tests : CmsKitDomainTestBase
var blog = await blogRepository.GetAsync(cmsKitTestData.Blog_Id);
var blogPost = await blogPostManager.CreateAsync(author, blog, title, slug);
var blogPost = await blogPostManager.CreateAsync(author, blog, title, slug, BlogPostStatus.Published);
blogPost.Id.ShouldNotBe(Guid.Empty);
blogPost.Title.ShouldBe(title);
@ -57,7 +57,7 @@ public class BlogPostManager_Tests : CmsKitDomainTestBase
var blog = await blogRepository.GetAsync(cmsKitTestData.Blog_Id);
await Should.ThrowAsync<BlogPostSlugAlreadyExistException>(async () =>
await blogPostManager.CreateAsync(author, blog, "Any New Title", cmsKitTestData.BlogPost_1_Slug));
await blogPostManager.CreateAsync(author, blog, "Any New Title", cmsKitTestData.BlogPost_1_Slug, BlogPostStatus.Published));
}
[Fact]

121
modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs

@ -6,6 +6,7 @@ using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Modularity;
using Volo.CmsKit.Users;
using Xunit;
namespace Volo.CmsKit.Blogs;
@ -15,11 +16,16 @@ public abstract class BlogPostRepository_Test<TStartupModule> : CmsKitTestBase<T
{
private readonly CmsKitTestData testData;
private readonly IBlogPostRepository blogPostRepository;
private readonly BlogPostManager blogPostManager;
private readonly ICmsUserRepository userRepository;
private readonly IBlogRepository blogRepository;
public BlogPostRepository_Test()
{
testData = GetRequiredService<CmsKitTestData>();
blogPostRepository = GetRequiredService<IBlogPostRepository>();
blogPostManager = GetRequiredService<BlogPostManager>();
userRepository = GetRequiredService<ICmsUserRepository>();
blogRepository = GetRequiredService<IBlogRepository>();
}
[Fact]
@ -155,4 +161,117 @@ public abstract class BlogPostRepository_Test<TStartupModule> : CmsKitTestBase<T
authors.ShouldNotBeEmpty();
authors.ShouldContain(x => x.Id == testData.User1Id);
}
[Fact]
public async Task ShouldCreateItem_WithDraftStatus()
{
var user2 = await userRepository.GetAsync(testData.User2Id);
var blog = await blogRepository.GetAsync(testData.Blog_Id);
var draftPost = await blogPostManager.CreateAsync(
user2,
blog,
testData.BlogPost_1_Title + "draft",
testData.BlogPost_1_Slug + "draft",
BlogPostStatus.Draft,
"Short desc 1",
"Blog Post 1 Content"
);
await blogPostRepository.InsertAsync(draftPost);
var draftPostFromDb = await blogPostRepository.GetAsync(draftPost.Id);
draftPostFromDb.Title.ShouldBe(draftPost.Title);
draftPostFromDb.Slug.ShouldBe(draftPost.Slug);
draftPostFromDb.ShortDescription.ShouldBe(draftPost.ShortDescription);
draftPostFromDb.Content.ShouldBe(draftPost.Content);
draftPostFromDb.Status.ShouldBe(BlogPostStatus.Draft);
}
[Fact]
public async Task ShouldCreateItem_WithPublishedStatus()
{
var user2 = await userRepository.GetAsync(testData.User2Id);
var blog = await blogRepository.GetAsync(testData.Blog_Id);
var publishedPost = await blogPostManager.CreateAsync(
user2,
blog,
testData.BlogPost_1_Title + "published",
testData.BlogPost_1_Slug + "published",
BlogPostStatus.Published,
"Short desc 1",
"Blog Post 1 Content"
);
await blogPostRepository.InsertAsync(publishedPost);
var publishedPostFromDb = await blogPostRepository.GetAsync(publishedPost.Id);
publishedPostFromDb.Title.ShouldBe(publishedPost.Title);
publishedPostFromDb.Slug.ShouldBe(publishedPost.Slug);
publishedPostFromDb.ShortDescription.ShouldBe(publishedPost.ShortDescription);
publishedPostFromDb.Content.ShouldBe(publishedPost.Content);
publishedPostFromDb.Status.ShouldBe(BlogPostStatus.Published);
}
[Fact]
public async Task GetListAsync_ShouldFilter_ByStatus()
{
var user2 = await userRepository.GetAsync(testData.User2Id);
var blog = await blogRepository.GetAsync(testData.Blog_Id);
var draftPost = await blogPostManager.CreateAsync(
user2,
blog,
testData.BlogPost_1_Title + "draft",
testData.BlogPost_1_Slug + "draft",
BlogPostStatus.Draft,
"Short desc 1",
"Blog Post 1 Content"
);
var publishedPost = await blogPostManager.CreateAsync(
user2,
blog,
testData.BlogPost_1_Title + "published",
testData.BlogPost_1_Slug + "published",
BlogPostStatus.Published,
"Short desc 1",
"Blog Post 1 Content"
);
await blogPostRepository.InsertAsync(draftPost);
await blogPostRepository.InsertAsync(publishedPost);
var draftPostFromDb = await blogPostRepository.GetAsync(draftPost.Id);
draftPostFromDb.Title.ShouldBe(draftPost.Title);
draftPostFromDb.Slug.ShouldBe(draftPost.Slug);
draftPostFromDb.ShortDescription.ShouldBe(draftPost.ShortDescription);
draftPostFromDb.Content.ShouldBe(draftPost.Content);
draftPostFromDb.Status.ShouldBe(BlogPostStatus.Draft);
var publishedPostFromDb = await blogPostRepository.GetAsync(publishedPost.Id);
publishedPostFromDb.Title.ShouldBe(publishedPost.Title);
publishedPostFromDb.Slug.ShouldBe(publishedPost.Slug);
publishedPostFromDb.ShortDescription.ShouldBe(publishedPost.ShortDescription);
publishedPostFromDb.Content.ShouldBe(publishedPost.Content);
publishedPostFromDb.Status.ShouldBe(BlogPostStatus.Published);
var draftPosts = await blogPostRepository.GetListAsync(null, statusFilter: BlogPostStatus.Draft);
draftPosts.ShouldNotBeNull();
draftPosts.Count.ShouldBe(1);
draftPosts.Any(x => x.Id == draftPost.Id).ShouldBeTrue();
draftPosts.Any(x => x.Id == publishedPost.Id).ShouldBeFalse();
var publishedPosts = await blogPostRepository.GetListAsync(null, statusFilter: BlogPostStatus.Published);
publishedPosts.ShouldNotBeNull();
publishedPosts.Count.ShouldBe(3);//1 new added 2 already existing
publishedPosts.Any(x => x.Id == draftPost.Id).ShouldBeFalse();
publishedPosts.Any(x => x.Id == publishedPost.Id).ShouldBeTrue();
}
}

2
modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitDataSeedContributor.cs

@ -367,6 +367,7 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende
blog,
_cmsKitTestData.BlogPost_1_Title,
_cmsKitTestData.BlogPost_1_Slug,
BlogPostStatus.Published,
"Short desc 1",
"Blog Post 1 Content"))).Id;
@ -377,6 +378,7 @@ public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDepende
blog,
_cmsKitTestData.BlogPost_2_Title,
_cmsKitTestData.BlogPost_2_Slug,
BlogPostStatus.Published,
"Short desc 2",
"Blog Post 2 Content"))).Id;
}

Loading…
Cancel
Save