예제 #1
0
        public ActionResult Add(PostEditModel postEditModel)
        {
            if (!ModelState.IsValid)
                return View("Edit", postEditModel);

            this.Repository.AddPost(postEditModel.Post);

            return RedirectToAction("Index", new { Id = postEditModel.Post.PostId });
        }
예제 #2
0
        public ActionResult Edit(PostEditModel postEditModel)
        {
            if (!ModelState.IsValid)
                return View("Edit", postEditModel);

            var originalPostPoco = WebUtils.Utils.FromJson<Post>(postEditModel.OriginalPostSerialized);

            this.Repository.UpdatePost(originalPostPoco, postEditModel.Post);

            return RedirectToAction("Index", new { Id = postEditModel.Post.PostId });
        }
예제 #3
0
        public ActionResult Add()
        {
            var postEditModel = new PostEditModel()
                {
                    AllTags = AppCache.Tags.ToArray(),
                    Post = new Post(),
                    OriginalPostSerialized = null
                };

            return View("Edit", postEditModel);
        }
예제 #4
0
        public ActionResult Edit(int postId)
        {
            var post = this.Repository.GetPost(postId, true);

            if (post == null)
                return HttpNotFound("Post ID '{0}' was not found".FormatEx(postId));

            var postPoco = (Post) post;

            var postEditModel = new PostEditModel()
                {
                    AllTags = AppCache.Tags.ToArray(),
                    Post = postPoco,
                    OriginalPostSerialized = WebUtils.Utils.ToJson(postPoco)
                };

            return View(postEditModel);
        }
        public async Task <ActionResult> CopyPost(ObjectId id)
        {
            SetTitle("Copy bài viết");
            var post = await _blogService.GetByIdAsync(id);

            if (post == null)
            {
                return(NotFound());
            }
            post.Id = ObjectId.GenerateNewId();

            var model = new PostEditModel
            {
                Entity = _mapper.Map <PostModel>(post)
            };

            await PopulatePostDetailPageAsync(model);

            return(View("PostDetail", model));
        }
예제 #6
0
        public ActionResult Edit(int postId)
        {
            var post = this.Repository.GetPost(postId, true);

            if (post == null)
            {
                return(HttpNotFound("Post ID '{0}' was not found".FormatEx(postId)));
            }

            var postPoco = (Post)post;

            var postEditModel = new PostEditModel()
            {
                AllTags = AppCache.Tags.ToArray(),
                Post    = postPoco,
                OriginalPostSerialized = WebUtils.Utils.ToJson(postPoco)
            };

            return(View(postEditModel));
        }
예제 #7
0
        public IActionResult Edit(int id)
        {
            var post = _postService.GetById(id);

            if (post != null)
            {
                var model = new PostEditModel
                {
                    Content    = post.Content,
                    AuthorName = post.User.UserName,
                    Created    = post.Created,
                    TopicTitle = post.Topic.Title,
                    TopicId    = post.Topic.Id
                };

                return(View(model));
            }

            return(RedirectToAction("Index", "Forum"));
        }
예제 #8
0
        public async Task <ReturnValue> Save(PostEditModel postEditModel)
        {
            logger.LogDebug("PostService > Save(PostEditModel: {0})", postEditModel.ToString());
            var returnValue = new ReturnValue($"Post '{postEditModel.Title}' saved.");

            try
            {
                if (postEditModel.IsNew)
                {
                    logger.LogDebug("New post");
                    var post = postEditModel.MapToModel();
                    post.WebsiteId = Instance.Id;

                    await PrepareRelatedPropertiesAsync(postEditModel, post);

                    await unitOfWork.Posts.Insert(post);
                }
                else
                {
                    logger.LogDebug("Update post");
                    var post = postEditModel.MapToModel(await unitOfWork.Posts.GetForSavingById(postEditModel.VanityId));
                    post.WebsiteId = Instance.Id;

                    _unitOfWork.Posts.RemoveRelatedItems(post);
                    await PrepareRelatedPropertiesAsync(postEditModel, post);

                    _unitOfWork.Posts.Update(post);
                }

                await _unitOfWork.Save();

                logger.LogDebug("Post saved");
            }
            catch (Exception ex)
            {
                logger.LogError(ex, ex.Message);
                returnValue.SetErrorMessage("An error has occurred while saving the post");
            }

            return(returnValue);
        }
예제 #9
0
        public async Task <PostEditModel> EditAsync([FromBody] PostEditModel model)
        {
            if (model.Id > 0)
            {
                var entity = await _postService.GetByIdAsync(model.Id, new PostIncludeOptions()
                {
                    IncludeTags     = true,
                    IncludeCategory = true,
                });

                if (entity == null)
                {
                    return(null);
                }

                entity = _postFactory.ToEntity(model, entity);

                var categories = await GetPostCategoriesAsync(entity, model);

                var tags = await GetPostTagsAsync(entity, model);

                await _postService.UpdateAsync(entity, categories, tags);
            }
            else
            {
                var entity = _postFactory.ToEntity(model);

                var categories = await GetPostCategoriesAsync(entity, model);

                var tags = await GetPostTagsAsync(entity, model);

                entity.Categories = categories.ToList();
                entity.Tags       = tags.ToList();

                await _postService.InsertAsync(entity);

                model.Id = entity.Id;
            }

            return(model);
        }
