public BlogAdminModule(IDocumentSession session) : base("Blog") { Get["/"] = o => { return("Blog admin"); }; Get["/post-new/"] = p => View["Edit", new BlogPost { ContentType = DynamicContentType.Markdown, AllowComments = true, CurrentState = BlogPost.State.Draft, }]; Post["/post-new/"] = p => { var post = this.Bind <BlogPost>(); bool validated = true; if (!validated) { //ModelState.AddModelError("Id", ""); return(View["Edit", post]); } session.Store(post); session.SaveChanges(); return(Response.AsRedirect(string.Concat(AreaRoutePrefix.TrimEnd('/'), "/", post.Id, "/", post.Slug))); }; }
public BlogModule(IDocumentSession session) : base("Blog") { // TODO blog module configs by area name const string blogPostRoute = @"/(?<year>19[0-9]{2}|2[0-9]{3})/(?<month>0[1-9]|1[012])/(?<id>\d+)-(?<slug>.+)"; LoadWidgets(session); Get[blogPostRoute] = p => { BlogPost post; try { post = GetBlogPost((int)p.id, Request.Query.key, session); } catch (ArgumentException e) { return(e.Message); } int year = (int)p.year; int month = (int)p.month; if (post.PublishedAt.Month != month || post.PublishedAt.Year != year) { return(404); } if (!post.Slug.Equals(p.slug)) { return(Response.AsRedirect(post.ToUrl(AreaRoutePrefix.TrimEnd('/')), RedirectResponse.RedirectType.Permanent)); } ((PageModel)Model.Page).Title = post.Title; Model.AreaPrefix = AreaRoutePrefix; Model.BlogPost = post; Model.Comments = session.Load <PostComments>(post.Id + "/comments"); return(View["ReadBlogPost", Model]); }; Post[blogPostRoute + "/new-comment"] = p => { BlogPost post; try { post = GetBlogPost((int)p.id, Request.Query.key, session); } catch (ArgumentException e) { return(e.Message); } if (!post.AllowComments) { return(403); // Comments are closed for this post } var commentInput = this.Bind <PostComments.CommentInput>(); if (!commentInput.IsValid()) { return("Error"); // TODO } TaskExecutor.ExcuteLater(new AddCommentTask(post.Id, commentInput, new AddCommentTask.RequestValues { UserAgent = Request.Headers.UserAgent, UserHostAddress = Request.UserHostAddress })); Model.AreaPrefix = AreaRoutePrefix; return(Response.AsRedirect(post.ToUrl(AreaRoutePrefix.TrimEnd('/')))); }; Get["/"] = o => { var posts = session.Query <BlogPost>() .Where(x => x.CurrentState == BlogPost.State.Public) .OrderByDescending(x => x.PublishedAt) .Take(15) .ToList(); ((PageModel)Model.Page).Title = "Blog roll"; Model.AreaPrefix = AreaRoutePrefix; Model.BlogPosts = posts; Model.ListTitle = string.Empty; return(View["ListBlogPosts", Model]); }; Get[@"/(?<year>19[0-9]{2}|2[0-9]{3})"] = p => { int year = p.year; var posts = session.Query <BlogPost>() .Where(x => x.PublishedAt.Year == year) .Where(x => x.CurrentState == BlogPost.State.Public) .OrderByDescending(x => x.PublishedAt) .Take(15) .ToList(); Model.AreaPrefix = AreaRoutePrefix; Model.BlogPosts = posts; ((PageModel)Model.Page).Title = Model.ListTitle = String.Format("All blog posts of the year {0}", p.year); return(View["ListBlogPosts", Model]); }; Get[@"/(?<year>19[0-9]{2}|2[0-9]{3})/(?<month>0[1-9]|1[012])"] = p => { int year = p.year; int month = p.month; var posts = session.Query <BlogPost>() .Where(x => x.PublishedAt.Year == year && x.PublishedAt.Month == month) .Where(x => x.CurrentState == BlogPost.State.Public) .OrderByDescending(x => x.PublishedAt) .Take(15) .ToList(); Model.AreaPrefix = AreaRoutePrefix; Model.BlogPosts = posts; ((PageModel)Model.Page).Title = Model.ListTitle = String.Format("All blog posts of month {0} of the year {1}", p.month, p.year); return(View["ListBlogPosts", Model]); }; }
public BlogModule(IDocumentSession session) : base("Blog") { // TODO blog module configs by area name const string blogPostRoute = @"/(?<year>19[0-9]{2}|2[0-9]{3})/(?<month>0[1-9]|1[012])/(?<id>\d+)-{slug}"; LoadWidgets(session); Get[blogPostRoute] = p => { BlogPost post; try { post = GetBlogPost((int)p.id, session); } catch (ArgumentException e) { return(e.Message); } int year = (int)p.year; int month = (int)p.month; if (post.PublishedAt.Month != month || post.PublishedAt.Year != year) { return(404); } if (!post.Slug.Equals(p.slug)) { return(Response.AsRedirect(string.Concat(AreaRoutePrefix.TrimEnd('/'), "/", post.Id, "/", post.Slug))); } // TODO load comments Model.BlogPost = post; return(View["ReadBlogPost", Model]); }; Post[blogPostRoute + "/new-comment"] = p => { BlogPost post; try { post = GetBlogPost((int)p.id, session); } catch (ArgumentException e) { return(e.Message); } if (!post.AllowComments) { return("Comments are closed for this post"); } // TODO add comment via scripted patching API return(Response.AsRedirect(string.Concat(AreaRoutePrefix.TrimEnd('/'), "/", post.Id, "/", post.Slug))); }; Get["/"] = o => { var posts = session.Query <BlogPost>() .Where(x => x.CurrentState == BlogPost.State.Public) .OrderByDescending(x => x.PublishedAt) .ToList(); Model.BlogPosts = posts; Model.ListTitle = string.Empty; return(View["ListBlogPosts", Model]); }; Get[@"/(?<year>19[0-9]{2}|2[0-9]{3})"] = p => { int year = p.year; var posts = session.Query <BlogPost>() .Where(x => x.PublishedAt.Year == year) .Where(x => x.CurrentState == BlogPost.State.Public) .OrderByDescending(x => x.PublishedAt) .ToList(); Model.BlogPosts = posts; Model.ListTitle = String.Format("All blog posts of the year {0}", p.year); return(View["ListBlogPosts", Model]); }; Get[@"/(?<year>19[0-9]{2}|2[0-9]{3})/(?<month>0[1-9]|1[012])"] = p => { int year = p.year; int month = p.month; var posts = session.Query <BlogPost>() .Where(x => x.PublishedAt.Year == year && x.PublishedAt.Month == month) .Where(x => x.CurrentState == BlogPost.State.Public) .OrderByDescending(x => x.PublishedAt) .ToList(); Model.BlogPosts = posts; Model.ListTitle = String.Format("All blog posts of month {0} of the year {1}", p.month, p.year); return(View["ListBlogPosts", Model]); }; }
public ContentPagesAdminModule(IDocumentSession session) : base("ContentPages") { Get["/"] = p => { var list = session.Advanced.LoadStartingWith <ContentPage>(DocumentPrefix + ContentPage.FullContentPageId(string.Empty), null, 0, 25); return(View["List", list.ToArray()]); }; Get["/create/"] = p => View["Edit", new ContentPage { ContentType = DynamicContentType.Markdown }]; Post["/create/"] = p => { var cp = this.Bind <ContentPage>(); var pageId = ContentPage.FullContentPageId(DynamicContentHelpers.TitleToSlug(cp.Title)); var page = session.Load <ContentPage>(pageId); if (page != null) { //ModelState.AddModelError("Id", "Page already exists for the slug you're trying to create it under"); return(View["Edit", cp]); } session.Store(cp, pageId); session.SaveChanges(); return(Response.AsRedirect(string.Concat(AreaRoutePrefix.TrimEnd('/'), "/", cp.Slug))); }; Get["/edit/{slug}"] = p => { var cp = session.Load <ContentPage>(DocumentPrefix + ContentPage.FullContentPageId((string)p.slug)); if (cp == null) { return(404); } return(View["Edit", cp]); }; Post["/edit/{slug}"] = p => { var input = this.Bind <ContentPage>(); if (input.Id != (string)p.slug) { return("<h1>Error</h1><p>Slugs mismatch</p>"); } var cp = session.Load <ContentPage>(DocumentPrefix + ContentPage.FullContentPageId((string)p.slug)); if (cp == null) { return(404); } cp.Content = input.Content; cp.ContentType = input.ContentType; cp.Title = input.Title; cp.LastChanged = DateTimeOffset.Now; return(Response.AsRedirect(string.Concat(AreaRoutePrefix.TrimEnd('/'), "/", cp.Slug))); }; // Post["/delete/{slug}"] = p => // { // // }; }
public BlogAdminModule(IDocumentSession session) : base("Blog") { Get["/"] = o => { ViewBag.ModulePrefix = AreaRoutePrefix.TrimEnd('/'); return(View["List", session.Query <BlogPost>().ToArray()]); }; Get["/post-new/"] = p => View["Edit", new BlogPost { ContentType = DynamicContentType.Markdown, AllowComments = true, CurrentState = BlogPost.State.Draft, }]; Post["/post-new/"] = p => { var post = this.Bind <BlogPost>(); bool validated = true; if (!validated) { //ModelState.AddModelError("Id", ""); return(View["Edit", post]); } // Set some defaults post.PublishedAt = DateTimeOffset.UtcNow; post.AllowComments = true; var identity = (User)Context.CurrentUser; post.AuthorId = identity.Id; string tags = Request.Form.TagsAsString; if (!String.IsNullOrWhiteSpace(tags)) { post.Tags = tags.Split(new[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); } session.Store(post); session.Store(new PostComments(), post.Id + "/comments"); session.SaveChanges(); return(Response.AsRedirect(post.ToUrl(AreaRoutePrefix.TrimEnd('/')))); }; Get[@"/edit/(?<id>\d+)"] = p => { var blogPost = session.Load <BlogPost>((int)p.id); if (blogPost == null) { return(404); } return(View["Edit", blogPost]); }; Post[@"/edit/(?<id>\d+)"] = p => { var blogPost = session.Load <BlogPost>((int)p.id); if (blogPost == null) { return(404); } var input = this.Bind <BlogPost>(); bool validated = true; if (!validated) { //ModelState.AddModelError("Id", ""); return(View["Edit", input]); } blogPost.Title = input.Title; blogPost.Content = input.Content; string tags = Request.Form.TagsAsString; if (!String.IsNullOrWhiteSpace(tags)) { blogPost.Tags = tags.Split(new[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); } blogPost.LastEditedAt = DateTimeOffset.UtcNow; session.SaveChanges(); return(Response.AsRedirect(input.ToUrl(AreaRoutePrefix.TrimEnd('/')))); }; }