Exemple #1
0
        /// <summary>
        /// Returns all parent pages, when <paramref name="withChildren"/> is true their children are also returned.
        /// </summary>
        /// <param name="withChildren">True will return children with the parents.</param>
        /// <returns></returns>
        public async Task <IList <Page> > GetParentsAsync(bool withChildren = false)
        {
            var query = new PostListQuery(withChildren ? EPostListQueryType.PagesWithChildren : EPostListQueryType.Pages);

            var(posts, totalCount) = await postRepository.GetListAsync(query);

            // either all pages or just parents
            var pages = mapper.Map <IList <Post>, IList <Page> >(posts);

            if (!withChildren)
            {
                return(pages);
            }

            var parents = pages.Where(p => p.IsParent);

            foreach (var parent in parents)
            {
                var children = pages.Where(p => p.ParentId == parent.Id);
                foreach (var child in children)
                {
                    child.Parent = parent;
                    parent.Children.Add(child);
                }
            }

            return(parents.ToList());
        }
Exemple #2
0
        private async Task <List <Page> > QueryPagesAsync(PostListQuery query)
        {
            var results = await _postRepo.GetListAsync(query);

            var pages = _mapper.Map <List <Post>, List <Page> >(results.posts);

            return(pages);
        }
Exemple #3
0
        /// <summary>
        /// Returns specified number of <see cref="BlogPost"/> used by metaweblog.
        /// </summary>
        /// <param name="numberOfPosts">"All" is int.MaxValue</param>
        public async Task <BlogPostList> GetRecentPostsAsync(int numberOfPosts)
        {
            var query = new PostListQuery(EPostListQueryType.BlogPostsByNumber)
            {
                PageSize = numberOfPosts
            };

            return(await QueryPostsAsync(query));
        }
Exemple #4
0
        public async Task <List <Page> > GetRecentPagesAsync(int numberOfPages)
        {
            PostListQuery query =
                new PostListQuery(EPostListQueryType.PagesByNumber)
            {
                PageSize = numberOfPages
            };

            return(await this.QueryPagesAsync(query));
        }
Exemple #5
0
        /// <summary>
        /// Returns spcific number of published <see cref="BlogPost"/>.
        /// </summary>
        /// <param name="numberOfPosts"></param>
        /// <returns></returns>
        public async Task <BlogPostList> GetRecentPublishedPostsAsync(int numberOfPosts)
        {
            return(await cache.GetAsync(BlogCache.KEY_POSTS_RECENT, BlogCache.Time_Posts_Recent, async() =>
            {
                var query = new PostListQuery(EPostListQueryType.BlogPublishedPostsByNumber)
                {
                    PageSize = numberOfPosts <= 0 ? 1 : numberOfPosts
                };

                return await QueryPostsAsync(query);
            }));
        }
Exemple #6
0
        public async Task <Page> GetParentPageWithChildrenAsync(int id)
        {
            var parentPage = await this.GetPageAsync(id);

            var query = new PostListQuery(EPostListQueryType.ChildPagesForParent, id);
            var pages = await this.QueryPagesAsync(query);

            foreach (var page in pages)
            {
                parentPage.Children.Add(page);
            }

            return(parentPage);
        }
Exemple #7
0
        public async void GetPostList_By_Drafts_Returns_All_Drafts()
        {
            // Arrange: 11 drafts
            SeedTestPosts(23);

            var query = new PostListQuery(EPostListQueryType.BlogDrafts); // draft returns all, so no need for page indx and size

            // Act
            var list = await _postRepo.GetListAsync(query);

            // Assert
            Assert.Equal(11, list.posts.Count); // only published posts are returned
            Assert.Equal(11, list.totalCount);
        }
Exemple #8
0
        /// <summary>
        /// Returns a list of blog posts for archive.
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="page"></param>
        /// <returns></returns>
        public async Task <BlogPostList> GetListForArchive(int?year, int?month, int page = 1)
        {
            if (!year.HasValue)
            {
                throw new FanException("Year must be provided.");
            }
            var query = new PostListQuery(EPostListQueryType.BlogPostsArchive)
            {
                Year  = year.Value,
                Month = month
            };

            return(await QueryPostsAsync(query));
        }
Exemple #9
0
        /// <summary>
        /// Returns a <see cref="BlogPostList"/> based on query from data source.
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        private async Task <BlogPostList> QueryPostsAsync(PostListQuery query)
        {
            var(posts, totalCount) = await _postRepo.GetListAsync(query);

            var blogPostList = new BlogPostList
            {
                PostCount = totalCount
            };

            foreach (var post in posts)
            {
                blogPostList.Posts.Add(await GetBlogPostAsync(post, parseShortcode: true));
            }

            return(blogPostList);
        }