예제 #10
0
        private async Task PrepareRelatedPropertiesAsync(PostEditModel postEditModel, Post post)
        {
            post.PostCategories.Clear();
            if (postEditModel.SelectedCategories != null)
            {
                var categoryIds = await _unitOfWork.Categories.GetIdsByMultipleGuidsAsync(postEditModel.SelectedCategories.ToList().ConvertAll(Guid.Parse));

                foreach (int categoryId in categoryIds)
                {
                    post.PostCategories.Add(new PostCategory
                    {
                        PostId     = post.Id,
                        CategoryId = categoryId
                    });
                }
            }

            post.PostTags.Clear();
            if (postEditModel.SelectedTags != null)
            {
                var tagIds = await _unitOfWork.Tags.GetIdsByMultipleGuidsAsync(postEditModel.SelectedTags.ToList().ConvertAll(Guid.Parse));

                foreach (int tagId in tagIds)
                {
                    post.PostTags.Add(new PostTag
                    {
                        PostId = post.Id,
                        TagId  = tagId
                    });
                }
            }

            var user = await GetCurrentUserAsync();

            post.PostApplicationUsers.Clear();
            post.PostApplicationUsers.Add(new PostApplicationUser
            {
                PostId            = post.Id,
                ApplicationUserId = user.Id
            });
        }
예제 #11
0
        public IActionResult Create(PostEditModel model)
        {
            if (ModelState.IsValid)
            {
                var newPost = new Post
                {
                    TitleOfPost       = model.TitleOfPost,
                    DescriptionOfPost = model.DescriptionOfPost,
                    Tags = model.Tags
                };


                newPost = _postData.Add(newPost);

                return(RedirectToAction(nameof(Details), new { id = newPost.Id }));
            }
            else
            {
                return(View());
            }
        }
예제 #12
0
        public PostEditModel GetById(int id)
        {
            var post = _db.BlogPosts.SingleIncluded(p => p.Id == id).Result;

            if (id < 1)
            {
                post = _db.BlogPosts.SingleIncluded(p => p.Profile.IdentityName == User.Identity.Name).Result;
            }
            var model = new PostEditModel
            {
                Id         = post.Id,
                Slug       = post.Slug,
                Title      = post.Title,
                Content    = post.Content,
                Published  = post.Published,
                Image      = post.Image,
                Categories = _db.Categories.PostCategories(post.Id)
            };

            return(model);
        }
예제 #13
0
        public ActionResult Edit(int?id)
        {
            ViewBag.Categories = new SelectList(repo.GetCategories(), "Category");

            if (id == null)
            {
                return(HttpNotFound());
            }
            int b = (int)id;


            PostDTO postDto = repo.GetPost(b);

            PostEditModel post = Mapper.Map <PostDTO, PostEditModel>(postDto);

            if (post != null)
            {
                return(View(post));
            }
            return(HttpNotFound());
        }
예제 #14
0
        public IActionResult Edit(string id)
        {
            var existsPost = this.postsService
                             .Exists(x => x.Id == id);

            if (!existsPost)
            {
                return(this.NotFound());
            }

            var post = new PostEditModel()
            {
                Id        = id,
                PostInput = this.postsService
                            .GetSingle <PostInputModel>(x => x.Id == id),
            };

            this.SetSelectListItems(post);

            return(this.View(post));
        }
        public async Task <ActionResult> EditPost(ObjectId id)
        {
            SetTitle("Cập nhật bài viết");
            var post = await _blogService.GetByIdAsync(id);

            if (post == null)
            {
                return(NotFound());
            }

            var model = new PostEditModel
            {
                Entity = _mapper.Map <PostModel>(post),
                IsEdit = true
            };

            model.Entity.PostUrl = $"https://{Request.Host}/blog/{model.Entity.Slug}";
            await PopulatePostDetailPageAsync(model);

            return(View("PostDetail", model));
        }
예제 #16
0
        private async Task <PostEditModel> GetCreatePostModelAsync()
        {
            var view = new PostEditModel
            {
                PostId           = Guid.NewGuid(),
                IsPublished      = true,
                EnableComment    = true,
                ExposedToSiteMap = true,
                FeedIncluded     = true
            };

            var catList = await _categoryService.GetAllCategoriesAsync();

            if (null != catList.Item && catList.Item.Any())
            {
                var cbCatList = catList.Item.Select(p =>
                                                    new CheckBoxViewModel(p.DisplayName, p.Id.ToString(), false)).ToList();
                view.CategoryList = cbCatList;
            }

            return(view);
        }
예제 #17
0
        /// <summary>
        /// Saves the given model
        /// </summary>
        /// <param name="model">The model</param>
        /// <param name="draft">If the page should be saved as a draft</param>
        /// <returns>The result of the operation</returns>
        private async Task <PostEditModel> Save(PostEditModel model, bool draft = false)
        {
            try
            {
                await _service.Save(model, draft);
            }
            catch (ValidationException e)
            {
                model.Status = new StatusMessage
                {
                    Type = StatusMessage.Error,
                    Body = e.Message
                };

                return(model);
            }

            /*
             * catch
             * {
             *  return new StatusMessage
             *  {
             *      Type = StatusMessage.Error,
             *      Body = "An error occured while saving the page"
             *  };
             * }
             */

            var ret = await _service.GetById(model.Id);

            ret.Status = new StatusMessage
            {
                Type = StatusMessage.Success,
                Body = draft ? _localizer.Post["The post was successfully saved"]
                    : string.IsNullOrEmpty(model.Published) ? _localizer.Post["The post was successfully unpublished"] : _localizer.Page["The post was successfully published"]
            };

            return(ret);
        }
