private List<BlogPostImportResult> ImportBlogPosts(IPrincipal principal, IDictionary<string, Guid> authors, IDictionary<string, Guid> categories,
            List<BlogMLPost> blogs, List<BlogPostImportResult> modifications, bool createRedirects = false)
        {
            var createdBlogPosts = new List<BlogPostImportResult>();
            if (blogs != null)
            {
                foreach (var blogML in blogs)
                {
                    try
                    {
                        var oldUrl = FixUrl(blogML.PostUrl);
                        var blogPostModel = MapViewModel(blogML, true, modifications.First(m => m.Id == blogML.ID));

                        BlogPostImportResult blogPostResult;
                        if (!ValidateModel(blogPostModel, blogML, out blogPostResult))
                        {
                            createdBlogPosts.Add(blogPostResult);
                            continue;
                        }

                        if (blogML.Authors != null && blogML.Authors.Count > 0)
                        {
                            blogPostModel.AuthorId = authors[blogML.Authors[0].Ref];
                        }
                        if (blogML.Categories != null && blogML.Categories.Count > 0)
                        {
                            blogPostModel.CategoryId = categories[blogML.Categories[0].Ref];
                        }

                        var blogPost = blogService.SaveBlogPost(blogPostModel, principal);
                        
                        blogPostResult = new BlogPostImportResult
                                {
                                    Title = blogPost.Title, 
                                    PageUrl = blogPost.PageUrl, 
                                    Id = blogPost.Id.ToString(), 
                                    Success = true
                                };
                        createdBlogPosts.Add(blogPostResult);

                        if (createRedirects && oldUrl != blogPostModel.BlogUrl)
                        {
                            var redirect = redirectService.GetPageRedirect(oldUrl);
                            if (redirect == null)
                            {
                                redirect = redirectService.CreateRedirectEntity(oldUrl, blogPostModel.BlogUrl);
                                repository.Save(redirect);
                                unitOfWork.Commit();
                                Events.PageEvents.Instance.OnRedirectCreated(redirect);
                            }
                        }
                    }
                    catch (Exception exc)
                    {
                        var failedBlogPost = new BlogPostImportResult
                                             {
                                                 Title = blogML.Title,
                                                 PageUrl = blogML.PostUrl, 
                                                 Success = false,
                                                 ErrorMessage = exc.Message,
                                                 Id = blogML.ID
                                             };
                        createdBlogPosts.Add(failedBlogPost);

                        Log.Error("Failed to import blog post.", exc);
                    }
                }
            }

            return createdBlogPosts;
        }
        public List<BlogPostImportResult> ValidateImport(BlogMLBlog blogPosts, bool useOriginalUrls = false)
        {
            List<BlogPostImportResult> result = new List<BlogPostImportResult>();
            var unsavedUrls = new List<string>();

            if (blogPosts != null && blogPosts.Posts != null)
            {
                foreach (var blogML in blogPosts.Posts)
                {
                    var blogPostModel = MapViewModel(blogML, useOriginalUrls, null, unsavedUrls);
                    unsavedUrls.Add(blogPostModel.BlogUrl);

                    BlogPostImportResult blogPost;
                    if (!ValidateModel(blogPostModel, blogML, out blogPost))
                    {
                        result.Add(blogPost);
                        continue;
                    }

                    blogPost = new BlogPostImportResult
                        {
                            Title = blogPostModel.Title,
                            PageUrl = blogPostModel.BlogUrl,
                            Success = true,
                            Id = blogML.ID
                        };
                    result.Add(blogPost);
                }
            }

            return result;
        }
        private bool ValidateModel(BlogPostViewModel blogPostModel, BlogMLPost blogML, out BlogPostImportResult failedResult)
        {
            failedResult = null;

            if (string.IsNullOrWhiteSpace(blogML.ID))
            {
                failedResult = new BlogPostImportResult
                {
                    Title = blogML.Title,
                    PageUrl = blogML.PostUrl,
                    Success = false,
                    ErrorMessage = BlogGlobalization.ImportBlogPosts_ImportingBlogPostIdIsNotSet_Message,
                    Id = blogML.ID
                };
                return false;
            }

            var validationContext = new ValidationContext(blogPostModel, null, null);
            var validationResults = new List<ValidationResult>();
            if (!Validator.TryValidateObject(blogPostModel, validationContext, validationResults, true)
                && validationResults.Count > 0)
            {
                failedResult = new BlogPostImportResult
                    {
                        Title = blogML.Title,
                        PageUrl = blogML.PostUrl,
                        Success = false,
                        ErrorMessage = validationResults[0].ErrorMessage,
                        Id = blogML.ID
                    };
                return false;
            }

            try
            {
                pageService.ValidatePageUrl(blogPostModel.BlogUrl);
            }
            catch (Exception exc)
            {
                failedResult = new BlogPostImportResult
                {
                    Title = blogML.Title,
                    PageUrl = blogML.PostUrl,
                    Success = false,
                    ErrorMessage = exc.Message,
                    Id = blogML.ID
                };
                return false;
            }

            return true;
        }
        private BlogPostViewModel MapViewModel(BlogMLPost blogML, bool useOriginalUrls, BlogPostImportResult modification = null, List<string> unsavedUrls = null)
        {
            var model = new BlogPostViewModel
                    {
                        Title = blogML.PostName ?? blogML.Title,
                        IntroText = blogML.Excerpt != null ? blogML.Excerpt.UncodedText : null,
                        LiveFromDate = blogML.DateCreated.Date,
                        LiveToDate = null,
                        DesirableStatus = ContentStatus.Published,
                        Content = blogML.Content != null ? blogML.Content.UncodedText : null
                    };

            if (modification != null)
            {
                model.BlogUrl = modification.PageUrl;
                model.Title = modification.Title;
            }
            else if (useOriginalUrls)
            {
                model.BlogUrl = blogService.CreateBlogPermalink(FixUrl(blogML.PostUrl), unsavedUrls);
            }
            else
            {
                model.BlogUrl = blogService.CreateBlogPermalink(blogML.Title, unsavedUrls);
            }

            return model;
        }
