Пример #1
0
        public void GetAllPostWithRequiredTagsTest()
        {
            #region Arrange

            var connection = SetConnection();
            var options    = GetOptionsFor(connection);
            PrepareDatabaseWith(options);

            var parameters = new PostResourceParameters()
            {
                Tags    = "<tag2><tag3>",
                OrderBy = ""
            };

            using var context = new BlogContext(options);
            var target = new BlogRepository(context, tagsInString.Object,
                                            mappingService.Object, queryableSorter.Object);

            #endregion Arrange

            #region Act

            var result = target.GetPosts(parameters).ToList();

            #endregion Act

            #region Assert

            Assert.AreEqual(2, result.Count());
            Assert.IsNotNull(result.Find(r => r.Title == "Post3"));
            Assert.IsNotNull(result.Find(r => r.Title == "Post1"));

            #endregion Assert
        }
Пример #2
0
        public async Task <PageList <Post> > GetAllFollowingPosts(Guid userId, PostResourceParameters postResourceParameters)
        {
            if (postResourceParameters == null)
            {
                throw new ArgumentNullException(nameof(postResourceParameters));
            }

            var user = await _context.Users.FindAsync(userId);

            List <Guid> allFollowingIds = user.Following.Select(uf => uf.FollowingId).ToList();

            var collection = _context.Posts as IQueryable <Post>;

            collection = collection.Where(p => allFollowingIds.Contains(p.AuthorId));

            if (!string.IsNullOrWhiteSpace(postResourceParameters.SearchQuery))
            {
                var searchinQuery = postResourceParameters.SearchQuery.Trim().ToLower();
                collection = collection.Where(p => p.Title.ToLower().Contains(searchinQuery));
            }

            if (!string.IsNullOrWhiteSpace(postResourceParameters.OrderBy))
            {
                var postPropertyMappingDictionary = _propertyMapping.GetPropertyMapping <PostOutputDto, Post>();
                collection = collection.ApplySort(postResourceParameters.OrderBy, postPropertyMappingDictionary);
            }

            return(PageList <Post> .Create(collection, postResourceParameters.PageNumber, postResourceParameters.PageSize));
        }
Пример #3
0
        public void GetAllPostsPaginatedTest()
        {
            #region Arrange

            var connection = SetConnection();
            var options    = GetOptionsFor(connection);
            PrepareDatabaseWith(options);

            var parameters = new PostResourceParameters()
            {
                PageSize   = 2,
                PageNumber = 2,
                OrderBy    = ""
            };

            using var context = new BlogContext(options);
            var target = new BlogRepository(context, tagsInString.Object,
                                            mappingService.Object, queryableSorter.Object);

            #endregion Arrange

            #region Act

            var result = target.GetPosts(parameters).ToList();

            #endregion Act

            #region Assert

            Assert.AreEqual(2, result.Count());

            #endregion Assert
        }
Пример #4
0
        public async Task <IActionResult> GetAllFollowingPosts([FromQuery] PostResourceParameters postResourceParameters)
        {
            if (!_propertyMapping.ValidMappingExist <PostOutputDto, Post>(postResourceParameters.OrderBy))
            {
                return(BadRequest());
            }
            if (!_propertyValidation.HasValidProperties <PostOutputDto>(postResourceParameters.Fields))
            {
                return(BadRequest());
            }

            var userId = Guid.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier));


            var postsFromRepo = await _postRepository.GetAllFollowingPosts(userId, postResourceParameters);

            var previousPageLink = postsFromRepo.HasPrevious ? CreatePostsUri(postResourceParameters, UriType.PreviousPage, "GetFollowingPosts") : null;
            var nextPageLink     = postsFromRepo.HasNext ? CreatePostsUri(postResourceParameters, UriType.NextPage, "GetFollowingPosts") : null;

            var metaData = new
            {
                totalCount  = postsFromRepo.TotalCount,
                pageSize    = postsFromRepo.PageSize,
                currentPage = postsFromRepo.CurrentPage,
                totalPages  = postsFromRepo.TotalPages,
                previousPageLink,
                nextPageLink,
            };

            Response.Headers.Add("Pagination", JsonSerializer.Serialize(metaData));

            return(Ok(_mapper.Map <IEnumerable <PostOutputDto> >(postsFromRepo).ShapeData(postResourceParameters.Fields)));
        }
Пример #5
0
        public IActionResult GetPosts([FromQuery] PostResourceParameters postResourceParameters)
        {
            if (!_propertyMapping.ValidMappingExist <PostOutputDto, Post>(postResourceParameters.OrderBy))
            {
                return(BadRequest());
            }
            if (!_propertyValidation.HasValidProperties <PostOutputDto>(postResourceParameters.Fields))
            {
                return(BadRequest());
            }

            var postsFromRepo = _postRepository.GetPosts(postResourceParameters);

            var previousPageLink = postsFromRepo.HasPrevious ? CreatePostsUri(postResourceParameters, UriType.PreviousPage, "GetPosts") : null;
            var nextPageLink     = postsFromRepo.HasNext ? CreatePostsUri(postResourceParameters, UriType.NextPage, "GetPosts") : null;

            var metaData = new
            {
                totalCount  = postsFromRepo.TotalCount,
                pageSize    = postsFromRepo.PageSize,
                currentPage = postsFromRepo.CurrentPage,
                totalPages  = postsFromRepo.TotalPages,
                previousPageLink,
                nextPageLink,
            };

            Response.Headers.Add("Pagination", JsonSerializer.Serialize(metaData));

            return(Ok(_mapper.Map <IEnumerable <PostOutputDto> >(postsFromRepo).ShapeData(postResourceParameters.Fields)));
        }
