コード例 #1
0
        public async Task <IActionResult> AllPosts()
        {
            // Get all posts.
            var postsQuery = new GetPostsQuery();
            var postsDTO   = await _mediator.Send(postsQuery);

            var posts = postsDTO.OrderByDescending(post => post.Date);

            var models = _mapper.Map <IEnumerable <PostDTO>, IEnumerable <PostViewModel> >(posts);

            foreach (var model in models)
            {
                var authorQuery = new GetAuthorQuery {
                    Id = model.AuthorId
                };
                var author = await _mediator.Send(authorQuery);

                var topicQuery = new GetTopicQuery {
                    Id = model.TopicId
                };
                var topic = await _mediator.Send(topicQuery);

                model.Author = author.FirstName + " " + author.LastName;
                model.Topic  = topic.Text;
            }

            return(View(models));
        }
コード例 #2
0
        public async Task Handle_GivenValidId_ReturnsAuthorDTO()
        {
            // Arrange
            var author = new AuthorDTO
            {
                Id        = 1,
                UserId    = "QWERTY1234567890_One",
                FirstName = "FirstName_One",
                LastName  = "LastName_One",
                BirthDate = new DateTime(1988, 01, 01),
            };

            var query = new GetAuthorQuery {
                Id = 1
            };

            // Act
            var handler = new GetAuthorQuery.GetAuthorQueryHandler(Context, Mapper);
            var result  = await handler.Handle(query, CancellationToken.None);

            // Assert
            result.ShouldBeOfType <AuthorDTO>();
            result.ShouldNotBeNull();

            result.Id.ShouldBe(author.Id);
            result.UserId.ShouldBe(author.UserId);
            result.FirstName.ShouldBe(author.FirstName);
            result.LastName.ShouldBe(author.LastName);
            result.BirthDate.ShouldBe(author.BirthDate);
        }
コード例 #3
0
        public async Task <ActionResult <AuthorViewModel> > Get(bool includeProfile)
        {
            var query = new GetAuthorQuery()
            {
                IncludeProfile = includeProfile
            };

            return(this.OkOrNotFound(await _mediator.Send(query)));
        }
コード例 #4
0
        public async Task GetAuthorQueryHandler_ReturnsAuthor()
        {
            await AddAuthor();

            var getAuthorQueryHandler = new GetAuthorQueryHandler(TestContext.CreateHandlerContext <AuthorViewModel>(RequestDbContext), _authorService);
            var message = new GetAuthorQuery()
            {
                IncludeProfile = true
            };

            var result = await getAuthorQueryHandler.Handle(message, CancellationToken.None);

            Assert.Equal("Tom", result.FirstName);
        }
コード例 #5
0
        public async Task Handle_GivenInvalidId_ReturnsNull()
        {
            // Arrange
            var query = new GetAuthorQuery {
                Id = 99
            };

            // Act
            var handler = new GetAuthorQuery.GetAuthorQueryHandler(Context, Mapper);

            var result = await handler.Handle(query, CancellationToken.None);

            // Assert
            result.ShouldBeNull();
        }
コード例 #6
0
ファイル: AuthorsTests.cs プロジェクト: KOTRU/BookStoreApi
        public async Task GetAuthorTest()
        {
            var authorToGet = _authorFaker.Generate();

            _dbContext.GetAuthor(authorToGet.Id).Returns(authorToGet);

            var getAuthorQueryHandler = new GetAuthorQueryHandler(_dbContext);
            var getAuthorQuery        = new GetAuthorQuery
            {
                Id = authorToGet.Id
            };
            var author = await getAuthorQueryHandler.Handle(getAuthorQuery, CancellationToken.None);

            author.Should().Be(authorToGet);
        }
コード例 #7
0
        public async Task <IActionResult> Index(int id = default)
        {
            IRequest <ICollection <PostDTO> > postsQuery;

            if (id == default)
            {
                postsQuery = new GetPostsQuery();
            }
            else
            {
                postsQuery = new GetPostsByAuthorIdQuery {
                    AuthorId = id
                }
            };

            // Get all posts.
            var postsDTO = await _mediator.Send(postsQuery);

            var posts = postsDTO.OrderByDescending(post => post.Date);

            var models = _mapper.Map <IEnumerable <PostDTO>, IEnumerable <PostViewModel> >(posts);

            foreach (var model in models)
            {
                var authorQuery = new GetAuthorQuery {
                    Id = model.AuthorId
                };
                var author = await _mediator.Send(authorQuery);

                var topicQuery = new GetTopicQuery {
                    Id = model.TopicId
                };
                var topic = await _mediator.Send(topicQuery);

                model.AuthorId = author.Id;
                model.Author   = author.FirstName + " " + author.LastName;
                model.Topic    = topic.Text;
            }

            return(View(models));
        }
コード例 #8
0
 public IActionResult GetAuthor(Guid id)
 {
     if (ModelState.IsValid)
     {
         GetAuthorQuery getAuthor = new GetAuthorQuery(id);
         try
         {
             var result = _messages.Dispatch(getAuthor);
             return(Ok(result));
         }
         catch (DomainException ex)
         {
             _logger.LogError(ex.Message);
             return(Error(ex.Message));
         }
         catch (Exception ex)
         {
             _logger.LogCritical(ex.Message);
             return(StatusCode(500));
         }
     }
     return(BadRequest());
 }