예제 #18
0
        public async Task <ActionResult> EditAsync(PostEditModel model, HttpPostedFileBase image = null)
        {
            if (ModelState.IsValid)
            {
                if (image != null)
                {
                    model.ImageMimeType    = image.ContentType;
                    model.ImageData        = new byte[image.ContentLength];
                    model.WrittenDate      = DateTime.Now;
                    model.ShortDescription = model.Text.Substring(0, 500);
                    model.AuthorId         = Convert.ToInt32(Session["user"]);
                    image.InputStream.Read(model.ImageData, 0, image.ContentLength);
                }
                await _dbContext.SavePostAsync(model);

                return(RedirectToAction("Index"));
            }
            else
            {
                return(View(model));
            }
        }
예제 #19
0
        public PostEditModel GetById(int id)
        {
            if (id < 1)
            {
                return(new PostEditModel());
            }

            var profile = GetProfile();

            var post = _db.BlogPosts.SingleIncluded(p => p.Id == id).Result;

            // its possible that there are no posts
            if (post == null)
            {
                return(null);
            }

            var postImg = post.Image == null ? profile.Image : post.Image;

            if (string.IsNullOrEmpty(postImg))
            {
                postImg = ApplicationSettings.PostImage;
            }

            var model = new PostEditModel
            {
                Id         = post.Id,
                Slug       = post.Slug,
                Title      = post.Title,
                Content    = post.Content,
                Published  = post.Published,
                Image      = postImg,
                PostViews  = post.PostViews,
                Categories = _db.Categories.PostCategories(post.Id)
            };

            return(model);
        }
예제 #20
0
        public async Task <PostEditModel> CreateNewEditModelAsync(Post post, PersonView person)
        {
            if (post == null)
            {
                throw new ArgumentNullException(nameof(post));
            }
            PostEditModel model = await CreateNewEditModelAsync(post.PostType, person);

            using (var work = this.dbFactory.StartWork())
            {
                List <Tag> tags = await work.PostTag.GetTagsByPostAsync(post);

                PostData postData = await work.PostData.GetPostDataAsync(post);

                model.Content           = postData.HtmlContent;
                model.Title             = post.Title;
                model.TopicId           = post.TopicId;
                model.Id                = post.Id;
                model.UseTags           = work.Tag.ToStringList(tags);
                model.UseTagSelectItems = work.Tag.ToSelectListItems(tags);
            }
            return(model);
        }
예제 #21
0
        public async Task <IActionResult> Create()
        {
            var view = new PostEditModel
            {
                IsPublished      = false,
                Featured         = false,
                EnableComment    = true,
                ExposedToSiteMap = true,
                FeedIncluded     = true,
                LanguageCode     = _blogConfig.ContentSettings.DefaultLangCode
            };

            var cats = await _catService.GetAll();

            if (cats.Count > 0)
            {
                var cbCatList = cats.Select(p =>
                                            new CheckBoxViewModel(p.DisplayName, p.Id.ToString(), false));
                view.CategoryList = cbCatList;
            }

            return(View("CreateOrEdit", view));
        }
예제 #22
0
        protected async Task <IEnumerable <PostTags> > GetPostTagsAsync(Post post, PostEditModel model)
        {
            if (model.Tags?.Any() == true)
            {
                var tags = new List <Tags>();
                foreach (var item in model.Tags)
                {
                    var tag = await _tagsService.GetOrCreateAsync(item);

                    tags.Add(tag);
                }

                var newList = tags.Select(t => new PostTags()
                {
                    TagsId = t.Id,
                    PostId = post.Id,
                });

                return(newList);
            }

            return(Enumerable.Empty <PostTags>());
        }
예제 #23
0
        public ActionResult Edit(PostEditModel model)
        {
            if (model != null && this.ModelState.IsValid)
            {
                var userId = this.User.Identity.GetUserId();
                var post   = this.Data.Posts.GetById(model.Id);

                if (post.AuthorId != userId)
                {
                    return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
                }

                post.Title   = model.Title;
                post.Content = model.Content;

                this.Data.Posts.Update(post);
                this.Data.SaveChanges();

                return(this.RedirectToAction("Details", "Posts", new { area = string.Empty, id = post.Id }));
            }

            return(this.View(model));
        }
예제 #24
0
    public Task <bool> EditPostAsync(string postid, string username, string password, Post post, bool publish)
    {
        EnsureUser(username, password);

        return(TryExecuteAsync(async() =>
        {
            if (!Guid.TryParse(postid.Trim(), out var id))
            {
                throw new ArgumentException("Invalid ID", nameof(postid));
            }

            var cids = await GetCatIds(post.categories);
            if (cids.Length == 0)
            {
                throw new ArgumentOutOfRangeException(nameof(post.categories));
            }

            var req = new PostEditModel
            {
                Title = post.title,
                Slug = post.wp_slug ?? ToSlug(post.title),
                EditorContent = post.description,
                Tags = post.mt_keywords,
                CategoryList = cids.Select(p => new CategoryCheckBox {
                    Id = p, IsChecked = true
                }).ToList(),
                LanguageCode = "en-us",
                IsPublished = publish,
                EnableComment = true,
                FeedIncluded = true,
                PublishDate = DateTime.UtcNow
            };

            await _mediator.Send(new UpdatePostCommand(id, req));
            return true;
        }));
    }
예제 #25
0
        public virtual ActionResult Create(PostEditModel post)
        {
            if (!ModelState.IsValid)
            {
                return(Json(new { success = false, errors = ModelState.Where(e => e.Value.Errors.Count > 0).Select(a => a.Key) }));
            }

            var dbPost     = _mapper.Map <Post>(post);
            var categories = _posts.GetAllCategories();

            foreach (var id in post.SelectedCategories)
            {
                dbPost.PostCategory_SDIC
                .Add(categories.First(a => a.Id == id));
            }
            _posts.Add(dbPost);
            _posts.Commit();

            var model = _mapper.Map <PostViewModel>(dbPost);

            model.Categories = _mapper.Map <List <PostCategoryViewModel> >(categories);

            return(Json(new { success = true, data = model }));
        }
