public async Task <Result> Handle(DislikePostCommand request, CancellationToken cancellationToken)
        {
            using (var tx = _session.BeginTransaction())
            {
                var user = await _session.LoadAsync <User>(request.UserID);

                var post = await GetPostAsync(request.UserID, request.PostID);

                return(await user.RemoveLikeFrom(post)
                       .OnSuccessTry(async() => await tx.CommitAsync())
                       .OnSuccess(_ => _logger
                                  .ForContext <DislikePostCommand>()
                                  .Information("User [{Nickname}({UserID})] removed a 'Like' on post {PostID}",
                                               user.Nickname,
                                               request.UserID,
                                               request.PostID))
                       .OnFailure(async errorMessage =>
                {
                    await tx.RollbackAsync();
                    _logger
                    .ForContext <DislikePostCommand>()
                    .Error("Failed to remove a 'Like' on post {PostID} by user [{Nickname}({UserID})]. Error message: {ErrorMessage}",
                           request.PostID,
                           user.Nickname,
                           request.UserID,
                           errorMessage);
                }));
            }
        }
예제 #2
0
        public async Task Should_Dislike_A_Post()
        {
            Result likeResult;
            var    author = new User((Nickname)"author3", (FullName)"author three", Password.Create("password").Value, (Email)"*****@*****.**", "my bio");
            var    reader = new User((Nickname)"reader2", (FullName)"reader two", Password.Create("password").Value, (Email)"*****@*****.**", "my bio");
            var    post   = new Post(author, (Picture)Convert.FromBase64String(DatabaseFixture.GetTestPictureBase64()), (PostText)"test post");

            post.PutLikeBy(reader);
            using (var session = _testFixture.OpenSession(_output))
            {
                await session.SaveAsync(author);

                await session.SaveAsync(reader);

                await session.SaveAsync(post);
            }

            var command = new DislikePostCommand(post.ID, reader.ID);

            using (var session = _testFixture.OpenSession(_output))
            {
                var sut = new LikeOrDislikePostCommandHandler(session, Log.Logger);
                likeResult = await sut.Handle(command, default);
            }

            using (new AssertionScope())
            {
                likeResult.IsSuccess.Should().BeTrue();
                using (var session = _testFixture.OpenSession(_output))
                {
                    (await session.GetAsync <Post>(post.ID)).Likes.Count().Should().Be(0);
                }
            }
        }
예제 #3
0
        public async Task Cannot_Dislike_A_Post_Without_Putting_A_Like_First()
        {
            Result likeResult;
            var    author = new User((Nickname)"author4", (FullName)"author four", Password.Create("password").Value, (Email)"*****@*****.**", "my bio");
            var    reader = new User((Nickname)"reader3", (FullName)"reader three", Password.Create("password").Value, (Email)"*****@*****.**", "my bio");
            var    post   = new Post(author, (Picture)Convert.FromBase64String(DatabaseFixture.GetTestPictureBase64()), (PostText)"test post");

            using (var session = _testFixture.OpenSession(_output))
            {
                await session.SaveAsync(author);

                await session.SaveAsync(reader);

                await session.SaveAsync(post);
            }

            var command = new DislikePostCommand(post.ID, reader.ID);

            using (var session = _testFixture.OpenSession(_output))
            {
                var sut = new LikeOrDislikePostCommandHandler(session, Log.Logger);
                likeResult = await sut.Handle(command, default);
            }

            likeResult.IsSuccess.Should().BeFalse($"User [{reader.Nickname}] did not put any 'Like' on this post.");
        }
예제 #4
0
        public async Task <IActionResult> Dislike(LikePostModel like)
        {
            var command       = new DislikePostCommand(like.PostID, like.UserID);
            var commandResult = await _dispatcher.Send(command);

            return(commandResult.IsSuccess ? Ok() : StatusCode(StatusCodes.Status500InternalServerError));
        }