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 }
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)); }
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 }
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))); }
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))); }
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 })); } }
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 }
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 }
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)); }
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)); }
private bool CantValidateParameters(PostResourceParameters parameters) { return(validator.FieldsAreInvalid <PostOutputDto>(parameters.Fields) || validator.OrderIsInvalid <Post, IPostOutputDto>(parameters.OrderBy)); }