예제 #1
0
        public async Task <IActionResult> AddPost([FromBody] AddPostModelView model)
        {
            var ValidationContext = new ValidationContext(model.NewPost);


            if (Validator.TryValidateObject(model.NewPost, ValidationContext, null))// zamiast null można dać liste która zostanie zapełniona błędami
            {
                var DateNow           = DateTime.Now;
                BlogUserIdentity user = await _userManager.FindByNameAsync(User.Identity.Name);

                var UserBlog = _appContext.Blogs.FirstOrDefault(ob => ob.BlogUserIdentity == user);

                Post NewPost = new Post()
                {
                    Title      = model.NewPost.Title,
                    Blog       = UserBlog,
                    ContentOne = model.NewPost.ContentOne,
                    ContentTwo = model.NewPost.ContentTwo,
                    Comments   = null,
                    DateOfPost = DateNow.Ticks,
                    Images     = new List <ImgPost>(),
                    PostTags   = new List <PostTag>()
                };

                if (model.Thumbnail.name != "")
                {
                    NewPost.Thumbnail = "/Src/Profile/" + user.Id.ToString() + "/" + model.NewPost.Title + DateNow.Ticks.ToString() + "/" + model.Thumbnail.name;
                    await _fileService.AddThumbnailToPostAsynch(user, model.NewPost.Title, model.Thumbnail, DateNow.Ticks);
                }
                else
                {
                    NewPost.Thumbnail = "/Src/System/noimage.png";
                }


                //_appContext.Add(NewPost);// add new
                //_appContext.SaveChanges();// save changes so post will get id

                //NewPost = _appContext.Posts.FirstOrDefault(post => post.Title == model.NewPost.Title);// get post from database

                await _fileService.AddImagesToPostAsynch(user, model.NewPost.Title, model.Images, DateNow.Ticks);

                List <Task> CreatingTags = new List <Task>();
                foreach (var item in model.NewPost.PostTags)
                {
                    CreatingTags.Add(CheckTag(item, user));
                }
                await Task.WhenAll(CreatingTags);

                // tags was created

                List <Tag> TagLists = new List <Tag>();
                foreach (var item in model.NewPost.PostTags)
                {
                    var tagFromBase = _appContext.Tags.FirstOrDefault(ob => ob.Name == item.ToLower());
                    if (tagFromBase != null)
                    {
                        TagLists.Add(tagFromBase);
                    }
                }
                // get all tags from  database

                List <PostTag> PostTagConnectorList = new List <PostTag>();

                foreach (var item in TagLists)
                {
                    var NewConnector = new PostTag();
                    NewConnector.Post = NewPost;
                    NewConnector.Tag  = item;

                    item.PostTags = new List <PostTag>();


                    NewPost.PostTags.Add(NewConnector);
                    item.PostTags.Add(NewConnector);
                    PostTagConnectorList.Add(NewConnector);
                }
                // objects which connects Tags with posts (many to many connection)


                //Creatng img objects
                List <ImgPost> ImageList = new List <ImgPost>();
                var            path      = "/Src/Profile/" + user.Id + "/" + model.NewPost.Title + "/";// base of all images in post

                foreach (var item in model.Images)
                {
                    var imagepath  = path + item.name;
                    var TmpImgPost = new ImgPost();

                    TmpImgPost.Src  = imagepath;
                    TmpImgPost.Post = NewPost;

                    NewPost.Images.Add(TmpImgPost);
                    ImageList.Add(TmpImgPost);// add to list which will save it to database
                }


                try
                {
                    await _appContext.AddAsync(NewPost);//add post to database

                    await _appContext.AddRangeAsync(PostTagConnectorList);

                    await _appContext.AddRangeAsync(ImageList);
                }
                catch (Exception e) {
                    return(Conflict());
                }

                await _appContext.SaveChangesAsync();

                return(Ok());
            }
            else
            {
                return(Conflict());
            }
        }