-
Notifications
You must be signed in to change notification settings - Fork 5
/
BlogPostPagesQuery.cs
81 lines (72 loc) · 4.1 KB
/
BlogPostPagesQuery.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using CMS.ContentEngine;
using Kentico.Community.Portal.Core.Operations;
namespace Kentico.Community.Portal.Web.Features.Blog;
public record BlogPostPagesByWebPageGUIDQuery(Guid[] WebPageGUIDs, string ChannelName) : IQuery<BlogPostPagesQueryResponse>, ICacheByValueQuery, IChannelContentQuery
{
public string CacheValueKey => string.Join(",", WebPageGUIDs);
}
public record BlogPostPagesQueryResponse(IReadOnlyList<BlogPostPage> Items);
public class BlogPostPagesByWebPageGUIDQueryHandler(ContentItemQueryTools tools) : ContentItemQueryHandler<BlogPostPagesByWebPageGUIDQuery, BlogPostPagesQueryResponse>(tools)
{
public override async Task<BlogPostPagesQueryResponse> Handle(BlogPostPagesByWebPageGUIDQuery request, CancellationToken cancellationToken = default)
{
var b = new ContentItemQueryBuilder().ForContentType(BlogPostPage.CONTENT_TYPE_NAME, queryParameters =>
{
_ = queryParameters
.ForWebsite(request.ChannelName)
.Where(w => w.WhereIn(nameof(WebPageFields.WebPageItemGUID), request.WebPageGUIDs))
.WithLinkedItems(2);
});
var pages = await Executor.GetWebPageResult(b, WebPageMapper.Map<BlogPostPage>, DefaultQueryOptions, cancellationToken);
return new([.. pages.OrderBy(p => Array.IndexOf(request.WebPageGUIDs, p.SystemFields.WebPageItemGUID))]);
}
protected override ICacheDependencyKeysBuilder AddDependencyKeys(BlogPostPagesByWebPageGUIDQuery query, BlogPostPagesQueryResponse result, ICacheDependencyKeysBuilder builder) =>
builder.Collection(
result.Items,
(page, builder) => builder
.WebPage(page)
.Collection(
page.BlogPostPageBlogPostContent,
(content, builder) => builder
.ContentItem(content)
.Collection(
content.BlogPostContentAuthor,
(author, builder) => builder.ContentItem(author)
.Collection(
author.AuthorContentPhotoMediaFileImage,
(image, builder) => builder.Media(image)))));
}
public record BlogPostPagesByWebPageIDQuery(int[] WebPageIDs, string ChannelName) : IQuery<BlogPostPagesQueryResponse>, ICacheByValueQuery, IChannelContentQuery
{
public string CacheValueKey => string.Join(",", WebPageIDs);
}
public class BlogPostPagesByWebPageIDQueryHandler(ContentItemQueryTools tools) : ContentItemQueryHandler<BlogPostPagesByWebPageIDQuery, BlogPostPagesQueryResponse>(tools)
{
public override async Task<BlogPostPagesQueryResponse> Handle(BlogPostPagesByWebPageIDQuery request, CancellationToken cancellationToken = default)
{
var b = new ContentItemQueryBuilder().ForContentType(BlogPostPage.CONTENT_TYPE_NAME, queryParameters =>
{
_ = queryParameters
.ForWebsite(request.ChannelName)
.Where(w => w.WhereIn(nameof(WebPageFields.WebPageItemID), request.WebPageIDs))
.WithLinkedItems(2);
});
var pages = await Executor.GetWebPageResult(b, WebPageMapper.Map<BlogPostPage>, DefaultQueryOptions, cancellationToken);
return new(pages.ToList());
}
protected override ICacheDependencyKeysBuilder AddDependencyKeys(BlogPostPagesByWebPageIDQuery query, BlogPostPagesQueryResponse result, ICacheDependencyKeysBuilder builder) =>
builder.Collection(
result.Items,
(page, builder) => builder
.WebPage(page)
.Collection(
page.BlogPostPageBlogPostContent,
(content, builder) => builder
.ContentItem(content)
.Collection(
content.BlogPostContentAuthor,
(author, builder) => builder.ContentItem(author)
.Collection(
author.AuthorContentPhotoMediaFileImage,
(image, builder) => builder.Media(image)))));
}