コード例 #9
0
        public async Task <IActionResult> Get([FromRoute] Guid authorId)
        {
            var getAuthorQuery = new GetAuthorQuery
            {
                Id = authorId
            };

            try
            {
                var author = await _mediator.Send(getAuthorQuery);

                if (author is null)
                {
                    return(NotFound());
                }
                var response = _mapper.Map <Author, GetAuthorResponse>(author);
                return(Ok(response));
            }
            catch (Exception e)
            {
                return(BadRequest(e.ToString()));
            }
        }
コード例 #10
0
        //[HttpPost]
        public async Task <IActionResult> Delete(int id)
        {
            var authorQuery = new GetAuthorQuery {
                Id = id
            };
            var authorDTO = await _mediator.Send(authorQuery);

            if (authorDTO == null)
            {
                return(NotFound());
            }

            var result = await _identityService.DeleteUserAsync(authorDTO.UserId);

            if (result.Succeeded)
            {
                var authorCommand = new DeleteAuthorCommand {
                    Id = id
                };
                await _mediator.Send(authorCommand);
            }

            return(RedirectToAction("Index", "Authors"));
        }
コード例 #11
0
        public async Task <IActionResult> Read(int id)
        {
            if (id == default)
            {
                return(NotFound());
            }

            // Get post.
            var postQuery = new GetPostQuery {
                Id = id
            };
            var post = await _mediator.Send(postQuery);

            // Add author information.
            var authorQuery = new GetAuthorQuery {
                Id = post.AuthorId
            };
            var author = await _mediator.Send(authorQuery);

            post.Author = author.FirstName + " " + author.LastName;

            // Add topic information.
            var topicQuery = new GetTopicQuery {
                Id = post.TopicId
            };
            var topic = await _mediator.Send(topicQuery);

            post.Topic = topic.Text;

            // Get comments for current post.
            var commentsQuery = new GetCommentsByPostIdQuery {
                PostId = post.Id
            };
            var comments = await _mediator.Send(commentsQuery);

            // Create post view model.
            var model = _mapper.Map <PostDTO, PostViewModel>(post);

            model.AuthorAvatar = author.Avatar;

            // Check current user if he/she is an author of the current post.
            var userName = HttpContext.User.Identity.Name;

            if (userName == null)
            {
                model.CurrentReaderId = default;
            }
            else
            {
                var userId = await _identityService.GetUserIdByNameAsync(userName);

                var reader = await _mediator.Send(new GetAuthorByUserIdQuery { UserId = userId });

                if (reader == null)
                {
                    model.CurrentReaderId = default;
                }
                else
                {
                    model.CurrentReaderId = reader.Id;
                }
            }

            // Check post comments
            model.Comments = _mapper.Map <ICollection <CommentDTO>, ICollection <CommentViewModel> >(comments);

            foreach (var comment in model.Comments)
            {
                var commentAuthorQuery = new GetAuthorQuery {
                    Id = comment.AuthorId
                };
                var commentAuthor = await _mediator.Send(commentAuthorQuery);

                comment.Author = commentAuthor.FirstName + " " + commentAuthor.LastName;

                (var age, var units) = comment.Date.Age();
                comment.Age          = age;
                comment.AgeUnits     = units;
                comment.AuthorAvatar = commentAuthor.Avatar;
            }

            return(View(model));
        }
コード例 #12
0
 public Task <AuthorCommonResult> GetAuthor(
     [FromRoute] GetAuthorQuery query)
 => Mediator.Send(query);
コード例 #13
0
 public override async Task <Author> GetAuthor(GetAuthorQuery request, ServerCallContext context)
 {
     return(await dbContext.Authors
            .SingleOrDefaultAsync(author => author.AuthorId == request.Id));
 }
コード例 #14
0
        /// <summary>
        /// Show user profile page.
        /// </summary>
        /// <param name="id">Author identifier.</param>
        /// <returns>User profile page.</returns>
        public async Task <ActionResult> Index(int id)
        {
            if (id <= 0)
            {
                return(RedirectToAction("Index", "Home"));
            }

            // Get author current author.
            var authorQuery = new GetAuthorQuery {
                Id = id
            };
            var authorDTO = await _mediator.Send(authorQuery);

            authorDTO.Email = await _identityService.GetEmailByIdAsync(authorDTO.UserId);

            // Calculate author statistics.
            var postsQuery = new GetPostsByAuthorIdQuery {
                AuthorId = authorDTO.Id
            };
            var postsDTO = await _mediator.Send(postsQuery);

            var postsNumber = postsDTO.Count;

            var commentsQuery = new GetCommentsByAuthorIdQuery {
                AuthorId = authorDTO.Id
            };
            var commentsDTO = await _mediator.Send(commentsQuery);

            var commentsNumber = commentsDTO.Count;

            // Check current user if he / she is an author of the current post.
            var userName = HttpContext.User.Identity.Name;
            int currentReaderId;

            if (userName == null)
            {
                currentReaderId = default;
            }
            else
            {
                var userId = await _identityService.GetUserIdByNameAsync(userName);

                var reader = await _mediator.Send(new GetAuthorByUserIdQuery { UserId = userId });

                if (reader == null)
                {
                    currentReaderId = default;
                }
                else
                {
                    currentReaderId = reader.Id;
                }
            }

            var model = _mapper.Map <AuthorDTO, ProfileViewModel>(authorDTO);

            model.Age = authorDTO.BirthDate.Age(AgeUnits.Year);
            model.TotalPostsNumber    = postsNumber;
            model.TotalCommentsNumber = commentsNumber;
            model.Posts           = postsDTO;
            model.CurrentReaderId = currentReaderId;
            model.BirthDate       = authorDTO.BirthDate.ToString("MMMM d, yyyy");

            return(View(model));
        }