예제 #26
0
        public async Task <IActionResult> CreateOrEdit(PostEditModel model,
                                                       [FromServices] LinkGenerator linkGenerator,
                                                       [FromServices] IPingbackSender pingbackSender)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return(Conflict(ModelState));
                }

                var tags = string.IsNullOrWhiteSpace(model.Tags)
                    ? Array.Empty <string>()
                    : model.Tags.Split(',').ToArray();

                var request = new UpdatePostRequest
                {
                    Title               = model.Title.Trim(),
                    Slug                = model.Slug.Trim(),
                    EditorContent       = model.EditorContent,
                    EnableComment       = model.EnableComment,
                    ExposedToSiteMap    = model.ExposedToSiteMap,
                    IsFeedIncluded      = model.FeedIncluded,
                    ContentLanguageCode = model.LanguageCode,
                    IsPublished         = model.IsPublished,
                    IsSelected          = model.Featured,
                    Tags                = tags,
                    CategoryIds         = model.SelectedCategoryIds
                };

                var tzDate = _tZoneResolver.NowOfTimeZone;
                if (model.ChangePublishDate &&
                    model.PublishDate.HasValue &&
                    model.PublishDate <= tzDate &&
                    model.PublishDate.GetValueOrDefault().Year >= 1975)
                {
                    request.PublishDate = _tZoneResolver.ToUtc(model.PublishDate.Value);
                }

                var postEntity = model.PostId == Guid.Empty ?
                                 await _postService.CreateAsync(request) :
                                 await _postService.UpdateAsync(model.PostId, request);

                if (model.IsPublished)
                {
                    _logger.LogInformation($"Trying to Ping URL for post: {postEntity.Id}");

                    var pubDate = postEntity.PubDateUtc.GetValueOrDefault();

                    var link = linkGenerator.GetUriByAction(HttpContext, "Slug", "Post",
                                                            new
                    {
                        year  = pubDate.Year,
                        month = pubDate.Month,
                        day   = pubDate.Day,
                        postEntity.Slug
                    });

                    if (_blogConfig.AdvancedSettings.EnablePingBackSend)
                    {
                        _ = Task.Run(async() => { await pingbackSender.TrySendPingAsync(link, postEntity.PostContent); });
                    }
                }

                return(Json(new { PostId = postEntity.Id }));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error Creating New Post.");
                Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                return(Json(ex.Message));
            }
        }
예제 #27
0
        private PostEditModel Transform(DynamicPost post, bool isDraft)
        {
            var type = App.PostTypes.GetById(post.TypeId);

            var model = new PostEditModel
            {
                Id              = post.Id,
                BlogId          = post.BlogId,
                TypeId          = post.TypeId,
                Title           = post.Title,
                Slug            = post.Slug,
                MetaKeywords    = post.MetaKeywords,
                MetaDescription = post.MetaDescription,
                Published       = post.Published.HasValue ? post.Published.Value.ToString("yyyy-MM-dd HH:mm") : null,
                RedirectUrl     = post.RedirectUrl,
                RedirectType    = post.RedirectType.ToString(),
                State           = GetState(post, isDraft),
                UseBlocks       = type.UseBlocks
            };

            foreach (var regionType in type.Regions)
            {
                var region = new RegionModel
                {
                    Meta = new RegionMeta
                    {
                        Id           = regionType.Id,
                        Name         = regionType.Title,
                        Description  = regionType.Description,
                        Placeholder  = regionType.ListTitlePlaceholder,
                        IsCollection = regionType.Collection,
                        Icon         = regionType.Icon,
                        Display      = regionType.Display.ToString().ToLower()
                    }
                };
                var regionListModel = ((IDictionary <string, object>)post.Regions)[regionType.Id];

                if (!regionType.Collection)
                {
                    var regionModel = (IRegionList)Activator.CreateInstance(typeof(RegionList <>).MakeGenericType(regionListModel.GetType()));
                    regionModel.Add(regionListModel);
                    regionListModel = regionModel;
                }

                foreach (var regionModel in (IEnumerable)regionListModel)
                {
                    var regionItem = new RegionItemModel();

                    foreach (var fieldType in regionType.Fields)
                    {
                        var appFieldType = App.Fields.GetByType(fieldType.Type);

                        var field = new FieldModel
                        {
                            Meta = new FieldMeta
                            {
                                Id          = fieldType.Id,
                                Name        = fieldType.Title,
                                Component   = appFieldType.Component,
                                Placeholder = fieldType.Placeholder,
                                IsHalfWidth = fieldType.Options.HasFlag(FieldOption.HalfWidth),
                                Description = fieldType.Description
                            }
                        };

                        if (typeof(Extend.Fields.SelectFieldBase).IsAssignableFrom(appFieldType.Type))
                        {
                            foreach (var item in ((Extend.Fields.SelectFieldBase)Activator.CreateInstance(appFieldType.Type)).Items)
                            {
                                field.Meta.Options.Add(Convert.ToInt32(item.Value), item.Title);
                            }
                        }

                        if (regionType.Fields.Count > 1)
                        {
                            field.Model = (Extend.IField)((IDictionary <string, object>)regionModel)[fieldType.Id];

                            if (regionType.ListTitleField == fieldType.Id)
                            {
                                regionItem.Title        = field.Model.GetTitle();
                                field.Meta.NotifyChange = true;
                            }
                        }
                        else
                        {
                            field.Model             = (Extend.IField)regionModel;
                            field.Meta.NotifyChange = true;
                            regionItem.Title        = field.Model.GetTitle();
                        }
                        regionItem.Fields.Add(field);
                    }

                    if (string.IsNullOrWhiteSpace(regionItem.Title))
                    {
                        regionItem.Title = "...";
                    }

                    region.Items.Add(regionItem);
                }
                model.Regions.Add(region);
            }

            foreach (var block in post.Blocks)
            {
                var blockType = App.Blocks.GetByType(block.Type);

                if (block is Extend.BlockGroup)
                {
                    var group = new BlockGroupModel
                    {
                        Id   = block.Id,
                        Type = block.Type,
                        Meta = new BlockMeta
                        {
                            Name      = blockType.Name,
                            Icon      = blockType.Icon,
                            Component = "block-group",
                            IsGroup   = true
                        }
                    };

                    if (blockType.Display != BlockDisplayMode.MasterDetail)
                    {
                        group.Meta.Component = blockType.Display == BlockDisplayMode.Horizontal ?
                                               "block-group-horizontal" : "block-group-vertical";
                    }

                    foreach (var prop in block.GetType().GetProperties(App.PropertyBindings))
                    {
                        if (typeof(Extend.IField).IsAssignableFrom(prop.PropertyType))
                        {
                            var fieldType = App.Fields.GetByType(prop.PropertyType);

                            group.Fields.Add(new FieldModel
                            {
                                Model = (Extend.IField)prop.GetValue(block),
                                Meta  = new FieldMeta
                                {
                                    Id        = prop.Name,
                                    Name      = prop.Name,
                                    Component = fieldType.Component,
                                }
                            });
                        }
                    }

                    bool firstChild = true;
                    foreach (var child in ((Extend.BlockGroup)block).Items)
                    {
                        blockType = App.Blocks.GetByType(child.Type);

                        group.Items.Add(new BlockItemModel
                        {
                            IsActive = firstChild,
                            Model    = child,
                            Meta     = new BlockMeta
                            {
                                Name      = blockType.Name,
                                Title     = child.GetTitle(),
                                Icon      = blockType.Icon,
                                Component = blockType.Component
                            }
                        });
                        firstChild = false;
                    }
                    model.Blocks.Add(group);
                }
                else
                {
                    model.Blocks.Add(new BlockItemModel
                    {
                        Model = block,
                        Meta  = new BlockMeta
                        {
                            Name      = blockType.Name,
                            Title     = block.GetTitle(),
                            Icon      = blockType.Icon,
                            Component = blockType.Component
                        }
                    });
                }
            }

            // Custom editors
            foreach (var editor in type.CustomEditors)
            {
                model.Editors.Add(new EditorModel
                {
                    Component = editor.Component,
                    Icon      = editor.Icon,
                    Name      = editor.Title
                });
            }
            return(model);
        }
