Пример #1
0
        public async Task <ServiceResult <PostLongDto> > UnlockPostAsync(int postId, int userId)
        {
            var post = await _unitOfWork.PostRepository
                       .GetSingleAsync(p => p.Id == postId,
                                       p => p.User,
                                       p => p.Files,
                                       p => p.Votes,
                                       p => p.Group,
                                       p => p.Answers);

            if (post == null)
            {
                return(ServiceResult <PostLongDto> .Fail(EOperationResult.EntityNotFound, "Post not found"));
            }

            var userBuyer = await _unitOfWork.UserRepository.GetSingleAsync(u => u.Id == userId);

            if (userBuyer == null)
            {
                return(ServiceResult <PostLongDto> .Fail(EOperationResult.EntityNotFound, "User with this Id was not found"));
            }

            userBuyer.CurrencyCount = TradingConstants.UnlockMaterialUnicoinsFee + userBuyer.CurrencyCount;

            if (userBuyer.CurrencyCount < 0)
            {
                return(ServiceResult <PostLongDto> .Fail(EOperationResult.NotEnoughUniCoins,
                                                         "You do not have enough UniCoins to unlock this material. Please, upload some materials."));
            }

            var userAvailablePost = new UserAvailablePost()
            {
                Post   = post,
                UserId = userId
            };

            await _unitOfWork.UserAvailablePostRepository.AddAsync(userAvailablePost);

            await _unitOfWork.CommitAsync();

            var postDto = _mapper.Map <Post, PostLongDto>(post);

            return(ServiceResult <PostLongDto> .Ok(postDto));
        }
Пример #2
0
        public async Task <ServiceResult <PostLongDto> > CreatePostAsync(PostAddRequest request, int userId)
        {
            var user = await _unitOfWork.UserRepository.GetSingleAsync(u => u.Id == userId);

            if (!user.IsValidated)
            {
                return(ServiceResult <PostLongDto> .Fail(EOperationResult.ValidationError,
                                                         "Please, validate your email first"));
            }

            var utcNow = _dateHelper.GetDateTimeUtcNow();

            var newPost = new Post(title: request.Title, description: request.Description, subjectId: request.SubjectId,
                                   semester: request.Semester, postLocationTypeId: (int)request.PostLocationType,
                                   postValueTypeId: (int)request.PostValueType, givenAt: request.GivenAt, userId: userId,
                                   groupId: request.GroupId, createdAtUtc: utcNow, modifiedAtUtc: utcNow, lastVisit: utcNow);

            _unitOfWork.PostRepository.Add(newPost);

            var newFiles = CreateFilesForPost(newPost, request.FileInfoRequests, utcNow);

            _unitOfWork.FileRepository.AddRange(newFiles);

            var userAvailablePost = new UserAvailablePost(post: newPost, userId: userId);

            _unitOfWork.UserAvailablePostRepository.Add(userAvailablePost);

            // TODO: move rest of method to separate func or class
            user.CurrencyCount = TradingConstants.NewPostUnicoinsBonus + user.CurrencyCount;

            var newPostVote = new PostVote(post: newPost, userId: userId, voteTypeId: (int)EPostVoteType.Upvote);

            _unitOfWork.PostVoteRepository.Add(newPostVote);

            newPost.VotesCount = CountNewVotes(EPostVoteType.Upvote, newPost.VotesCount);

            await _unitOfWork.CommitAsync();

            return(ServiceResult <PostLongDto> .Ok(_mapper.Map <Post, PostLongDto>(newPost)));
        }