// ================================================================================================ Public methods
/// <summary>
/// Retrieves all posts under given contextPath.
/// </summary>
/// <param name="contextPath">Path of context, ie. workspace.</param>
/// <returns></returns>
public static IEnumerable <PostInfo> GetPostsForWorkspace(string contextPath)
{
var queryText = string.Format("+InTree:\"{0}\" +Type:Post", contextPath);
var settings = new QuerySettings {
EnableAutofilters = false, Sort = new SortInfo[] { new SortInfo {
FieldName = "CreationDate", Reverse = true
} }
};
var posts = ContentQuery.Query(queryText, settings).Nodes.Select(n => new PostInfo(n));
// gather all journalid-s: these are ids to which post has already been created in the Content Repository
var journalIds = posts.Select(p => p.JournalId).Distinct();
var journalItems = Journals.GetItemsForWorkspace(contextPath);
// get last paths of journals. Get all journals grouped by nodeids
var lastPaths = (from j in journalItems
group j by j.NodeId into grp
select grp.First()).ToDictionary(j => j.NodeId, j => j.Wherewith);
// gather crudposts, where createdby is a valid user (not SYSTEMUSER)
// and it has not been persisted to the content repository yet (journalid is not contained in journalids above)
var crudPosts = journalItems.Select(j => new PostInfo(j, lastPaths[j.NodeId])).Where(p => p.CreatedBy != null && !journalIds.Contains(p.JournalId));
// gather likes and comments corresponding to content under this workspace
var postsFolderPath = RepositoryPath.Combine(contextPath, "Posts");
queryText = string.Format("+InTree:\"{0}\" +(Type:Comment Type:Like) -InTree:\"{1}\"", contextPath, postsFolderPath);
var contentComments = ContentQuery.Query(queryText, settings).Nodes.Select(n => PostInfo.CreateFromCommentOrLike(n)).Where(p => p != null).Distinct(new CommentsLikesComparer());
return(posts.Union(crudPosts).Union(contentComments).OrderByDescending(p => p.CreationDate));
}