예제 #28
0
        public async Task <IActionResult> Index([FromBody] PostEditModel model)
        {
            BlogPost bp;

            if (model.Id == 0)
            {
                var blog = this.db.Profiles.Single(b => b.IdentityName == User.Identity.Name);
                bp             = new BlogPost();
                bp.ProfileId   = blog.Id;
                bp.Title       = model.Title;
                bp.Slug        = GetSlug(model);
                bp.Content     = model.Content;
                bp.Description = string.IsNullOrEmpty(model.Description) ? model.Content.ToDescription() : model.Description;
                bp.Image       = model.Image;
                bp.LastUpdated = SystemClock.Now();
                bp.Published   = model.Publish ? SystemClock.Now() : DateTime.MinValue;
                this.db.BlogPosts.Add(bp);
                if (model.Publish)
                {
                    if (this.email.Enabled)
                    {
                        await Notify(bp.Title, bp.Description);
                    }
                }
            }
            else
            {
                bp             = this.db.BlogPosts.Single(p => p.Id == model.Id);
                bp.Title       = model.Title;
                bp.Slug        = GetSlug(model);
                bp.Content     = model.Content;
                bp.Description = string.IsNullOrEmpty(model.Description) ? model.Content.ToDescription() : model.Description;
                bp.Image       = model.Image;
                bp.LastUpdated = SystemClock.Now();
                // when publish button clicked, save and publish
                // but do not unpublish - use unpublish/{id} for this
                if (model.Publish)
                {
                    if (bp.Published == DateTime.MinValue)
                    {
                        if (this.email.Enabled)
                        {
                            await Notify(bp.Title, bp.Description);
                        }
                    }
                    bp.Published = SystemClock.Now();
                }
            }
            this.db.Complete();

            if (model.Categories != null)
            {
                await this.db.BlogPosts.UpdatePostCategories(
                    bp.Id, model.Categories.Select(c => c.Value).ToList());

                this.db.Complete();
            }
            var callback = new { Id = bp.Id, Slug = bp.Slug, Published = bp.Published, Image = bp.Image };

            return(new CreatedResult("blogifier/api/posts/" + bp.Id, callback));
        }
