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