Пример #1
0
        public IActionResult PublishPost([FromBody] PublishPostParameters model)
        {
            PublishPostReturnModel ret = new PublishPostReturnModel();

            if (!ModelState.IsValid)
            {
                ret.IsActionSucceed = false;
                ret.Errors          = new Dictionary <string, string>();
                foreach (var modelState in ModelState.Values)
                {
                    foreach (var error in modelState.Errors)
                    {
                        ret.Errors.Add(error.Exception.HResult.ToString(), error.ErrorMessage);
                    }
                }
                return(Ok(Json(ret)));
            }
            Claim idClaim = User.FindFirst("sub");

            ret = _postActionService.PublishPost(model, idClaim.Value);
            if (ret.IsActionSucceed)
            {
                _bus.Publish <UserPublishedPostAction>(new UserPublishedPostAction()
                {
                    DateUtcAction = DateTime.UtcNow,
                    PostId        = ret.PublishedPostId,
                    UserId        = idClaim.Value
                });
            }
            return(Ok(Json(ret)));
        }
Пример #2
0
        public PublishPostReturnModel PublishPost(PublishPostParameters model, string currUserId)
        {
            PublishPostReturnModel ret = new PublishPostReturnModel()
            {
                IsActionSucceed = false,
                Errors          = new Dictionary <string, string>()
            };

            Post post = _postSet.Include(p => p.PostParts).Include(p => p.UserInfo).FirstOrDefault(p => p.Id == model.Id && p.UserInfoId == currUserId);

            if (post == null)
            {
                return(ret);
            }
            post.Title            = TagHelpers.RemoveUnwantedTags(model.Title);
            post.DateUtcPublished = DateTime.UtcNow;
            post.Description      = model.Description;
            post.IsPublished      = true;
            post.Content          = TagHelpers.RemoveUnwantedTags(model.Content);
            post.DateUtcModified  = DateTime.UtcNow;
            post.Groups           = new List <GroupPost>();
            post.ReputationGains  = new List <ReputationGain>()
            {
                new ReputationGain()
                {
                    GainedReputationValue = _reputationSettings.InitialPostReputationValue,
                    UserInfoId            = currUserId,
                }
            };


            if (post.PostParts.Count < 1)
            {
                ret.Errors.Add("custom", "Please add your pictures");
                return(ret);
            }
            if (model.SelectedCollectionId.HasValue)
            {
                if (model.SelectedCollectionId > 0)
                {
                    PostCollection pcol = _postCollectionDbSet.FirstOrDefault(p => p.Id == model.SelectedCollectionId && p.UserInfoId == currUserId);
                    if (pcol != null)
                    {
                        if (pcol.UserInfoId != currUserId)
                        {
                            ret.Errors.Add("custom", "That does not belongs to you buddy");
                            return(ret);
                        }
                    }
                    post.Collection   = pcol;
                    post.CollectionId = model.SelectedCollectionId;
                }
            }
            if (model.SelectedInterestIds.Length < 1)
            {
                ret.Errors.Add("custom", "Please add at least one interest");
            }
            List <Group> groups = _groupDbSet.Where(p => model.SelectedInterestIds.Contains(p.Id)).ToList();

            int[] groupIds         = groups.Select(p => p.Id).ToArray();
            int[] alreadyFollowIds = _userGroupDbSet
                                     .Where(p => p.GroupFollowState == GroupFollowState.Followed && p.UserId == currUserId && groupIds.Contains(p.GroupId)).Select(p => p.GroupId).ToArray();
            foreach (var item in groupIds)
            {
                post.Groups.Add(new GroupPost()
                {
                    GroupId             = item,
                    DateUtcAdded        = DateTime.UtcNow,
                    PostPopularityLevel = 0
                });
            }
            IEnumerable <Group> unFolloweds = groups.Where(p => !alreadyFollowIds.Contains(p.Id));

            foreach (var unfollowedGroup in unFolloweds)
            {
                UserGroup ug = _userGroupDbSet.FirstOrDefault(p => p.GroupId == unfollowedGroup.Id && p.UserId == currUserId);
                if (ug == null)
                {
                    ug = new UserGroup()
                    {
                        DateUtcFollowed       = DateTime.UtcNow,
                        Group                 = unfollowedGroup,
                        UserInfo              = post.UserInfo,
                        GroupFollowState      = GroupFollowState.Followed,
                        UserReputationInGroup = 0
                    };
                    _userGroupDbSet.Add(ug);
                }
                else
                {
                    ug.GroupFollowState = GroupFollowState.Followed;
                    _userGroupDbSet.Update(ug);
                }
            }
            _postSet.Update(post);
            if (_context.SaveChanges() < 1)
            {
                // if ef-sql exception
                ret.IsActionSucceed = false;
                ret.Errors.Add("custom", "Oops.. Something bad happened. Try again later");
            }
            else
            {
                // reset group-post caches
                foreach (var item in groupIds)
                {
                    var postIdRels = _groupCacheService.GetPostRelationships(item);
                    if (postIdRels != null)
                    {
                        if (postIdRels.Count() > 0)
                        {
                            postIdRels = postIdRels.Append(new GroupPost()
                            {
                                DateUtcAdded = DateTime.UtcNow,
                                GroupId      = item,
                                PostId       = post.Id
                            }).ToArray();
                            _groupCacheService.SetPostRelationships(item, postIdRels, 30);
                        }
                    }
                }
                // set return to succeed
                ret.IsActionSucceed = true;
                ret.PublishedPostId = post.Id;
            }
            return(ret);
        }