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)); }
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))); }