diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Commands/BlogCommands.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Commands/BlogCommands.cs new file mode 100644 index 000000000..8456fc929 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Commands/BlogCommands.cs @@ -0,0 +1,128 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; +using System.Xml.Linq; +using Orchard.Blogs.Models; +using Orchard.Commands; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Aspects; +using Orchard.Core.Common.Models; +using Orchard.Core.Navigation.Models; +using Orchard.Security; +using System.IO; +using Orchard.Blogs.Services; +using Orchard.Core.Navigation.Services; + +namespace Orchard.Blogs.Commands { + public class BlogCommands : DefaultOrchardCommandHandler { + private readonly IContentManager _contentManager; + private readonly IMembershipService _membershipService; + private readonly IBlogService _blogService; + private readonly IMenuService _menuService; + + public BlogCommands( + IContentManager contentManager, + IMembershipService membershipService, + IBlogService blogService, + IMenuService menuService) { + _contentManager = contentManager; + _membershipService = membershipService; + _blogService = blogService; + _menuService = menuService; + } + + [OrchardSwitch] + public string FeedUrl { get; set; } + + [OrchardSwitch] + public string Slug { get; set; } + + [OrchardSwitch] + public string Title { get; set; } + + [OrchardSwitch] + public string MenuText { get; set; } + + [CommandName("blog create")] + [CommandHelp("blog create /Slug: /Title: [/MenuText:<menu text>]\r\n\t" + "Creates a new Blog")] + [OrchardSwitches("Slug,Title,MenuText")] + public string Create() { + var admin = _membershipService.GetUser("admin"); + + if(!IsSlugValid(Slug)) { + return "Invalid Slug provided. Blog creation failed."; + } + + var blog = _contentManager.New("blog"); + blog.As<ICommonAspect>().Owner = admin; + blog.As<RoutableAspect>().Slug = Slug; + blog.As<RoutableAspect>().Title = Title; + if ( !String.IsNullOrWhiteSpace(MenuText) ) { + blog.As<MenuPart>().OnMainMenu = true; + blog.As<MenuPart>().MenuPosition = _menuService.Get().Select(menuPart => menuPart.MenuPosition).Max() + 1 + ".0"; + blog.As<MenuPart>().MenuText = MenuText; + } + _contentManager.Create(blog); + + return "Blog created successfully"; + } + + [CommandName("blog import")] + [CommandHelp("blog import /Slug:<slug> /FeedUrl:<feed url>\r\n\t" + "Import all items from <feed url> into the blog at the specified <slug>")] + [OrchardSwitches("FeedUrl,Slug")] + public string Import() { + var admin = _membershipService.GetUser("admin"); + + XDocument doc; + + try { + Context.Output.WriteLine("Loading feed..."); + doc = XDocument.Load(FeedUrl); + Context.Output.WriteLine("Found {0} items", doc.Descendants("item").Count()); + } + catch ( Exception ex ) { + Context.Output.WriteLine(T("An error occured while loading the file: " + ex.Message)); + return "Import terminated."; + } + + var blog = _blogService.Get(Slug); + + if ( blog == null ) { + return "Blog not found at specified slug: " + Slug; + } + + foreach ( var item in doc.Descendants("item") ) { + string postName = item.Element("title").Value; + + Context.Output.WriteLine("Adding post: {0}...", postName.Substring(0, Math.Min(postName.Length, 40))); + var post = _contentManager.New("blogpost"); + post.As<ICommonAspect>().Owner = admin; + post.As<ICommonAspect>().Container = blog; + post.As<RoutableAspect>().Slug = Slugify(postName); + post.As<RoutableAspect>().Title = postName; + post.As<BodyAspect>().Text = item.Element("description").Value; + _contentManager.Create(post); + } + + + return "Import feed completed."; + } + + private static string Slugify(string slug) { + var dissallowed = new Regex(@"[/:?#\[\]@!$&'()*+,;=\s]+"); + + slug = dissallowed.Replace(slug, "-"); + slug = slug.Trim('-'); + + if ( slug.Length > 1000 ) + slug = slug.Substring(0, 1000); + + return slug.ToLowerInvariant(); + } + + private static bool IsSlugValid(string slug) { + // see http://tools.ietf.org/html/rfc3987 for prohibited chars + return slug == null || String.IsNullOrEmpty(slug.Trim()) || Regex.IsMatch(slug, @"^[^/:?#\[\]@!$&'()*+,;=\s]+$"); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Models/Blog.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Models/Blog.cs index 75362ec5f..9b80f4001 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Models/Blog.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Models/Blog.cs @@ -9,6 +9,7 @@ namespace Orchard.Blogs.Models { public string Name { get { return this.As<RoutableAspect>().Title; } + set { this.As<RoutableAspect>().Title = value; } } //TODO: (erikpo) Need a data type for slug diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj b/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj index 2df26fa98..a27f9f0af 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj @@ -66,6 +66,7 @@ </ItemGroup> <ItemGroup> <Compile Include="AdminMenu.cs" /> + <Compile Include="Commands\BlogCommands.cs" /> <Compile Include="Controllers\BlogAdminController.cs" /> <Compile Include="Drivers\BlogDriver.cs" /> <Compile Include="Controllers\BlogPostAdminController.cs" />