Пример #6
0
        private string CreatePostsUri(PostResourceParameters postResourceParameters, UriType uriType, string routeName)
        {
            switch (uriType)
            {
            case UriType.PreviousPage:
                return(Url.Link(routeName, new
                {
                    pageNumber = postResourceParameters.PageNumber - 1,
                    postResourceParameters.PageSize,
                    postResourceParameters.SearchQuery,
                    postResourceParameters.OrderBy,
                    postResourceParameters.Fields
                }));

            case UriType.NextPage:
                return(Url.Link(routeName, new
                {
                    pageNumber = postResourceParameters.PageNumber + 1,
                    postResourceParameters.PageSize,
                    searchQuery = postResourceParameters.SearchQuery,
                    postResourceParameters.OrderBy,
                    postResourceParameters.Fields
                }));

            default:
                return(Url.Link(routeName, new
                {
                    postResourceParameters.PageNumber,
                    postResourceParameters.PageSize,
                    postResourceParameters.SearchQuery,
                    postResourceParameters.OrderBy,
                    postResourceParameters.Fields
                }));
            }
        }
Пример #7
0
        public void CreatePagesLinksTest()
        {
            #region Arrange

            var elements = new List <string>()
            {
                "1", "2", "3"
            }.AsQueryable();
            var pagedList = PagedList <string> .Create(elements, 2, 1);

            var target     = new Pagination(properties.Object);
            var parameters = new PostResourceParameters();

            PrepareObjects();

            #endregion Arrange

            #region Act

            var result = target.CreatePagesLinks(pagedList,
                                                 parameters, new ResourceUriHelper(urlHelper.Object));

            #endregion Act

            #region Assert

            Assert.IsTrue(result.HasNext);
            Assert.IsTrue(result.HasPrevious);
            Assert.AreEqual("GetStrings", result.Next);

            #endregion Assert
        }
Пример #8
0
        public void GetAllPostsForAuthorWithRequiredTagsTest()
        {
            #region Arrange

            var connection = SetConnection();
            var options    = GetOptionsFor(connection);
            PrepareDatabaseWith(options);

            var parameters1 = new PostResourceParameters()
            {
                Tags    = "<tag2><tag4>",
                OrderBy = ""
            };

            var parameters2 = new PostResourceParameters()
            {
                Tags    = "<unexisting-tag>",
                OrderBy = ""
            };

            using var context = new BlogContext(options);
            var target = new BlogRepository(context, tagsInString.Object,
                                            mappingService.Object, queryableSorter.Object);

            #endregion Arrange

            #region Act

            var result1 = target.GetPostsForAuthor(guids[1], parameters1).ToList();
            var result2 = target.GetPostsForAuthor(guids[1], parameters2).ToList();

            #endregion Act

            #region Assert

            Assert.AreEqual(1, result1.Count());
            Assert.AreEqual(0, result2.Count());
            Assert.AreEqual("Post4", result1[0].Title);

            #endregion Assert
        }
Пример #9
0
        public ActionResult <IEnumerable <PostOutputDto> > GetPosts
            (Guid authorId, [FromQuery] PostResourceParameters parameters,
            [FromHeader(Name = "Content-Type")] string mediaType)
        {
            if (CantValidateParameters(parameters))
            {
                return(BadRequest());
            }

            if (validator.DontMatchRules(parameters, ModelState))
            {
                return(ValidationProblem());
            }

            if (blogRepository.AuthorNotExist(authorId))
            {
                return(NotFound());
            }

            var postsFromRepo = blogRepository.GetPostsForAuthor(authorId, parameters);

            InsertAuthorsInto(postsFromRepo.ToArray());

            var mappedPosts = mapper.Map <IEnumerable <PostOutputDto> >(postsFromRepo);

            InsertCommentsNumberInto(mappedPosts.ToArray());

            var shapedPosts = properties.ShapeData(mappedPosts, parameters.Fields);

            AddPaginationHeader(postsFromRepo);

            if (IncludeLinks(mediaType))
            {
                var linkedPosts = GetCollectionWithLinks(postsFromRepo, shapedPosts, parameters);
                return(Ok(linkedPosts));
            }

            return(Ok(shapedPosts));
        }
Пример #10
0
        public PageList <Post> GetPosts(PostResourceParameters postResourceParameters)
        {
            if (postResourceParameters == null)
            {
                throw new ArgumentNullException(nameof(postResourceParameters));
            }

            var collection = _context.Posts as IQueryable <Post>;

            if (!string.IsNullOrWhiteSpace(postResourceParameters.SearchQuery))
            {
                string searchinQuery = postResourceParameters.SearchQuery.Trim().ToLower();
                collection = collection.Where(p => p.Title.ToLower().Contains(searchinQuery));
            }

            if (!string.IsNullOrWhiteSpace(postResourceParameters.OrderBy))
            {
                var postPropertyMappingDictionary = _propertyMapping.GetPropertyMapping <PostOutputDto, Post>();
                collection = collection.ApplySort(postResourceParameters.OrderBy, postPropertyMappingDictionary);
            }

            return(PageList <Post> .Create(collection, postResourceParameters.PageNumber, postResourceParameters.PageSize));
        }
Пример #11
0
 private bool CantValidateParameters(PostResourceParameters parameters)
 {
     return(validator.FieldsAreInvalid <PostOutputDto>(parameters.Fields) ||
            validator.OrderIsInvalid <Post, IPostOutputDto>(parameters.OrderBy));
 }