public void Consume(UserPostFavouritedAction message)
        {
            //try
            //{
            using (FsoContext db = new FsoContext())
            {
                Post   favouritedPost = db.Set <Post>().Include(p => p.ReputationGains).FirstOrDefault(p => p.Id == message.PostId);
                double previousRating = favouritedPost.Rating ?? 0;
                IQueryable <ReputationGain> userReputations = db.SetChild <ReputationGain>().Where(p => p.UserInfoId == message.UserId);
                if (userReputations != null)
                {
                    double total = userReputations.Sum(p => p.GainedReputationValue);
                    favouritedPost.Rating = previousRating + 10;
                }
                if (favouritedPost.ReputationGains == null)
                {
                    favouritedPost.ReputationGains = new List <ReputationGain>();
                }
                ReputationGain rpG = db.Set <ReputationGain>().FirstOrDefault(p => p.PostId == message.PostId && p.UserInfoId == message.PostAuthorId);
                if (rpG == null)
                {
                    favouritedPost.ReputationGains.Add(new ReputationGain()
                    {
                        Post                  = favouritedPost,
                        DateUtcAdd            = message.DateUtcAction,
                        DateUtcModified       = message.DateUtcAction,
                        GainedReputationValue = 10,
                        UserInfoId            = message.PostAuthorId
                    });
                    db.Update(favouritedPost);
                }
                else
                {
                    rpG.GainedReputationValue += 10;
                    db.Update(rpG);
                }

                int z = db.SaveChanges();
                if (z > 0)
                {
                    Console.WriteLine("User Favourited Post Activity Handled For User {0} and Post {1}", message.UserId, message.PostId);
                }
                else
                {
                    Console.WriteLine("User Favourited Post Activity CANNOT Handled For User {0} and Post {1}", message.UserId, message.PostId);
                }
            }
            //}
            //catch (Exception ex)
            //{
            //    Console.WriteLine("User Favourited Post Activity CANNOT Handled For User {0} and Post {1}", message.UserId, message.PostId);
            //    Console.WriteLine(ex.Message);
            //    if (ex.InnerException != null)
            //    {
            //        Console.WriteLine(ex.InnerException.Message);
            //    }
            //}
        }
        public void Consume(UserPostUnfavouritedAction message)
        {
            try
            {
                using (FsoContext db = new FsoContext())
                {
                    Post   favouritedPost = db.Set <Post>().Include(p => p.ReputationGains).FirstOrDefault(p => p.Id == message.PostId);
                    double previousRating = favouritedPost.Rating.Value;
                    favouritedPost.Rating = previousRating - 10;
                    ReputationGain rg = db.Set <ReputationGain>().FirstOrDefault(p => p.PostId == message.PostId && p.UserInfoId == message.PostAuthorId);
                    if (rg != null)
                    {
                        db.Update(favouritedPost);

                        rg.GainedReputationValue -= 10;
                        db.Update(rg);
                    }
                    int z = db.SaveChanges();
                    if (z > 0)
                    {
                        Console.WriteLine("User UnFavourited Post Activity Handled For User {0} and Post {1}", message.UserId, message.PostId);
                    }
                    else
                    {
                        Console.WriteLine("User UnFavourited Post Activity CANNOT Handled For User {0} and Post {1}", message.UserId, message.PostId);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("User Favourited Post Activity CANNOT Handled For User {0} and Post {1}", message.UserId, message.PostId);
                Console.WriteLine(ex.Message);
                if (ex.InnerException != null)
                {
                    Console.WriteLine(ex.InnerException.Message);
                }
            }
        }
Beispiel #3
0
        /// <summary>
        ///  Add review to post
        /// </summary>
        /// <param name="postId">PostId</param>
        /// <param name="rating">Assigned Review Rate</param>
        /// <param name="content">Content of review</param>
        /// <param name="currUserId">Current User Id from Claims</param>
        /// <returns> AddReviewReturnModel which contains information needed for return to user and publish to eventbus</returns>
        public AddReviewReturnModel AddReview(int postId, double rating, string content, string currUserId, string currUsername)
        {
            AddReviewReturnModel ret = new AddReviewReturnModel();
            Post     post            = _postSet.Include(p => p.Reviews).FirstOrDefault(p => p.Id == postId);
            UserInfo reviewer        = _context.Set <UserInfo>().FirstOrDefault(p => p.AppUserId == currUserId);
            UserInfo reviewed        = _context.Set <UserInfo>().FirstOrDefault(p => p.AppUserId == post.UserInfoId);

            if (post.UserInfoId == currUserId)
            {
                ret.IsActionSucceed = false;
                ret.ErrorInformation.UserInformation = "You cannot review your own post";
                //TODO: UNCOMMENT THIS LINE return ret;
            }
            bool isPreReviewed = _reviewSet.Any(p => p.PostId == postId && p.UserId == currUserId);

            // Check if user already reviewed this post
            // TODO: remove !isPreReviewed
            if (isPreReviewed && !isPreReviewed)
            {
                ret.IsActionSucceed = false;
                ret.ErrorInformation.UserInformation = "You can only have one review each post";
                return(ret);
            }
            var    reviewerReputation = GetUserReputation(reviewer.AppUserId, int.MaxValue);
            Review newReview          = new Review()
            {
                Content          = TagHelpers.RemoveUnwantedTags(content),
                DateUtcPublished = DateTime.UtcNow,
                PostId           = postId,
                UserId           = currUserId,
                PostRate         = rating,
                UserReputation   = reviewerReputation
            };

            _reviewSet.Add(newReview);
            if (_context.SaveChanges() != 0)
            {
                // Reputation for adding review
                ReputationGain rg = new ReputationGain()
                {
                    DateUtcAdd            = DateTime.UtcNow,
                    DateUtcModified       = DateTime.UtcNow,
                    GainedReputationValue = _reputationSettings.InitialReviewReputationValue,
                    UserInfoId            = currUserId,
                    PostId   = postId,
                    ReviewId = newReview.Id,
                };
                // Reputatin gain of post owner
                ReputationGain rgofPost = new ReputationGain()
                {
                    DateUtcAdd            = DateTime.UtcNow,
                    DateUtcModified       = DateTime.UtcNow,
                    GainedReputationValue = rating,
                    UserInfoId            = post.UserInfoId,
                    PostId   = postId,
                    ReviewId = newReview.Id,
                };
                _reputationSet.Add(rg);
                _reputationSet.Add(rgofPost);

                _postSet.Update(post);
                ret.PostAuthorId = post.UserInfoId;
                // Remove post rate to calculate when needed
                _postCacheService.RemovePostRateCache(post.Id);
                _context.SaveChanges();
                ret.IsActionSucceed = true;
                ret.Review          = new ReviewActivityEntity()
                {
                    DateUtcPublished = newReview.DateUtcPublished,
                    DislikeCount     = 0,
                    Id           = newReview.Id,
                    Content      = newReview.Content,
                    LikeCount    = 0,
                    PostId       = newReview.PostId.Value,
                    PostRate     = newReview.PostRate.Value,
                    CommentCount = 0,
                    LikeStatus   = LikeStatus.None,
                    AuthorInfo   = new BaseUserInfoDisplay()
                    {
                        AppUserId    = currUserId,
                        ProfileImage = _userProfileImageSettings.UserImageUrlTemplate.Replace("{#appUserId}", currUserId),
                        Username     = currUsername
                    }
                };

                return(ret);
            }
            ret.IsActionSucceed = false;
            return(ret);
        }