[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);
}