From 3ab3f1ec659567cee5be0077677435dacd1ef4b0 Mon Sep 17 00:00:00 2001 From: Anders Bjerner Date: Thu, 3 May 2018 20:45:26 +0200 Subject: [PATCH 01/23] Blogs: the "Id" property of the "BlogInfo" is now a GUID to ensure that all IDs follow the same pattern --- OurUmbraco/Community/BlogPosts/BlogInfo.cs | 4 ++-- OurUmbraco/Community/BlogPosts/BlogPostsService.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/OurUmbraco/Community/BlogPosts/BlogInfo.cs b/OurUmbraco/Community/BlogPosts/BlogInfo.cs index 892ecbb8e2..9cfb1c0cf1 100644 --- a/OurUmbraco/Community/BlogPosts/BlogInfo.cs +++ b/OurUmbraco/Community/BlogPosts/BlogInfo.cs @@ -10,7 +10,7 @@ namespace OurUmbraco.Community.BlogPosts { /// public class BlogInfo { - public string Id { get; private set; } + public Guid Id { get; private set; } public string Title { get; private set; } @@ -35,7 +35,7 @@ public bool HasLogoUrl { public Encoding Encoding { get; set; } private BlogInfo(JObject obj) { - Id = obj.GetString("id"); + Id = obj.GetString("id", Guid.Parse); Title = obj.GetString("title"); Url = obj.GetString("url"); RssUrl = obj.GetString("rss"); diff --git a/OurUmbraco/Community/BlogPosts/BlogPostsService.cs b/OurUmbraco/Community/BlogPosts/BlogPostsService.cs index 224b7b639c..2af067f9b6 100644 --- a/OurUmbraco/Community/BlogPosts/BlogPostsService.cs +++ b/OurUmbraco/Community/BlogPosts/BlogPostsService.cs @@ -82,7 +82,7 @@ public BlogRssItem[] GetBlogPosts(PerformContext context) var rssChannel = new BlogRssChannel { - Id = blog.Id, + Id = blog.Id.ToString(), Title = channelTitle, Link = channelLink }; @@ -232,7 +232,7 @@ public BlogCachedRssItem[] GetCachedBlogPosts(int take, int numberOfPostsPerBlog if (File.Exists(JsonFile) == false) return new BlogCachedRssItem[0]; - var blogs = GetBlogs().ToDictionary(x => x.Id); + var blogs = GetBlogs().ToDictionary(x => x.Id.ToString()); try { From 13d8bc09bb6e7ff418906c0d450f010bb47547d0 Mon Sep 17 00:00:00 2001 From: Anders Bjerner Date: Thu, 3 May 2018 20:53:54 +0200 Subject: [PATCH 02/23] Blogs: The "BlogRssItem" class should include "Guid" and "Description" properties with the values from the original RSS item - the "Guid" property can be used to identifying the RSS item when saved to the database. -t he "Description" property is useful as we can then search the description rather than just the title --- OurUmbraco/Community/BlogPosts/BlogRssItem.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/OurUmbraco/Community/BlogPosts/BlogRssItem.cs b/OurUmbraco/Community/BlogPosts/BlogRssItem.cs index 8b83e5037b..da574f7e0a 100644 --- a/OurUmbraco/Community/BlogPosts/BlogRssItem.cs +++ b/OurUmbraco/Community/BlogPosts/BlogRssItem.cs @@ -9,6 +9,9 @@ public class BlogRssItem { [JsonProperty("title")] public string Title { get; set; } + [JsonProperty("guid")] + public string Guid { get; set; } + [JsonProperty("link")] public string Link { get; set; } @@ -16,6 +19,14 @@ public class BlogRssItem { [JsonConverter(typeof(IsoDateTimeConverter))] public DateTimeOffset PublishedDate { get; set; } + [JsonProperty("description")] + public string Description { get; set; } + + public bool HasDescription + { + get { return !String.IsNullOrWhiteSpace(Description); } + } + [JsonProperty("channel")] public BlogRssChannel Channel { get; set; } From dcfe22e1d5a02396d2be8dbc7e16043c2176c737 Mon Sep 17 00:00:00 2001 From: Anders Bjerner Date: Thu, 3 May 2018 20:57:05 +0200 Subject: [PATCH 03/23] Blogs: Added POCO for a database RSS item --- .../Community/BlogPosts/BlogDatabaseItem.cs | 48 +++++++++++++++++++ OurUmbraco/OurUmbraco.csproj | 1 + 2 files changed, 49 insertions(+) create mode 100644 OurUmbraco/Community/BlogPosts/BlogDatabaseItem.cs diff --git a/OurUmbraco/Community/BlogPosts/BlogDatabaseItem.cs b/OurUmbraco/Community/BlogPosts/BlogDatabaseItem.cs new file mode 100644 index 0000000000..63921123ab --- /dev/null +++ b/OurUmbraco/Community/BlogPosts/BlogDatabaseItem.cs @@ -0,0 +1,48 @@ +using System; +using Newtonsoft.Json; +using Skybrud.Essentials.Json; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.DatabaseAnnotations; + +namespace OurUmbraco.Community.BlogPosts +{ + + [TableName(TableName)] + [PrimaryKey(PrimaryKey, autoIncrement = false)] + [ExplicitColumns] + public class BlogDatabaseItem + { + + public const string TableName = "CommunityBlogItems"; + + public const string PrimaryKey = "Id"; + + private BlogRssItem _data; + + [Column(PrimaryKey)] + [PrimaryKeyColumn(AutoIncrement = false)] + public string Id { get; set; } + + [Column("BlogId")] + public string BlogId { get; set; } + + [Column("PubDate")] + public DateTime PublishedDate { get; set; } + + [Column("Title")] + public string Title { get; set; } + + [Column("Data")] + [SpecialDbType(SpecialDbTypes.NTEXT)] + public string DataRaw { get; set; } + + [Ignore] + public BlogRssItem Data + { + get { return _data ?? JsonUtils.ParseJsonObject(DataRaw); } + set { _data = value; DataRaw = JsonConvert.SerializeObject(_data, Formatting.None); } + } + + } + +} \ No newline at end of file diff --git a/OurUmbraco/OurUmbraco.csproj b/OurUmbraco/OurUmbraco.csproj index d3f0af9926..ee845c39e1 100644 --- a/OurUmbraco/OurUmbraco.csproj +++ b/OurUmbraco/OurUmbraco.csproj @@ -424,6 +424,7 @@ + From b5e62ffb4523c172679cd733da127aa01644b13b Mon Sep 17 00:00:00 2001 From: Anders Bjerner Date: Thu, 3 May 2018 20:58:06 +0200 Subject: [PATCH 04/23] Blogs: Added logic for retrieving blog posts from the database --- .../Community/BlogPosts/BlogPostsService.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/OurUmbraco/Community/BlogPosts/BlogPostsService.cs b/OurUmbraco/Community/BlogPosts/BlogPostsService.cs index 2af067f9b6..de5b262d0a 100644 --- a/OurUmbraco/Community/BlogPosts/BlogPostsService.cs +++ b/OurUmbraco/Community/BlogPosts/BlogPostsService.cs @@ -14,6 +14,7 @@ using Skybrud.Essentials.Xml.Extensions; using Umbraco.Core; using Umbraco.Core.Logging; +using Umbraco.Core.Persistence; namespace OurUmbraco.Community.BlogPosts { @@ -22,6 +23,14 @@ public class BlogPostsService { private static readonly string JsonFile = HostingEnvironment.MapPath("~/App_Data/TEMP/CommunityBlogPosts.json"); + protected UmbracoDatabase Database { get; private set; } + + public BlogPostsService() + { + Database = ApplicationContext.Current.DatabaseContext.Database; + } + + public BlogInfo[] GetBlogs() { @@ -260,6 +269,16 @@ public BlogCachedRssItem[] GetCachedBlogPosts(int take, int numberOfPostsPerBlog return new BlogCachedRssItem[0]; } } + + public BlogDatabaseItem[] GetAllBlogItemsFromDatabase() + { + + // Get a list of all existing blog items and add them to a dictionary + Sql sqæl = new Sql().Select("*").From(BlogDatabaseItem.TableName); + + return Database.Fetch(sqæl).ToArray(); + + } public void UpdateBlogPostsJsonFile() { From e1eec34887bf4d2ead33ae93a559d6abc19ec28b Mon Sep 17 00:00:00 2001 From: Anders Bjerner Date: Thu, 3 May 2018 21:13:09 +0200 Subject: [PATCH 05/23] Blogs: added custom Examine indexer for blog posts --- OurUmbraco.Site/config/ExamineIndex.config | 16 +++++ OurUmbraco.Site/config/ExamineSettings.config | 13 +++- .../Our/Examine/BlogItemsIndexDataService.cs | 60 +++++++++++++++++++ OurUmbraco/OurUmbraco.csproj | 1 + 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 OurUmbraco/Our/Examine/BlogItemsIndexDataService.cs diff --git a/OurUmbraco.Site/config/ExamineIndex.config b/OurUmbraco.Site/config/ExamineIndex.config index 91a8139eae..0da9a65c17 100644 --- a/OurUmbraco.Site/config/ExamineIndex.config +++ b/OurUmbraco.Site/config/ExamineIndex.config @@ -111,5 +111,21 @@ More information and documentation can be found on CodePlex: http://umbracoexami + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OurUmbraco.Site/config/ExamineSettings.config b/OurUmbraco.Site/config/ExamineSettings.config index 25369606d1..2177fbd279 100644 --- a/OurUmbraco.Site/config/ExamineSettings.config +++ b/OurUmbraco.Site/config/ExamineSettings.config @@ -47,6 +47,13 @@ More information and documentation can be found on CodePlex: http://umbracoexami analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net" indexTypes="PullRequest"/> + + @@ -71,11 +78,15 @@ More information and documentation can be found on CodePlex: http://umbracoexami + + diff --git a/OurUmbraco/Our/Examine/BlogItemsIndexDataService.cs b/OurUmbraco/Our/Examine/BlogItemsIndexDataService.cs new file mode 100644 index 0000000000..9e9d483908 --- /dev/null +++ b/OurUmbraco/Our/Examine/BlogItemsIndexDataService.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Web.Hosting; +using Examine; +using Examine.LuceneEngine; +using OurUmbraco.Community.BlogPosts; +using OurUmbraco.Documentation.Busineslogic.GithubSourcePull; + +namespace OurUmbraco.Our.Examine +{ + /// + /// Used to index the documentation + /// + public class BlogItemsIndexDataService : ISimpleDataService + { + + public IEnumerable GetAllData(string indexType) + { + var service = new BlogPostsService(); + + var items = service.GetAllBlogItemsFromDatabase(); + + int i = 0; + + foreach (var item in items) + { + i++; + var simpleDataSet = new SimpleDataSet { NodeDefinition = new IndexedNode(), RowData = new Dictionary() }; + simpleDataSet = MapBlogItemToSimpleDataIndexItem(item, simpleDataSet, i, indexType); + yield return simpleDataSet; + } + + } + + + public static SimpleDataSet MapBlogItemToSimpleDataIndexItem(BlogDatabaseItem item, SimpleDataSet simpleDataSet, int index, string indexType) + { + + simpleDataSet.NodeDefinition.NodeId = index; + simpleDataSet.NodeDefinition.Type = indexType; + + simpleDataSet.RowData.Add("body", String.Empty); + simpleDataSet.RowData.Add("nodeName", ExamineHelper.RemoveSpecialCharacters(item.Title)); + simpleDataSet.RowData.Add("nodeTypeAlias", "blogItem"); + + simpleDataSet.RowData.Add("createDate", item.PublishedDate.ToString("yyyy-MM-dd HH:mm:ss")); + simpleDataSet.RowData.Add("updateDate", item.PublishedDate.ToString("yyyy-MM-dd HH:mm:ss")); + + simpleDataSet.RowData.Add("blogId", item.BlogId); + simpleDataSet.RowData.Add("data", item.DataRaw); + simpleDataSet.RowData.Add("url", item.Data.Link); + + return simpleDataSet; + + } + + + } +} \ No newline at end of file diff --git a/OurUmbraco/OurUmbraco.csproj b/OurUmbraco/OurUmbraco.csproj index ee845c39e1..69c23ddbc1 100644 --- a/OurUmbraco/OurUmbraco.csproj +++ b/OurUmbraco/OurUmbraco.csproj @@ -587,6 +587,7 @@ + From 7818ecf926866f04984bf3608127f4bc54d9c845 Mon Sep 17 00:00:00 2001 From: Anders Bjerner Date: Thu, 3 May 2018 21:18:37 +0200 Subject: [PATCH 06/23] Blogs: integrated blog posts in the global search --- OurUmbraco.Site/OurUmbraco.Site.csproj | 1 + .../Views/Partials/Search/BlogItem.cshtml | 30 +++++++++++++ .../Views/Partials/SearchResults.cshtml | 44 ++++++++++++++++++- OurUmbraco/OurUmbraco.csproj | 1 + OurUmbraco/Search/BlogItemSearchResult.cs | 23 ++++++++++ 5 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 OurUmbraco.Site/Views/Partials/Search/BlogItem.cshtml create mode 100644 OurUmbraco/Search/BlogItemSearchResult.cs diff --git a/OurUmbraco.Site/OurUmbraco.Site.csproj b/OurUmbraco.Site/OurUmbraco.Site.csproj index 83a4802b16..c8c907dc4b 100644 --- a/OurUmbraco.Site/OurUmbraco.Site.csproj +++ b/OurUmbraco.Site/OurUmbraco.Site.csproj @@ -4394,6 +4394,7 @@ + web.config diff --git a/OurUmbraco.Site/Views/Partials/Search/BlogItem.cshtml b/OurUmbraco.Site/Views/Partials/Search/BlogItem.cshtml new file mode 100644 index 0000000000..8c015ffa10 --- /dev/null +++ b/OurUmbraco.Site/Views/Partials/Search/BlogItem.cshtml @@ -0,0 +1,30 @@ +@using OurUmbraco.Community.BlogPosts +@inherits UmbracoViewPage + +@{ + + if (Model.Blog == null) + { + return; + } + +} + +
  • + +
    + +
    +
    +
    + @Model.Item.Title + (via @Model.Blog.Title) +
    + Published: @Model.Item.PublishedDate.ToString("MMMM dd, yyyy") + @if (Model.Item.HasDescription) + { +
    @Umbraco.Truncate(Model.Item.Description, 300)
    + } +
    +
    +
  • \ No newline at end of file diff --git a/OurUmbraco.Site/Views/Partials/SearchResults.cshtml b/OurUmbraco.Site/Views/Partials/SearchResults.cshtml index f9ea7250e4..3e99a0e106 100644 --- a/OurUmbraco.Site/Views/Partials/SearchResults.cshtml +++ b/OurUmbraco.Site/Views/Partials/SearchResults.cshtml @@ -1,6 +1,15 @@ -@using OurUmbraco.Our +@using OurUmbraco.Community.BlogPosts +@using OurUmbraco.Our +@using OurUmbraco.Search +@using Skybrud.Essentials.Json @model OurUmbraco.Our.Models.SearchResultContentModel +@{ + + BlogPostsService blogs = null; + +} +
    @@ -69,7 +78,38 @@ }