Exemple #10
0
        /// <summary>
        /// Returns a list of blog posts for a tag.
        /// </summary>
        /// <param name="tagSlug"></param>
        /// <param name="pageIndex"></param>
        /// <returns></returns>
        public async Task <BlogPostList> GetListForTagAsync(string tagSlug, int pageIndex)
        {
            if (tagSlug.IsNullOrEmpty())
            {
                throw new FanException("Tag does not exist.");
            }

            PostListQuery query = new PostListQuery(EPostListQueryType.BlogPostsByTag)
            {
                TagSlug   = tagSlug,
                PageIndex = (pageIndex <= 0) ? 1 : pageIndex,
                PageSize  = (await _settingSvc.GetSettingsAsync <BlogSettings>()).PostPerPage,
            };

            return(await QueryPostsAsync(query));
        }
Exemple #11
0
        /// <summary>
        /// Returns a list of blog posts for a category.
        /// </summary>
        /// <param name="categorySlug"></param>
        /// <param name="pageIndex"></param>
        /// <returns></returns>
        public async Task <BlogPostList> GetListForCategoryAsync(string categorySlug, int pageIndex)
        {
            if (categorySlug.IsNullOrEmpty())
            {
                throw new FanException("Category does not exist.");
            }

            PostListQuery query = new PostListQuery(EPostListQueryType.BlogPostsByCategory)
            {
                CategorySlug = categorySlug,
                PageIndex    = (pageIndex <= 0) ? 1 : pageIndex,
                PageSize     = (await settingService.GetSettingsAsync <BlogSettings>()).PostPerPage,
            };

            return(await QueryPostsAsync(query));
        }
Exemple #12
0
        public async void GetPostList_By_Number_Returns_All_Posts_Regardless_Status()
        {
            // Arrange: given 11 drafts, 12 published
            SeedTestPosts(23);

            // Act: when query Max number of post by MetaWeblog
            var query = new PostListQuery(EPostListQueryType.BlogPostsByNumber)
            {
                PageSize = int.MaxValue
            };
            var list = await _postRepo.GetListAsync(query);

            // Assert: then all posts are returned
            Assert.Equal(23, list.posts.Count);
            Assert.Equal(23, list.totalCount);
        }
Exemple #13
0
        public async void GetPostList_By_Category_Returns_Posts_For_Category()
        {
            // Arrange
            SeedTestPosts(11);

            var query = new PostListQuery(EPostListQueryType.BlogPostsByCategory)
            {
                CategorySlug = CAT_SLUG,
                PageIndex    = 1,
                PageSize     = 10,
            };

            // Act
            var list = await _postRepo.GetListAsync(query);

            // Assert
            Assert.Equal(6, list.posts.Count);
            Assert.Equal(6, list.totalCount);
        }
Exemple #14
0
        public async void GetPostList_By_Tag_Returns_Posts_For_Tag(string slug, int expectedPostCount)
        {
            // Arrange: given 11 posts
            SeedTestPosts(11);

            var query = new PostListQuery(EPostListQueryType.BlogPostsByTag)
            {
                TagSlug   = slug,
                PageIndex = 1,
                PageSize  = 10,
            };

            // Act: GetList
            var list = await _postRepo.GetListAsync(query);

            // Assert
            Assert.Equal(expectedPostCount, list.posts.Count);
            Assert.Equal(expectedPostCount, list.totalCount);
        }
Exemple #15
0
        public async void GetPostList_By_BlogPosts_Returns_Only_Published_Posts()
        {
            // Arrange: 5 drafts, 6 published
            SeedTestPosts(11);

            var query = new PostListQuery(EPostListQueryType.BlogPosts)
            {
                PageIndex = 1,
                PageSize  = 10,
            };

            // Act
            var list = await _postRepo.GetListAsync(query);

            // Assert
            Assert.Equal(6, list.posts.Count); // only published posts are returned
            Assert.Equal(6, list.totalCount);
            var tags = list.posts[0].PostTags;
        }
Exemple #16
0
        /// <summary>
        /// Returns a <see cref="BlogPostList"/> based on query from data source.
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        private async Task <BlogPostList> QueryPostsAsync(PostListQuery query)
        {
            var(posts, totalCount) = await postRepository.GetListAsync(query);

            var blogPostList = new BlogPostList
            {
                TotalPostCount = totalCount
            };

            foreach (var post in posts)
            {
                var blogPost = ConvertToBlogPost(post);
                blogPost = await PreRenderAsync(blogPost);

                blogPostList.Posts.Add(blogPost);
            }

            return(blogPostList);
        }
