Report abuse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
        [ValidateAntiForgeryToken(Salt = antiForgeryTokenSalt)]
        [AcceptVerbs(HttpVerbs.Post)]
        [OxiteAuthorize(Roles = "SiteOwner,AreaOwner")]
        public virtual ActionResult Index(string pagePath, FormCollection form, Guid? parentID, RequestMode mode)
        {
            string[] pagePathParts = pagePath.Split('/');
            string viewName = "Manage";

            if (string.Compare(pagePathParts.Last(), "edit", true) == 0)
                mode = RequestMode.Edit;
            else if (string.Compare(pagePathParts.Last(), "add", true) == 0)
                mode = RequestMode.Add;
            else if (string.Compare(pagePathParts.Last(), "remove", true) == 0)
                return removePage(string.Join("/", pagePathParts.Take(pagePathParts.Length - 1).ToArray()), form["returnUri"]);
            else
                return NotFound();

            pagePath = string.Join("/", pagePathParts.Take(pagePathParts.Length - 1).ToArray());

            IPost page = mode != RequestMode.Add ? pagePath.LoadPage((g, s) => PostRepository.GetPost(g, s)) : null;
            IPost newParent = PostRepository.GetPost(parentID ?? Guid.Empty) ?? pagePath.LoadPage((g, s) => PostRepository.GetPost(g, s));
            bool urlIsLocked = page != null && page.State == (byte)EntityState.Normal && page.Published.HasValue && ConvertToLocalTime(page.Published.Value).AddHours(Config.Site.PostEditTimeout) < DateTime.Now;

            if (mode == RequestMode.Edit)
                PageTitle.AdditionalPageTitleSegments = new string[] { Localize("Edit Page") };
            else
                PageTitle.AdditionalPageTitleSegments = new string[] { Localize("Create Page") };

            List<ITag> tags = form.LoadTags((s) => TagRepository.GetTag(s), (s) => TagRepository.CreateTag(s), ModelState) as List<ITag>;
            IPost pageFromRequest = form.LoadPost(() => PostRepository.CreatePost(), ModelState);

            if (!urlIsLocked && isDuplicateUri(page, pageFromRequest.Slug, newParent))
            {
                ModelState.Add("Post.Slug", new ModelState() { AttemptedValue = pageFromRequest.Slug });
                ModelState["Post.Slug"].Errors.Add(new ModelError(Localize("This slug is already being used!")));
            }

            if (pageFromRequest != null && ModelState.IsValid)
            {
                if (page == null)
                {
                    page = PostRepository.CreatePost();
                    page.CreatorUserID = User.ID;
                }

                page.Slug = pageFromRequest.Slug;
                page.Title = pageFromRequest.Title;
                page.Body = pageFromRequest.Body;
                page.BodyShort = string.Empty;
                page.State = pageFromRequest.State;
                page.Published = pageFromRequest.Published.HasValue ? ConvertFromLocalTime(pageFromRequest.Published.Value) : (DateTime?)null;
                page.Modified = pageFromRequest.Modified;

                if (page.ID == Guid.Empty)
                {
                    page.Created = DateTime.Now.ToUniversalTime();

                    ISubscription subscription = null;

                    if (Config.Site.AuthorAutoSubscribe)
                    {
                        subscription = PostRepository.CreateSubscription();
                        subscription.UserID = User.ID;
                    }

                    PostRepository.AddPost(page, subscription);
                }

                IPost currentParent = PostRepository.GetParentPost(page.ID);
                if (currentParent == null || newParent == null || currentParent.ID != newParent.ID)
                {
                    if (currentParent != null)
                        PostRepository.RemovePostRelationship(page.ID);

                    PostRepository.AddPostRelationship(Config.Site.ID, page.ID, newParent != null ? newParent.ID : Guid.Empty);
                }

                foreach (ITag tag in tags)
                {
                    if (tag.ID == Guid.Empty)
                        TagRepository.AddTag(tag);
                    PostRepository.AddPostToTag(page.ID, tag.ID);
                }

                page.Tags.ToList().FindAll(tP => !tags.Exists(t => t.ID == tP.ID)).ForEach(t => PostRepository.RemovePostFromTag(page.ID, t.ID));

                PostRepository.SubmitChanges();

                if (!string.IsNullOrEmpty(form["returnUri"]))
                    return new RedirectResult(form["returnUri"]);
                else
                    return Redirect(page.GetPageUrl(ControllerContext, Routes));
            }

            ViewData["Post"] = page ?? PostRepository.CreatePost();
            ViewData["NewParentPostID"] = newParent != null ? newParent.ID : Guid.Empty;
            ViewData["Pages"] = addRootPage(PostRepository.GetPostsWithFullSlug(Config.Site.ID));
            ViewData["Creator"] = page != null ? page.CreatorUser : User;
            ViewData["RequestMode"] = mode;
            ViewData["UrlIsLocked"] = urlIsLocked;
            ViewData["ReturnUri"] = form["returnUri"];
            ViewData["Meta.Description"] = page != null ? page.GetBodyShort() : string.Empty;
            ViewData["AntiForgeryTokenSalt"] = antiForgeryTokenSalt;

            return View(viewName);
        }