|
21 | 21 | namespace DotNetNuke.Modules.ActiveForums.Controllers |
22 | 22 | { |
23 | 23 | using System; |
| 24 | + using System.Collections.Generic; |
| 25 | + using System.Linq; |
| 26 | + |
| 27 | + using DotNetNuke.Modules.ActiveForums.Extensions; |
24 | 28 |
|
25 | 29 | internal class ContentController : DotNetNuke.Modules.ActiveForums.Controllers.RepositoryControllerBase<DotNetNuke.Modules.ActiveForums.Entities.ContentInfo> |
26 | 30 | { |
@@ -51,5 +55,137 @@ public DotNetNuke.Modules.ActiveForums.Entities.ContentInfo GetById(int contentI |
51 | 55 | { |
52 | 56 | return this.GetById(contentId, -1); |
53 | 57 | } |
| 58 | + |
| 59 | + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.ReadabilityRules", "SA1118:Parameter should not span multiple lines", Justification = "Readability")] |
| 60 | + public static int GetMostLikesCount(int moduleId, HashSet<int> forumIds, int timeFrameMinutes) |
| 61 | + { |
| 62 | + if (forumIds == null || forumIds.Count == 0) |
| 63 | + { |
| 64 | + return 0; |
| 65 | + } |
| 66 | + |
| 67 | + string cachekey = string.Format(CacheKeys.MostLikesCount, moduleId, forumIds.FromHashSetToDelimitedString<int>(";"), timeFrameMinutes); |
| 68 | + var postCount = DotNetNuke.Modules.ActiveForums.DataCache.ContentCacheRetrieve(moduleId, cachekey) as int?; |
| 69 | + if (postCount == null || !postCount.HasValue) |
| 70 | + { |
| 71 | + var forumsIdsList = forumIds.FromHashSetToDelimitedString<int>(","); |
| 72 | + if (timeFrameMinutes.Equals(int.MaxValue)) |
| 73 | + { |
| 74 | + timeFrameMinutes = 0; |
| 75 | + } |
| 76 | + |
| 77 | + postCount = DotNetNuke.Data.DataContext.Instance().ExecuteQuery<int?>( |
| 78 | + System.Data.CommandType.Text, |
| 79 | + $@"SELECT COUNT(DISTINCT ContentId) |
| 80 | + FROM ( |
| 81 | + SELECT DISTINCT t.TopicId, 0 AS ReplyId, c.ContentId, ISNULL(l.LikeCount, 0) AS LikeCount, t.LastReplyDate |
| 82 | + FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Content] c |
| 83 | + INNER JOIN {{databaseOwner}}[{{objectQualifier}}activeforums_Topics] t1 |
| 84 | + ON t1.ContentId = c.ContentId |
| 85 | + INNER JOIN {{databaseOwner}}[{{objectQualifier}}vw_activeforums_TopicsView] t |
| 86 | + ON t.TopicId = t1.TopicId |
| 87 | + INNER JOIN (SELECT PostId AS ContentId, COUNT(Id) AS LikeCount FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Likes] WHERE Checked = 1 GROUP BY PostId) l ON l.ContentId = c.ContentId |
| 88 | + WHERE t.ForumId IN (SELECT value FROM STRING_SPLIT(@0, ',')) |
| 89 | + AND (@1=0 OR DATEDIFF(mi, t.LastReplyDate, GETUTCDATE()) <= @1) |
| 90 | + UNION |
| 91 | + SELECT DISTINCT r.TopicId, r.ReplyId, r.ContentId, ISNULL(l.LikeCount, 0) AS LikeCount, t.LastReplyDate |
| 92 | + FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Content] c |
| 93 | + INNER JOIN {{databaseOwner}}[{{objectQualifier}}activeforums_Replies] r |
| 94 | + ON r.ContentId = c.ContentId |
| 95 | + INNER JOIN {{databaseOwner}}[{{objectQualifier}}vw_activeforums_TopicsView] t |
| 96 | + ON t.TopicId = r.TopicId |
| 97 | + INNER JOIN (SELECT PostId AS ContentId, COUNT(Id) AS LikeCount FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Likes] WHERE Checked = 1 GROUP BY PostId) l ON l.ContentId = c.ContentId |
| 98 | + WHERE t.ForumId IN (SELECT value FROM STRING_SPLIT(@0, ',')) |
| 99 | + AND (@1=0 OR DATEDIFF(mi, t.LastReplyDate, GETUTCDATE()) <= @1) |
| 100 | + ) AS ContentIds", |
| 101 | + forumsIdsList, |
| 102 | + timeFrameMinutes).FirstOrDefault(); |
| 103 | + DotNetNuke.Modules.ActiveForums.DataCache.ContentCacheStore(moduleId, cachekey, postCount); |
| 104 | + } |
| 105 | + |
| 106 | + return postCount.Value; |
| 107 | + } |
| 108 | + |
| 109 | + [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.ReadabilityRules", "SA1118:Parameter should not span multiple lines", Justification = "Readability")] |
| 110 | + public static IEnumerable<DotNetNuke.Modules.ActiveForums.Entities.IPostInfo> GetMostLikes(int moduleId, HashSet<int> forumIds, int timeFrameMinutes, int pageId, int pageSize) |
| 111 | + { |
| 112 | + if (forumIds == null || forumIds.Count == 0) |
| 113 | + { |
| 114 | + return Enumerable.Empty<DotNetNuke.Modules.ActiveForums.Entities.IPostInfo>(); |
| 115 | + } |
| 116 | + |
| 117 | + var replyController = new DotNetNuke.Modules.ActiveForums.Controllers.ReplyController(moduleId); |
| 118 | + var topicController = new DotNetNuke.Modules.ActiveForums.Controllers.TopicController(moduleId); |
| 119 | + |
| 120 | + string cachekey = string.Format(CacheKeys.MostLikes, moduleId, forumIds.FromHashSetToDelimitedString<int>(";"), pageId, pageSize, timeFrameMinutes); |
| 121 | + IEnumerable<DotNetNuke.Modules.ActiveForums.Entities.IPostInfo> posts = DotNetNuke.Modules.ActiveForums.DataCache.ContentCacheRetrieve(moduleId, cachekey) as IEnumerable<DotNetNuke.Modules.ActiveForums.Entities.IPostInfo>; |
| 122 | + if (posts == null) |
| 123 | + { |
| 124 | + var skip = (pageId - 1) * pageSize; |
| 125 | + var forumsIdsList = forumIds.FromHashSetToDelimitedString<int>(","); |
| 126 | + if (timeFrameMinutes.Equals(int.MaxValue)) |
| 127 | + { |
| 128 | + timeFrameMinutes = 0; |
| 129 | + } |
| 130 | + |
| 131 | + var postInfo = DotNetNuke.Data.DataContext.Instance().ExecuteQuery<PostIdResult>( |
| 132 | + System.Data.CommandType.Text, |
| 133 | + $@"SELECT ContentId, TopicId, ReplyId |
| 134 | + FROM ( |
| 135 | + SELECT DISTINCT ContentIds.ContentId, ContentIds.TopicId, ContentIds.ReplyId, ContentIds.LikeCount |
| 136 | + FROM ( |
| 137 | + SELECT DISTINCT t.TopicId, NULL AS ReplyId, c.ContentId, ISNULL(l.LikeCount, 0) AS LikeCount, t.LastReplyDate |
| 138 | + FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Content] c |
| 139 | + INNER JOIN {{databaseOwner}}[{{objectQualifier}}activeforums_Topics] t1 |
| 140 | + ON t1.ContentId = c.ContentId |
| 141 | + INNER JOIN {{databaseOwner}}[{{objectQualifier}}vw_activeforums_TopicsView] t |
| 142 | + ON t.TopicId = t1.TopicId |
| 143 | + INNER JOIN (SELECT PostId AS ContentId, COUNT(Id) AS LikeCount FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Likes] WHERE Checked = 1 GROUP BY PostId) l ON l.ContentId = c.ContentId |
| 144 | + WHERE t.ForumId IN (SELECT value FROM STRING_SPLIT(@0, ',')) |
| 145 | + AND (@1=0 OR DATEDIFF(mi, t.LastReplyDate, GETUTCDATE()) <= @1) |
| 146 | + UNION |
| 147 | + SELECT DISTINCT r.TopicId, r.ReplyId, r.ContentId, ISNULL(l.LikeCount, 0) AS LikeCount, t.LastReplyDate |
| 148 | + FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Content] c |
| 149 | + INNER JOIN {{databaseOwner}}[{{objectQualifier}}activeforums_Replies] r |
| 150 | + ON r.ContentId = c.ContentId |
| 151 | + INNER JOIN {{databaseOwner}}[{{objectQualifier}}vw_activeforums_TopicsView] t |
| 152 | + ON t.TopicId = r.TopicId |
| 153 | + INNER JOIN (SELECT PostId AS ContentId, COUNT(Id) AS LikeCount FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Likes] WHERE Checked = 1 GROUP BY PostId) l ON l.ContentId = c.ContentId |
| 154 | + WHERE t.ForumId IN (SELECT value FROM STRING_SPLIT(@0, ',')) |
| 155 | + AND (@1=0 OR DATEDIFF(mi, t.LastReplyDate, GETUTCDATE()) <= @1) |
| 156 | + ) AS ContentIds |
| 157 | + INNER JOIN {{databaseOwner}}[{{objectQualifier}}vw_activeforums_TopicsView] t |
| 158 | + ON t.TopicId = ContentIds.TopicId |
| 159 | + ORDER BY ContentIds.LikeCount DESC |
| 160 | + OFFSET {skip} ROWS FETCH NEXT {pageSize} ROWS ONLY |
| 161 | + ) AS ContentIds", |
| 162 | + forumsIdsList, |
| 163 | + timeFrameMinutes); |
| 164 | + |
| 165 | + posts = postInfo.Where(postinfo => postinfo.ContentId.HasValue).Select(post => |
| 166 | + { |
| 167 | + var topic = topicController.GetById(post.TopicId.Value); |
| 168 | + if (!post.ReplyId.HasValue) |
| 169 | + { |
| 170 | + return (DotNetNuke.Modules.ActiveForums.Entities.IPostInfo)topic; |
| 171 | + } |
| 172 | + |
| 173 | + return (DotNetNuke.Modules.ActiveForums.Entities.IPostInfo)replyController.GetById(replyId: post.ReplyId.Value, topic: topic); |
| 174 | + }); |
| 175 | + |
| 176 | + DotNetNuke.Modules.ActiveForums.DataCache.ContentCacheStore(moduleId, cachekey, posts); |
| 177 | + } |
| 178 | + |
| 179 | + return posts; |
| 180 | + } |
| 181 | + |
| 182 | + private class PostIdResult |
| 183 | + { |
| 184 | + public int? ContentId { get; set; } |
| 185 | + |
| 186 | + public int? TopicId { get; set; } |
| 187 | + |
| 188 | + public int? ReplyId { get; set; } |
| 189 | + } |
54 | 190 | } |
55 | 191 | } |
0 commit comments