Esempio n. 1
0
        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)));
            };
        }
Esempio n. 2
0
        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]);
            };
        }
Esempio n. 3
0
        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 =>
//			                             {
//
//			                             };
        }
Esempio n. 5
0
        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('/'))));
            };
        }