예제 #29
0
        /// <summary>
        /// Saves the post model.
        /// </summary>
        /// <param name="model">The post edit model</param>
        /// <param name="alias">The suggested alias</param>
        /// <param name="publish">If the post should be published</param>
        /// <returns>If the post was successfully saved</returns>
        public bool Save(PostEditModel model, out string alias, bool?publish = null)
        {
            var post = _api.Posts.GetById(model.Id);

            alias = null;

            if (post == null)
            {
                post = Piranha.Models.DynamicPost.Create(_api, model.TypeId);
            }
            else
            {
                if (model.Slug != post.Slug && model.Published.HasValue)
                {
                    alias = post.Slug;
                }
            }

            Module.Mapper.Map <PostEditModel, Piranha.Models.PostBase>(model, post);
            SaveRegions(model, post);
            SaveBlocks(model, post);

            // Update category
            var category = _api.Posts.GetCategoryBySlug(model.BlogId, model.SelectedCategory);

            if (category != null)
            {
                post.Category = category;
            }
            else
            {
                post.Category = new Piranha.Models.Taxonomy
                {
                    Title = model.SelectedCategory
                };
            }

            // Update tags
            post.Tags.RemoveAll(t => !model.SelectedTags.Contains(t.Slug));

            foreach (var selectedTag in model.SelectedTags)
            {
                if (!post.Tags.Any(t => t.Slug == selectedTag))
                {
                    var tag = _api.Posts.GetTagBySlug(model.BlogId, selectedTag);

                    if (tag != null)
                    {
                        post.Tags.Add(new Piranha.Models.Taxonomy
                        {
                            Id    = tag.Id,
                            Title = tag.Title,
                            Slug  = tag.Slug
                        });
                    }
                    else
                    {
                        post.Tags.Add(new Piranha.Models.Taxonomy
                        {
                            Title = selectedTag
                        });
                    }
                }
            }

            if (publish.HasValue)
            {
                if (publish.Value && !post.Published.HasValue)
                {
                    post.Published = DateTime.Now;
                }
                else if (!publish.Value)
                {
                    post.Published = null;
                }
            }
            _api.Posts.Save(post);
            model.Id = post.Id;

            return(true);
        }
예제 #30
0
        /// <summary>
        /// Saves all of the regions from the source model into the destination.
        /// </summary>
        /// <param name="src">The source</param>
        /// <param name="dest">The destination</param>
        private void SaveRegions(PostEditModel src, Piranha.Models.DynamicPost dest)
        {
            var type         = _api.PostTypes.GetById(src.TypeId);
            var modelRegions = (IDictionary <string, object>)dest.Regions;

            foreach (var region in src.Regions)
            {
                if (region is PageEditRegion)
                {
                    if (!modelRegions.ContainsKey(region.Id))
                    {
                        modelRegions[region.Id] = _factory.CreateDynamicRegion(type, region.Id);
                    }

                    var reg = (PageEditRegion)region;

                    if (reg.FieldSet.Count == 1)
                    {
                        modelRegions[region.Id] = reg.FieldSet[0].Value;
                    }
                    else
                    {
                        var modelFields = (IDictionary <string, object>)modelRegions[region.Id];

                        foreach (var field in reg.FieldSet)
                        {
                            modelFields[field.Id] = field.Value;
                        }
                    }
                }
                else
                {
                    if (modelRegions.ContainsKey(region.Id))
                    {
                        var list = (Piranha.Models.IRegionList)modelRegions[region.Id];
                        var reg  = (PageEditRegionCollection)region;

                        // At this point we clear the values and rebuild them
                        list.Clear();

                        foreach (var set in reg.FieldSets)
                        {
                            if (set.Count == 1)
                            {
                                list.Add(set[0].Value);
                            }
                            else
                            {
                                var modelFields = (IDictionary <string, object>)_factory.CreateDynamicRegion(type, region.Id);

                                foreach (var field in set)
                                {
                                    modelFields[field.Id] = field.Value;
                                }
                                list.Add(modelFields);
                            }
                        }
                    }
                }
            }
        }
예제 #31
0
 public PostEditModel ToModel(Post entity, PostEditModel model)
 {
     return(_mapper.Map(entity, model));
 }
