/// <summary> /// Imports posts into the Sitecore /// </summary> /// <param name="postList"></param> public void ImportPosts(PercolatePostList postList) { try { Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase(Sitecore.Configuration.Settings.GetSetting("Percolate.Sitecore.MasterDBName")); BlogHomeItem blogItem = master.Items.GetItem(SettingsManager.GetSettingsValue("Blog Id")); //check blog exists if (blogItem != null) { Template template = TemplateManager.GetTemplate(blogItem.BlogSettings.EntryTemplateID, master); BranchItem masterBranch = master.Branches.GetMaster(Sitecore.Modules.WeBlog.Settings.BlogBranchIDString); int successCount = 0; Log.Info("Percolate Module (PercolateManager ImportPosts()) - Importing posts into Sitecore: " + postList.Count + " posts found", this); foreach (PercolatePost post in postList) { try { //TODO: lookup the post based on the id first string postTitle = ItemUtil.ProposeValidItemName(SettingsManager.GetFieldMapping(PercolateConstants.Fields.Title, post)); //Switch to user we wish to post as Sitecore.Security.Accounts.User scUser = Sitecore.Security.Accounts.User.FromName(post.User.Name, false); using (new UserSwitcher(scUser)) { if (!_testMode) { //add post EntryItem entryItem = ItemManager.AddFromTemplate(postTitle, template.ID, blogItem); //add field values entryItem.BeginEdit(); entryItem.Title.Field.Value = postTitle; entryItem.Content.Field.Value = SettingsManager.GetFieldMapping(PercolateConstants.Fields.Content, post); entryItem.Tags.Field.Value = SettingsManager.GetFieldMapping(PercolateConstants.Fields.Tags, post); entryItem.InnerItem.Fields[FieldIDs.Created].Value = DateUtil.ToIsoDate(DateTime.Parse(post.CreatedAt)); //add image and assign to field if (!string.IsNullOrEmpty(post.Media.Src)) { MediaItem image = CreateMedia(post); AssignMediaItem(entryItem.InnerItem.Fields[PercolateConstants.Fields.Image], image); } //add categories if (post.Categories != null) { if (post.Categories.Count > 0) { List<string> cats = new List<string>(); foreach (PercolateCategory category in post.Categories) { try { CategoryItem categoryItem = ManagerFactory.CategoryManagerInstance.Add(category.Name, blogItem); cats.Add(categoryItem.ID.ToString()); } catch (Exception ex) { Log.Error( "Percolate Module (PercolateManager ImportPosts()) - caused an unhandled exception", ex, this); } } if (cats.Count > 0) { entryItem.Category.Field.Value = string.Join("|", cats.ToArray()); } } } entryItem.EndEdit(); successCount += 1; } else { Log.Info( "Percolate Module (PercolateManager ImportPosts()) - post details:" + " title > " + postTitle + ", " + " body (truncated) > " + SettingsManager.GetFieldMapping(PercolateConstants.Fields.Content, post).Substring(0, 40) + "..., " + " tags > " + SettingsManager.GetFieldMapping(PercolateConstants.Fields.Tags, post) + ", " + " date > " + DateUtil.ToIsoDate(DateTime.Parse(post.CreatedAt)) + ", " , this); } } } catch (Exception ex) { Log.Error("Percolate Module (PercolateManager ImportPosts()) - post: " + post.Title + " - caused an unhandled exception", ex, this); } } if (!_testMode) { //update the last run date SettingsManager.SetSettingsValue(PercolateConstants.SettingsFields.LastRunDate, DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss")); } Log.Info("Percolate Module (PercolateManager ImportPosts()) - Import Complete - " + successCount + " posts imported", this); if (_testMode) { Log.Info("Percolate Module (PercolateManager ImportPosts()) - TEST MODE COMPLETE", this); } } else { Log.Error("Percolate Module (Percolate Manager Importposts()) - You must enter a valid Blog Id", new Exception(), this); } } catch (Exception ex) { Log.Error("Percolate Module (PercolateManager ImportPosts()) - caused an unhandled exception", ex, this); } }
/// <summary> /// get posts from the Percolate API /// </summary> /// <returns></returns> public PercolatePostList GetPosts() { Log.Info("Percolate Module (Percolate Manager GetPosts()) - Getting posts from Percolate", this); PercolatePostList totalPostList = new PercolatePostList(); PercolatePostList postList = new PercolatePostList(); try { //get paramaters from settings and Sitecore string toDays = Configuration.Settings.GetSetting("Percolate.ImportDateToDays"); string startDateSetting = SettingsManager.GetSettingsValue(PercolateConstants.SettingsFields.ImportFromDate); string startDate = DateTime.Parse(startDateSetting).ToString("yyyy-MM-dd"); string endDate = DateTime.Now.AddDays(int.Parse(toDays)).ToString("yyyy-MM-dd"); string channelId = SettingsManager.GetSettingsValue(PercolateConstants.SettingsFields.ChannelId); string licenceId = SettingsManager.GetSettingsValue(PercolateConstants.SettingsFields.LicenceId); string apiKey = SettingsManager.GetSettingsValue(PercolateConstants.SettingsFields.APIKey); string limit = Configuration.Settings.GetSetting("Percolate.PostLimit"); //check API Key and Licence Id are populated if (!string.IsNullOrEmpty(apiKey) && !string.IsNullOrEmpty(licenceId)) { //pick up last run date and move startdate to this if it is set. string lastRunDateSetting = SettingsManager.GetSettingsValue(PercolateConstants.SettingsFields.LastRunDate); if (!string.IsNullOrEmpty(lastRunDateSetting)) { startDate = DateTime.Parse(lastRunDateSetting).ToString("yyyy-MM-dd"); } Log.Info("Percolate Module (Percolate Manager GetPosts()) - Start Date: " + startDate, this); //build request url string reqbaseUrl = Configuration.Settings.GetSetting("Percolate.Weblog.BaseUrl"); string reqPostUrl = Configuration.Settings.GetSetting("Percolate.Weblog.PostSetApiUrl"); string reqApiUrl = string.Format("{0}?api_key={1}&license_id={2}", reqPostUrl, apiKey, licenceId); string reqParams = string.Format( "&created_at_start={0}&created_at_end={1}&order_direction=desc&limit={2}", startDate, endDate, limit); if (!string.IsNullOrEmpty(channelId)) { reqParams = reqParams + string.Format("&channel_ids={0}", channelId); } //call the API 1 or more times (depending on pages found) postList = MakeAPIRequest(string.Format("{0}{1}{2}", reqbaseUrl, reqApiUrl, reqParams)); if (postList != null) { //get pages int totalPages = (int.Parse(postList.Paging.Total) + int.Parse(postList.Paging.Limit) - 1)/ int.Parse(postList.Paging.Limit); //add to main list if (postList.Count > 0) { totalPostList.AddRange(postList); totalPostList.Paging = postList.Paging; } //if totalPages is more than 1 then get the next pages for (int i = 1; i < totalPages; i++) { int pageNo = i + 1; //call the API again postList = MakeAPIRequest(string.Format("{0}{1}{2}&page={3}", reqbaseUrl, reqApiUrl, reqParams, pageNo)); if (postList.Count > 0) { //add to main list totalPostList.AddRange(postList); } } } } else { Log.Error("Percolate Module (Percolate Manager Getposts()) - You must enter your API Key and Licence Id", new Exception(), this); } } catch (WebException ex) { string resp; using (Stream dataStream = ex.Response.GetResponseStream()) { using (StreamReader reader = new StreamReader(dataStream)) { resp = reader.ReadToEnd(); } } Log.Error("Percolate Module (Percolate Manager Getposts()) - Web Request - caused an unhandled exception: " + resp, ex, this); } catch (Exception ex) { Log.Error("Percolate Module (Percolate Manager Getposts()) - caused an unhandled exception", ex, this); } return totalPostList; }
/// <summary> /// Calls Percolate API /// </summary> /// <param name="requestString"></param> /// <returns></returns> public PercolatePostList MakeAPIRequest(string requestString) { PercolatePostList postList = new PercolatePostList(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestString); request.Method = WebRequestMethods.Http.Get; request.Accept = "application/json"; // Get response using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); // Serialise to object var json = reader.ReadToEnd(); var paging = JObject.Parse(json).SelectToken("pagination").ToString(); var pagingInfo = (PercolatePaging)JsonConvert.DeserializeObject(paging.ToString(), typeof(PercolatePaging)); var posts = JObject.Parse(json).SelectToken("data").ToString(); if (posts != null) { postList = (PercolatePostList)JsonConvert.DeserializeObject(posts.ToString(), typeof(PercolatePostList)); postList.Paging = pagingInfo; } } return postList; }