Example #5
0
        private List<BlogPostImportResult> ImportBlogPosts(IPrincipal principal, IDictionary<string, Guid> authors, IDictionary<string, Guid> categories,
            List<BlogMLPost> blogs, List<BlogPostImportResult> modifications, bool createRedirects = false)
        {
            var createdBlogPosts = new List<BlogPostImportResult>();
            if (blogs != null)
            {
                foreach (var blogML in blogs)
                {
                    BlogPostViewModel blogPostModel = null;

                    try
                    {
                        blogPostModel = MapViewModel(blogML, modifications.First(m => m.Id == blogML.ID));

                        BlogPostImportResult blogPostResult = null;
                        if (!ValidateModel(blogPostModel, blogML, out blogPostResult))
                        {
                            createdBlogPosts.Add(blogPostResult);
                            continue;
                        }

                        if (blogML.Authors != null && blogML.Authors.Count > 0)
                        {
                            blogPostModel.AuthorId = authors[blogML.Authors[0].Ref];
                        }
                        if (blogML.Categories != null && blogML.Categories.Count > 0 && categories != null && categories.Count > 0)
                        {
                            for (var i = 0; i < blogML.Categories.Count; i++)
                            {
                                var category = blogML.Categories[i];

                                if (blogPostModel.Categories == null)
                                {
                                    blogPostModel.Categories = new List<LookupKeyValue>();
                                }

                                if (categories.ContainsKey(category.Ref))
                                {
                                    blogPostModel.Categories.Add(new LookupKeyValue() { Key = categories[category.Ref].ToLowerInvariantString() });
                                }
                            }                            
                        }

                        string[] error;
                        var blogPost = blogService.SaveBlogPost(blogPostModel, null, principal, out error);
                        if (blogPost == null)
                        {
                            blogPostResult = new BlogPostImportResult
                            {
                                Title = blogML.PostName ?? blogML.Title,
                                Success = false,
                                ErrorMessage = error.Length > 0 ? error[0] : string.Empty
                            };
                            createdBlogPosts.Add(blogPostResult);

                            continue;
                        }
                        
                        blogPostResult = new BlogPostImportResult
                                {
                                    Title = blogML.PostName ?? blogML.Title, 
                                    PageUrl = blogPost.PageUrl, 
                                    Id = blogPost.Id.ToString(), 
                                    Success = true
                                };
                        createdBlogPosts.Add(blogPostResult);

                        if (createRedirects)
                        {
                            var oldUrl = TryValidateOldUrl(blogML.PostUrl);
                            if (oldUrl != null && oldUrl != blogPostModel.BlogUrl)
                            {
                                var redirect = redirectService.GetPageRedirect(oldUrl);
                                if (redirect == null)
                                {
                                    redirect = redirectService.CreateRedirectEntity(oldUrl, blogPostModel.BlogUrl);
                                    repository.Save(redirect);
                                    unitOfWork.Commit();
                                    Events.PageEvents.Instance.OnRedirectCreated(redirect);
                                }
                                else
                                {
                                    blogPostResult.WarnMessage = string.Format(BlogGlobalization.ImportBlogPosts_RedirectWasAlreadyCreatedFor_Message, blogML.PostUrl);
                                }
                            }
                            else if (oldUrl == null)
                            {
                                blogPostResult.WarnMessage = string.Format(BlogGlobalization.ImportBlogPosts_FailedToCreateRedirectFor_Message, blogML.PostUrl);
                            }
                        }
                    }
                    catch (Exception exc)
                    {
                        var failedBlogPost = new BlogPostImportResult
                                             {
                                                 Title = blogML.PostName ?? blogML.Title,
                                                 PageUrl = blogPostModel != null && blogPostModel.BlogUrl != null ? blogPostModel.BlogUrl : blogML.PostUrl, 
                                                 Success = false,
                                                 ErrorMessage = exc.Message,
                                                 Id = blogML.ID
                                             };
                        createdBlogPosts.Add(failedBlogPost);

                        Log.Error("Failed to import blog post.", exc);
                    }
                }
            }

            return createdBlogPosts;
        }