예제 #32
0
        public async Task Save(PostEditModel model, bool draft)
        {
            var postType = App.PostTypes.GetById(model.TypeId);

            if (postType != null)
            {
                if (model.Id == Guid.Empty)
                {
                    model.Id = Guid.NewGuid();
                }

                var post = await _api.Posts.GetByIdAsync(model.Id);

                if (post == null)
                {
                    post = await _factory.CreateAsync <DynamicPost>(postType);

                    post.Id = model.Id;
                }

                post.BlogId                 = model.BlogId;
                post.TypeId                 = model.TypeId;
                post.Title                  = model.Title;
                post.Slug                   = model.Slug;
                post.MetaTitle              = model.MetaTitle;
                post.MetaKeywords           = model.MetaKeywords;
                post.MetaDescription        = model.MetaDescription;
                post.OgTitle                = model.OgTitle;
                post.OgDescription          = model.OgDescription;
                post.OgImage                = model.OgImage;
                post.Excerpt                = model.Excerpt;
                post.Published              = !string.IsNullOrEmpty(model.Published) ? DateTime.Parse(model.Published) : (DateTime?)null;
                post.RedirectUrl            = model.RedirectUrl;
                post.RedirectType           = (RedirectType)Enum.Parse(typeof(RedirectType), model.RedirectType);
                post.EnableComments         = model.EnableComments;
                post.CloseCommentsAfterDays = model.CloseCommentsAfterDays;
                post.Permissions            = model.SelectedPermissions;
                post.PrimaryImage           = model.PrimaryImage;

                if (postType.Routes.Count > 1)
                {
                    post.Route = postType.Routes.FirstOrDefault(r => r.Route == model.SelectedRoute?.Route)
                                 ?? postType.Routes.First();
                }

                // Save category
                post.Category = new Taxonomy
                {
                    Title = model.SelectedCategory
                };

                // Save tags
                post.Tags.Clear();
                foreach (var tag in model.SelectedTags)
                {
                    post.Tags.Add(new Taxonomy
                    {
                        Title = tag
                    });
                }

                // Save regions
                foreach (var region in postType.Regions)
                {
                    var modelRegion = model.Regions
                                      .FirstOrDefault(r => r.Meta.Id == region.Id);

                    if (region.Collection)
                    {
                        var listRegion = (IRegionList)((IDictionary <string, object>)post.Regions)[region.Id];

                        listRegion.Clear();

                        foreach (var item in modelRegion.Items)
                        {
                            if (region.Fields.Count == 1)
                            {
                                listRegion.Add(item.Fields[0].Model);
                            }
                            else
                            {
                                var postRegion = new ExpandoObject();

                                foreach (var field in region.Fields)
                                {
                                    var modelField = item.Fields
                                                     .FirstOrDefault(f => f.Meta.Id == field.Id);
                                    ((IDictionary <string, object>)postRegion)[field.Id] = modelField.Model;
                                }
                                listRegion.Add(postRegion);
                            }
                        }
                    }
                    else
                    {
                        var postRegion = ((IDictionary <string, object>)post.Regions)[region.Id];

                        if (region.Fields.Count == 1)
                        {
                            ((IDictionary <string, object>)post.Regions)[region.Id] =
                                modelRegion.Items[0].Fields[0].Model;
                        }
                        else
                        {
                            foreach (var field in region.Fields)
                            {
                                var modelField = modelRegion.Items[0].Fields
                                                 .FirstOrDefault(f => f.Meta.Id == field.Id);
                                ((IDictionary <string, object>)postRegion)[field.Id] = modelField.Model;
                            }
                        }
                    }
                }

                // Save blocks
                post.Blocks.Clear();

                foreach (var block in model.Blocks)
                {
                    if (block is BlockGroupModel blockGroup)
                    {
                        var groupType = App.Blocks.GetByType(blockGroup.Type);

                        if (groupType != null)
                        {
                            var postBlock = (BlockGroup)Activator.CreateInstance(groupType.Type);

                            postBlock.Id   = blockGroup.Id;
                            postBlock.Type = blockGroup.Type;

                            foreach (var field in blockGroup.Fields)
                            {
                                var prop = postBlock.GetType().GetProperty(field.Meta.Id, App.PropertyBindings);
                                prop.SetValue(postBlock, field.Model);
                            }

                            foreach (var item in blockGroup.Items)
                            {
                                if (item is BlockItemModel blockItem)
                                {
                                    postBlock.Items.Add(blockItem.Model);
                                }
                                else if (item is BlockGenericModel blockGeneric)
                                {
                                    var transformed = ContentUtils.TransformGenericBlock(blockGeneric);

                                    if (transformed != null)
                                    {
                                        postBlock.Items.Add(transformed);
                                    }
                                }
                            }
                            post.Blocks.Add(postBlock);
                        }
                    }
                    else if (block is BlockItemModel blockItem)
                    {
                        post.Blocks.Add(blockItem.Model);
                    }
                    else if (block is BlockGenericModel blockGeneric)
                    {
                        var transformed = ContentUtils.TransformGenericBlock(blockGeneric);

                        if (transformed != null)
                        {
                            post.Blocks.Add(transformed);
                        }
                    }
                }

                // Save post
                if (draft)
                {
                    await _api.Posts.SaveDraftAsync(post);
                }
                else
                {
                    await _api.Posts.SaveAsync(post);
                }
            }
            else
            {
                throw new ValidationException("Invalid Post Type.");
            }
        }
