From 6a43bad033eb01974bf24d2834d4f5e6036f02b2 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 10 Feb 2014 12:16:52 -0800 Subject: [PATCH] Fixing and improving blog posts and archives count --- .../Handlers/BlogPartArchiveHandler.cs | 2 +- .../Handlers/BlogPostPartHandler.cs | 28 ++++--------------- .../Orchard.Blogs/Orchard.Blogs.csproj | 2 ++ .../Orchard.Blogs/Services/BlogPostService.cs | 5 +++- .../Services/BlogPostsCountProcessor.cs | 26 +++++++++++++++++ .../Orchard.Blogs/Services/BlogService.cs | 24 ++++++++++++++-- .../Services/IBlogPostsCountProcessor.cs | 7 +++++ .../Orchard.Blogs/Services/IBlogService.cs | 1 + 8 files changed, 68 insertions(+), 27 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostsCountProcessor.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogPostsCountProcessor.cs diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Handlers/BlogPartArchiveHandler.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Handlers/BlogPartArchiveHandler.cs index c2a3cf64e..2453d56cc 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Handlers/BlogPartArchiveHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Handlers/BlogPartArchiveHandler.cs @@ -78,7 +78,7 @@ namespace Orchard.Blogs.Handlers { _blogArchiveRepository.Flush(); // don't reduce archive count if the content item is not published - if (!blogPostPart.HasPublished) { + if (!_previousCreatedUtc.ContainsKey(blogPostPart.Id)) { return; } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Handlers/BlogPostPartHandler.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Handlers/BlogPostPartHandler.cs index f116ed80f..9c366641a 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Handlers/BlogPostPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Handlers/BlogPostPartHandler.cs @@ -5,27 +5,22 @@ using Orchard.Blogs.Models; using Orchard.Blogs.Services; using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; -using Orchard.Core.Common.Models; namespace Orchard.Blogs.Handlers { [UsedImplicitly] public class BlogPostPartHandler : ContentHandler { - private readonly IBlogService _blogService; - private readonly IBlogPostService _blogPostService; public BlogPostPartHandler(IBlogService blogService, IBlogPostService blogPostService, RequestContext requestContext) { - _blogService = blogService; - _blogPostService = blogPostService; OnGetDisplayShape(SetModelProperties); OnGetEditorShape(SetModelProperties); OnUpdateEditorShape(SetModelProperties); - OnCreated((context, part) => UpdateBlogPostCount(part)); - OnPublished((context, part) => UpdateBlogPostCount(part)); - OnUnpublished((context, part) => UpdateBlogPostCount(part)); - OnVersioned((context, part, newVersionPart) => UpdateBlogPostCount(newVersionPart)); - OnRemoved((context, part) => UpdateBlogPostCount(part)); + OnCreated((context, part) => blogService.ProcessBlogPostsCount(part.BlogPart.Id)); + OnPublished((context, part) => blogService.ProcessBlogPostsCount(part.BlogPart.Id)); + OnUnpublished((context, part) => blogService.ProcessBlogPostsCount(part.BlogPart.Id)); + OnVersioned((context, part, newVersionPart) => blogService.ProcessBlogPostsCount(newVersionPart.BlogPart.Id)); + OnRemoved((context, part) => blogService.ProcessBlogPostsCount(part.BlogPart.Id)); OnRemoved( (context, b) => @@ -33,19 +28,6 @@ namespace Orchard.Blogs.Handlers { blogPost => context.ContentManager.Remove(blogPost.ContentItem))); } - private void UpdateBlogPostCount(BlogPostPart blogPostPart) { - CommonPart commonPart = blogPostPart.As(); - if (commonPart != null && - commonPart.Record.Container != null) { - - BlogPart blogPart = blogPostPart.BlogPart ?? - _blogService.Get(commonPart.Record.Container.Id, VersionOptions.Published).As(); - - // Ensure the "right" set of published posts for the blog is obtained - blogPart.PostCount = _blogPostService.PostCount(blogPart); - } - } - private static void SetModelProperties(BuildShapeContext context, BlogPostPart blogPost) { context.Shape.Blog = blogPost.BlogPart; } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj b/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj index 1994ccef0..13770ef7d 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj @@ -108,9 +108,11 @@ + + diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs index c6865745e..ade62759e 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs @@ -58,7 +58,10 @@ namespace Orchard.Blogs.Services { } public int PostCount(BlogPart blogPart, VersionOptions versionOptions) { - return GetBlogQuery(blogPart, versionOptions).Count(); + return _contentManager.Query(versionOptions, "BlogPost") + .Join().Where( + cr => cr.Container == blogPart.Record.ContentItemRecord) + .Count(); } public IEnumerable Get(BlogPart blogPart, ArchiveData archiveData) { diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostsCountProcessor.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostsCountProcessor.cs new file mode 100644 index 000000000..958cdf1d9 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostsCountProcessor.cs @@ -0,0 +1,26 @@ +using Orchard.Blogs.Models; +using Orchard.ContentManagement; +using Orchard.Core.Common.Models; + +namespace Orchard.Blogs.Services { + public class BlogPostsCountProcessor : IBlogPostsCountProcessor { + private readonly IContentManager _contentManager; + + public BlogPostsCountProcessor( + IContentManager contentManager) { + _contentManager = contentManager; + } + + public void Process(int blogPartId) { + var blogPart = _contentManager.Get(blogPartId); + if (blogPart != null) { + var count = _contentManager.Query(VersionOptions.Published, "BlogPost") + .Join().Where( + cr => cr.Container.Id == blogPartId) + .Count(); + + blogPart.PostCount = count; + } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogService.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogService.cs index c7be9aada..505635ffa 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogService.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogService.cs @@ -5,14 +5,27 @@ using Orchard.Autoroute.Models; using Orchard.Blogs.Models; using Orchard.ContentManagement; using Orchard.Core.Title.Models; +using Orchard.Environment.Configuration; +using Orchard.Environment.Descriptor; +using Orchard.Environment.State; namespace Orchard.Blogs.Services { [UsedImplicitly] public class BlogService : IBlogService { private readonly IContentManager _contentManager; - - public BlogService(IContentManager contentManager) { + private readonly IProcessingEngine _processingEngine; + private readonly ShellSettings _shellSettings; + private readonly IShellDescriptorManager _shellDescriptorManager; + private readonly HashSet _processedBlogParts = new HashSet(); + public BlogService( + IContentManager contentManager, + IProcessingEngine processingEngine, + ShellSettings shellSettings, + IShellDescriptorManager shellDescriptorManager) { _contentManager = contentManager; + _processingEngine = processingEngine; + _shellSettings = shellSettings; + _shellDescriptorManager = shellDescriptorManager; } public BlogPart Get(string path) { @@ -38,5 +51,12 @@ namespace Orchard.Blogs.Services { public void Delete(ContentItem blog) { _contentManager.Remove(blog); } + + public void ProcessBlogPostsCount(int blogPartId) { + if (!_processedBlogParts.Contains(blogPartId)) { + _processedBlogParts.Add(blogPartId); + _processingEngine.AddTask(_shellSettings, _shellDescriptorManager.GetShellDescriptor(), "IBlogPostsCountProcessor.Process", new Dictionary { { "blogPartId", blogPartId } }); + } + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogPostsCountProcessor.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogPostsCountProcessor.cs new file mode 100644 index 000000000..aec5fc602 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogPostsCountProcessor.cs @@ -0,0 +1,7 @@ +using Orchard.Events; + +namespace Orchard.Blogs.Services { + public interface IBlogPostsCountProcessor : IEventHandler { + void Process(int blogPartId); + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogService.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogService.cs index 3215e4417..63811cde9 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogService.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogService.cs @@ -9,5 +9,6 @@ namespace Orchard.Blogs.Services { IEnumerable Get(); IEnumerable Get(VersionOptions versionOptions); void Delete(ContentItem blog); + void ProcessBlogPostsCount(int blogPartId); } } \ No newline at end of file