Exemple #17
0
        /// <summary>
        /// Returns a list of blog posts.
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <returns></returns>
        /// <remarks>
        /// For the blog index page, admin post page, main rss feed.
        /// </remarks>
        public async Task <BlogPostList> GetListAsync(int pageIndex, int pageSize, bool cacheable = true)
        {
            PostListQuery query = new PostListQuery(EPostListQueryType.BlogPosts)
            {
                PageIndex = (pageIndex <= 0) ? 1 : pageIndex,
                PageSize  = pageSize,
            };

            // cache only first page of the public site, not admin or rss
            if (query.PageIndex == 1 && cacheable)
            {
                return(await _cache.GetAsync(BlogCache.KEY_POSTS_INDEX, BlogCache.Time_PostsIndex, async() =>
                {
                    return await QueryPostsAsync(query);
                }));
            }

            return(await QueryPostsAsync(query));
        }
Exemple #18
0
        public async Task <Page> GetRootPageWithChildrenAsync(string slug)
        {
            var rootPages = await GetRootPagesAsync();

            var rootPage = rootPages.SingleOrDefault(p => p.Slug.Equals(slug, StringComparison.CurrentCultureIgnoreCase));
            var query    = new PostListQuery(EPostListQueryType.ChildPagesForRoot, rootPage.Id);
            var pages    = await this.QueryPagesAsync(query);

            foreach (var page in pages)
            {
                var childPages = pages.Where(p => p.ParentId == page.Id);
                if (childPages != null)
                {
                    page.Children = childPages.ToList();
                    pages.RemoveAll(p => p.ParentId == page.Id);
                }
            }

            rootPage.Children = pages;

            return(rootPage);
        }
        /// <summary>
        /// Returns a list of posts and total post count by query or empty list if no posts found.
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public async Task <(List <Post> posts, int totalCount)> GetListAsync(PostListQuery query)
        {
            List <Post>       posts = null;
            int               skip  = (query.PageIndex - 1) * query.PageSize;
            int               take  = query.PageSize;
            IQueryable <Post> q     = _entities.Include(p => p.User).Include(p => p.Category).Include(p => p.PostTags).ThenInclude(p => p.Tag);

            switch (query.QueryType)
            {
            case EPostListQueryType.BlogPosts:
                q     = q.Where(p => p.Status == EPostStatus.Published && p.Type == EPostType.BlogPost);
                posts = await q.OrderByDescending(p => p.CreatedOn).Skip(skip).Take(take).ToListAsync();

                break;

            case EPostListQueryType.BlogDrafts:
                q     = q.Where(p => p.Status == EPostStatus.Draft && p.Type == EPostType.BlogPost);
                posts = await q.OrderByDescending(p => p.UpdatedOn).ToListAsync();

                break;

            case EPostListQueryType.BlogPostsByCategory:
                var cat = await _db.Set <Category>().FirstAsync(t => t.Slug.Equals(query.CategorySlug, StringComparison.CurrentCultureIgnoreCase));

                q     = q.Where(p => p.CategoryId == cat.Id && p.Status == EPostStatus.Published && p.Type == EPostType.BlogPost);
                posts = await q.OrderByDescending(p => p.CreatedOn).Skip(skip).Take(take).ToListAsync();

                break;

            case EPostListQueryType.BlogPostsByTag:
                var tag = await _db.Set <Tag>().FirstAsync(t => t.Slug.Equals(query.TagSlug, StringComparison.CurrentCultureIgnoreCase));

                q = from p in q
                    from pt in p.PostTags
                    where p.Id == pt.PostId &&
                    pt.TagId == tag.Id && p.Status == EPostStatus.Published && p.Type == EPostType.BlogPost
                    select p;
                posts = await q.OrderByDescending(p => p.CreatedOn).Skip(skip).Take(take).ToListAsync();

                break;

            case EPostListQueryType.BlogPostsArchive:
                q = (query.Month.HasValue && query.Month > 0) ?
                    q.Where(p => p.CreatedOn.Year == query.Year && p.CreatedOn.Month == query.Month && p.Status == EPostStatus.Published && p.Type == EPostType.BlogPost) :
                    q.Where(p => p.CreatedOn.Year == query.Year && p.Status == EPostStatus.Published && p.Type == EPostType.BlogPost);
                posts = await q.OrderByDescending(p => p.CreatedOn).ToListAsync();

                break;

            case EPostListQueryType.BlogPostsByNumber:
                q     = q.Where(p => p.Type == EPostType.BlogPost);
                posts = await q.OrderByDescending(p => p.CreatedOn).Take(take).ToListAsync();

                break;

            case EPostListQueryType.RootPages:
                q     = _entities.Where(p => p.RootId == 0 && p.Status == EPostStatus.Published && p.Type == EPostType.Page);
                posts = await q.OrderByDescending(p => p.CreatedOn).ToListAsync();

                break;

            case EPostListQueryType.ChildPagesForRoot:
                q     = _entities.Where(p => p.RootId == query.RootId && p.Status == EPostStatus.Published && p.Type == EPostType.Page);
                posts = await q.OrderByDescending(p => p.CreatedOn).ToListAsync();

                break;

            case EPostListQueryType.PageDrafts:
                q     = _entities.Where(p => p.Status == EPostStatus.Draft && p.Type == EPostType.Page);
                posts = await q.OrderByDescending(p => p.UpdatedOn).ToListAsync();

                break;

            case EPostListQueryType.PagesByNumber:
                q     = _entities.Where(p => p.Type == EPostType.Page);
                posts = await q.OrderByDescending(p => p.CreatedOn).Take(take).ToListAsync();

                break;
            }

            int postCount = await q.CountAsync();

            return(posts : posts, totalCount : postCount);
        }