예제 #33
0
        private PostEditModel Transform(DynamicPost post, bool isDraft)
        {
            var config = new Config(_api);
            var type   = App.PostTypes.GetById(post.TypeId);
            var route  = type.Routes.FirstOrDefault(r => r.Route == post.Route) ?? type.Routes.FirstOrDefault();

            var model = new PostEditModel
            {
                Id                     = post.Id,
                BlogId                 = post.BlogId,
                TypeId                 = post.TypeId,
                PrimaryImage           = post.PrimaryImage,
                Title                  = post.Title,
                Slug                   = post.Slug,
                MetaTitle              = post.MetaTitle,
                MetaKeywords           = post.MetaKeywords,
                MetaDescription        = post.MetaDescription,
                OgTitle                = post.OgTitle,
                OgDescription          = post.OgDescription,
                OgImage                = post.OgImage,
                Excerpt                = post.Excerpt,
                Published              = post.Published?.ToString("yyyy-MM-dd HH:mm"),
                RedirectUrl            = post.RedirectUrl,
                RedirectType           = post.RedirectType.ToString(),
                EnableComments         = post.EnableComments,
                CloseCommentsAfterDays = post.CloseCommentsAfterDays,
                CommentCount           = post.CommentCount,
                State                  = post.GetState(isDraft),
                UseBlocks              = type.UseBlocks,
                UsePrimaryImage        = type.UsePrimaryImage,
                UseExcerpt             = type.UseExcerpt,
                UseHtmlExcerpt         = config.HtmlExcerpt,
                SelectedRoute          = route == null ? null : new RouteModel
                {
                    Title = route.Title,
                    Route = route.Route
                },
                Permissions = App.Permissions
                              .GetPublicPermissions()
                              .Select(p => new KeyValuePair <string, string>(p.Name, p.Title))
                              .ToList(),
                SelectedPermissions = post.Permissions
            };

            foreach (var r in type.Routes)
            {
                model.Routes.Add(new RouteModel
                {
                    Title = r.Title,
                    Route = r.Route
                });
            }

            foreach (var regionType in type.Regions)
            {
                var region = new RegionModel
                {
                    Meta = new RegionMeta
                    {
                        Id           = regionType.Id,
                        Name         = regionType.Title,
                        Description  = regionType.Description,
                        Placeholder  = regionType.ListTitlePlaceholder,
                        IsCollection = regionType.Collection,
                        Expanded     = regionType.ListExpand,
                        Icon         = regionType.Icon,
                        Display      = regionType.Display.ToString().ToLower()
                    }
                };
                var regionListModel = ((IDictionary <string, object>)post.Regions)[regionType.Id];

                if (!regionType.Collection)
                {
                    var regionModel = (IRegionList)Activator.CreateInstance(typeof(RegionList <>).MakeGenericType(regionListModel.GetType()));
                    regionModel.Add(regionListModel);
                    regionListModel = regionModel;
                }

                foreach (var regionModel in (IEnumerable)regionListModel)
                {
                    var regionItem = new RegionItemModel();

                    foreach (var fieldType in regionType.Fields)
                    {
                        var appFieldType = App.Fields.GetByType(fieldType.Type);

                        var field = new FieldModel
                        {
                            Meta = new FieldMeta
                            {
                                Id          = fieldType.Id,
                                Name        = fieldType.Title,
                                Component   = appFieldType.Component,
                                Placeholder = fieldType.Placeholder,
                                IsHalfWidth = fieldType.Options.HasFlag(FieldOption.HalfWidth),
                                Description = fieldType.Description
                            }
                        };

                        if (typeof(SelectFieldBase).IsAssignableFrom(appFieldType.Type))
                        {
                            foreach (var item in ((SelectFieldBase)Activator.CreateInstance(appFieldType.Type)).Items)
                            {
                                field.Meta.Options.Add(Convert.ToInt32(item.Value), item.Title);
                            }
                        }

                        if (regionType.Fields.Count > 1)
                        {
                            field.Model = (IField)((IDictionary <string, object>)regionModel)[fieldType.Id];

                            if (regionType.ListTitleField == fieldType.Id)
                            {
                                regionItem.Title        = field.Model.GetTitle();
                                field.Meta.NotifyChange = true;
                            }
                        }
                        else
                        {
                            field.Model             = (IField)regionModel;
                            field.Meta.NotifyChange = true;
                            regionItem.Title        = field.Model.GetTitle();
                        }
                        regionItem.Fields.Add(field);
                    }

                    if (string.IsNullOrWhiteSpace(regionItem.Title))
                    {
                        regionItem.Title = "...";
                    }

                    region.Items.Add(regionItem);
                }
                model.Regions.Add(region);
            }

            foreach (var block in post.Blocks)
            {
                var blockType = App.Blocks.GetByType(block.Type);

                if (block is BlockGroup blockGroup)
                {
                    var group = new BlockGroupModel
                    {
                        Id   = block.Id,
                        Type = block.Type,
                        Meta = new BlockMeta
                        {
                            Name        = blockType.Name,
                            Icon        = blockType.Icon,
                            Component   = "block-group",
                            IsGroup     = true,
                            isCollapsed = config.ManagerDefaultCollapsedBlocks,
                            ShowHeader  = !config.ManagerDefaultCollapsedBlockGroupHeaders
                        }
                    };

                    if (blockType.Display != BlockDisplayMode.MasterDetail)
                    {
                        group.Meta.Component = blockType.Display == BlockDisplayMode.Horizontal ?
                                               "block-group-horizontal" : "block-group-vertical";
                    }

                    group.Fields = ContentUtils.GetBlockFields(block);

                    bool firstChild = true;
                    foreach (var child in blockGroup.Items)
                    {
                        blockType = App.Blocks.GetByType(child.Type);

                        if (!blockType.IsGeneric)
                        {
                            group.Items.Add(new BlockItemModel
                            {
                                IsActive = firstChild,
                                Model    = child,
                                Meta     = new BlockMeta
                                {
                                    Name      = blockType.Name,
                                    Title     = child.GetTitle(),
                                    Icon      = blockType.Icon,
                                    Component = blockType.Component
                                }
                            });
                        }
                        else
                        {
                            // Generic block item model
                            group.Items.Add(new BlockGenericModel
                            {
                                IsActive = firstChild,
                                Model    = ContentUtils.GetBlockFields(child),
                                Type     = child.Type,
                                Meta     = new BlockMeta
                                {
                                    Name      = blockType.Name,
                                    Title     = child.GetTitle(),
                                    Icon      = blockType.Icon,
                                    Component = blockType.Component,
                                }
                            });
                        }
                        firstChild = false;
                    }
                    model.Blocks.Add(group);
                }
                else
                {
                    if (!blockType.IsGeneric)
                    {
                        // Regular block item model
                        model.Blocks.Add(new BlockItemModel
                        {
                            Model = block,
                            Meta  = new BlockMeta
                            {
                                Name        = blockType.Name,
                                Title       = block.GetTitle(),
                                Icon        = blockType.Icon,
                                Component   = blockType.Component,
                                isCollapsed = config.ManagerDefaultCollapsedBlocks
                            }
                        });
                    }
                    else
                    {
                        // Generic block item model
                        model.Blocks.Add(new BlockGenericModel
                        {
                            Model = ContentUtils.GetBlockFields(block),
                            Type  = block.Type,
                            Meta  = new BlockMeta
                            {
                                Name        = blockType.Name,
                                Title       = block.GetTitle(),
                                Icon        = blockType.Icon,
                                Component   = blockType.Component,
                                isCollapsed = config.ManagerDefaultCollapsedBlocks
                            }
                        });
                    }
                }
            }

            // Custom editors
            foreach (var editor in type.CustomEditors)
            {
                model.Editors.Add(new EditorModel
                {
                    Component = editor.Component,
                    Icon      = editor.Icon,
                    Name      = editor.Title
                });
            }
            return(model);
        }
예제 #34
0
 public Post ToEntity(PostEditModel model)
 {
     return(ToEntity(model, new Post()));
 }