Example #6
0
        public List<BlogPostImportResult> ValidateImport(BlogMLBlog blogPosts)
        {
            List<BlogPostImportResult> result = new List<BlogPostImportResult>();
            var unsavedUrls = new List<string>();

            if (blogPosts != null && blogPosts.Posts != null)
            {
                foreach (var blogML in blogPosts.Posts)
                {
                    // Validate authors
                    if (blogML.Authors != null &&
                        blogML.Authors.Count > 0 &&
                        (blogPosts.Authors == null || blogPosts.Authors.All(a => a.ID != blogML.Authors[0].Ref)))
                    {
                        var failedResult = CreateFailedResult(blogML);
                        failedResult.ErrorMessage = string.Format(BlogGlobalization.ImportBlogPosts_AuthorByRefNotFound_Message, blogML.Authors[0].Ref);
                        result.Add(failedResult);

                        continue;
                    }
                    
                    var blogPostModel = MapViewModel(blogML, null, unsavedUrls);
                    unsavedUrls.Add(blogPostModel.BlogUrl);

                    BlogPostImportResult blogPost;
                    if (!ValidateModel(blogPostModel, blogML, out blogPost))
                    {
                        result.Add(blogPost);
                        continue;
                    }

                    blogPost = new BlogPostImportResult
                        {
                            Title = blogML.PostName ?? blogML.Title,
                            PageUrl = blogPostModel.BlogUrl,
                            Success = true,
                            Id = blogML.ID
                        };
                    result.Add(blogPost);
                }

                // Validate for duplicate IDS
                result
                    .Where(bp => bp.Success)
                    .GroupBy(bp => bp.Id)
                    .Where(group => group.Count() > 1)
                    .ToList()
                    .ForEach(group => group
                        .ToList()
                        .ForEach(
                            bp =>
                            {
                                bp.Success = false;
                                bp.ErrorMessage = string.Format(BlogGlobalization.ImportBlogPosts_DuplicateId_Message, group.Key);
                            }));
            }

            return result;
        }