Exemple #20
0
        /// <summary>
        /// Returns a list of posts and total post count by query or empty list if no posts found.
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public async Task <(IList <Post> posts, int totalCount)> GetListAsync(PostListQuery query)
        {
            IList <Post>      posts = null;
            int               skip  = (query.PageIndex - 1) * query.PageSize;
            int               take  = query.PageSize;
            IQueryable <Post> q     = (query.QueryType == EPostListQueryType.Pages || query.QueryType == EPostListQueryType.PagesWithChildren) ?
                                      _entities.Include(p => p.User).Where(p => p.Type == EPostType.Page) :
                                      _entities.Include(p => p.User).Include(p => p.Category).Include(p => p.PostTags).ThenInclude(p => p.Tag).Where(p => p.Type == EPostType.BlogPost);

            switch (query.QueryType)
            {
            case EPostListQueryType.BlogPosts:
                q     = q.Where(p => p.Status == EPostStatus.Published);
                posts = await q.OrderByDescending(p => p.CreatedOn).Skip(skip).Take(take).ToListAsync();

                break;

            case EPostListQueryType.BlogDrafts:
                q     = q.Where(p => p.Status == EPostStatus.Draft);
                posts = await q.OrderByDescending(p => p.UpdatedOn).ToListAsync();

                break;

            case EPostListQueryType.BlogPostsByCategory:
                var cat = await _db.Set <Category>().FirstAsync(t => t.Slug == query.CategorySlug);

                q     = q.Where(p => p.CategoryId == cat.Id && p.Status == EPostStatus.Published);
                posts = await q.OrderByDescending(p => p.CreatedOn).Skip(skip).Take(take).ToListAsync();

                break;

            case EPostListQueryType.BlogPostsByTag:
                var tag = await _db.Set <Tag>().FirstAsync(t => t.Slug == query.TagSlug);

                q = from p in q
                    from pt in p.PostTags
                    where p.Id == pt.PostId &&
                    pt.TagId == tag.Id && p.Status == EPostStatus.Published
                    select p;
                posts = await q.OrderByDescending(p => p.CreatedOn).Skip(skip).Take(take).ToListAsync();

                break;

            case EPostListQueryType.BlogPostsArchive:
                q = (query.Month.HasValue && query.Month > 0) ?
                    q.Where(p => p.CreatedOn.Year == query.Year && p.CreatedOn.Month == query.Month && p.Status == EPostStatus.Published) :
                    q.Where(p => p.CreatedOn.Year == query.Year && p.Status == EPostStatus.Published);
                posts = await q.OrderByDescending(p => p.CreatedOn).ToListAsync();

                break;

            case EPostListQueryType.BlogPostsByNumber:
                posts = await q.OrderByDescending(p => p.CreatedOn).Take(take).ToListAsync();

                break;

            case EPostListQueryType.BlogPublishedPostsByNumber:
                q     = q.Where(p => p.Status == EPostStatus.Published);
                posts = await q.OrderByDescending(p => p.CreatedOn).Take(take).ToListAsync();

                break;

            case EPostListQueryType.Pages:
                q     = q.Where(p => p.ParentId == null || p.ParentId == 0);
                posts = await q.OrderByDescending(p => p.CreatedOn).ToListAsync();

                break;

            case EPostListQueryType.PagesWithChildren:
                posts = await q.OrderByDescending(p => p.CreatedOn).ToListAsync();

                break;
            }

            int postCount = await q.CountAsync();

            return(posts, totalCount : postCount);
        }
Exemple #21
0
        public async Task <List <Page> > GetRootPagesAsync()
        {
            PostListQuery query = new PostListQuery(EPostListQueryType.RootPages);

            return(await this.QueryPagesAsync(query));
        }
Exemple #22
0
        /// <summary>
        /// Returns a list of blog drafts.
        /// </summary>
        /// <returns></returns>
        public async Task <BlogPostList> GetListForDraftsAsync()
        {
            PostListQuery query = new PostListQuery(EPostListQueryType.BlogDrafts);

            return(await QueryPostsAsync(query));
        }