From 1882715f4dde59aaea61bde0d1c94d4d771c18be Mon Sep 17 00:00:00 2001 From: cuqmbr Date: Wed, 12 Oct 2022 09:42:36 +0300 Subject: [PATCH] refactor: replace PagedList class --- .../CountryManagementController.cs | 12 +------- Server/Helpers/PagedList.cs | 28 ------------------- Server/Services/CountryManagementService.cs | 17 +++++++---- Server/Services/ICountryManagementService.cs | 4 +-- .../QueryStringParameters/PagingMetadata.cs | 20 +++++++++++++ 5 files changed, 35 insertions(+), 46 deletions(-) delete mode 100644 Server/Helpers/PagedList.cs create mode 100644 SharedModels/QueryStringParameters/PagingMetadata.cs diff --git a/Server/Controllers/CountryManagementController.cs b/Server/Controllers/CountryManagementController.cs index ba4a096..745c187 100644 --- a/Server/Controllers/CountryManagementController.cs +++ b/Server/Controllers/CountryManagementController.cs @@ -40,17 +40,7 @@ public class CountryManagementController : ControllerBase return BadRequest(result.message); } - var metadata = new - { - result.countries.TotalCount, - result.countries.PageSize, - result.countries.CurrentPage, - result.countries.TotalPages, - result.countries.HasNext, - result.countries.HasPrevious - }; - - Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(metadata)); + Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(result.pagingMetadata)); return Ok(result.countries); } diff --git a/Server/Helpers/PagedList.cs b/Server/Helpers/PagedList.cs deleted file mode 100644 index 26d70f5..0000000 --- a/Server/Helpers/PagedList.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace Server.Helpers; - -public class PagedList : List -{ - public int CurrentPage { get; private set; } - public int TotalPages { get; private set; } - public int PageSize { get; private set; } - public int TotalCount { get; private set; } - - public bool HasPrevious => CurrentPage > 1; - public bool HasNext => CurrentPage < TotalPages; - - public PagedList(List items, int count, int pageNumber, int pageSize) - { - TotalCount = count; - PageSize = pageSize; - CurrentPage = pageNumber; - TotalPages = (int)Math.Ceiling(count / (double)pageSize); - AddRange(items); - } - - public static PagedList ToPagedList(IQueryable source, int pageNumber, int pageSize) - { - var count = source.Count(); - var items = source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList(); - return new PagedList(items, count, pageNumber, pageSize); - } -} \ No newline at end of file diff --git a/Server/Services/CountryManagementService.cs b/Server/Services/CountryManagementService.cs index 1b6044d..2caad8d 100644 --- a/Server/Services/CountryManagementService.cs +++ b/Server/Services/CountryManagementService.cs @@ -2,7 +2,6 @@ using AutoMapper; using AutoMapper.QueryableExtensions; using Microsoft.EntityFrameworkCore; using Server.Data; -using Server.Helpers; using Server.Models; using SharedModels.DataTransferObjects; using SharedModels.QueryStringParameters; @@ -30,13 +29,21 @@ public class CountryManagementService : ICountryManagementService return (true, String.Empty, _mapper.Map(country)); } - - public async Task<(bool isSucceed, string message, PagedList countries)> GetCountries(CountryParameters parameters) + + public async + Task<(bool isSucceed, string message, IEnumerable countries, + PagingMetadata pagingMetadata)> GetCountries(CountryParameters parameters) { - var dbCountries = PagedList.ToPagedList(_dbContext.Countries, + var dbCountries = await _dbContext.Countries + .Skip((parameters.PageNumber - 1) * parameters.PageSize) + .Take(parameters.PageSize) + .ToListAsync(); + + var pagingMetadata = new PagingMetadata(_dbContext.Countries, parameters.PageNumber, parameters.PageSize); - return (true, "", dbCountries); + return (true, "", dbCountries.ConvertAll(c => _mapper.Map(c)), + pagingMetadata); } public async Task<(bool isSucceed, string message, CountryDto country)> GetCountry(int id) diff --git a/Server/Services/ICountryManagementService.cs b/Server/Services/ICountryManagementService.cs index 21d05d4..bccc14a 100644 --- a/Server/Services/ICountryManagementService.cs +++ b/Server/Services/ICountryManagementService.cs @@ -1,4 +1,3 @@ -using Server.Helpers; using Server.Models; using SharedModels.DataTransferObjects; using SharedModels.QueryStringParameters; @@ -9,7 +8,8 @@ public interface ICountryManagementService { Task<(bool isSucceed, string message, CountryDto country)> AddCountry(CreateCountryDto createCountryDto); - Task<(bool isSucceed, string message, PagedList countries)> GetCountries(CountryParameters parameters); + Task<(bool isSucceed, string message, IEnumerable countries, + PagingMetadata pagingMetadata)> GetCountries(CountryParameters parameters); Task<(bool isSucceed, string message, CountryDto country)> GetCountry(int id); Task<(bool isSucceed, string message, CountryDto country)> UpdateCountry(UpdateCountryDto updateCountryDto); Task<(bool isSucceed, string message)> DeleteCountry(int id); diff --git a/SharedModels/QueryStringParameters/PagingMetadata.cs b/SharedModels/QueryStringParameters/PagingMetadata.cs new file mode 100644 index 0000000..57dc292 --- /dev/null +++ b/SharedModels/QueryStringParameters/PagingMetadata.cs @@ -0,0 +1,20 @@ +namespace SharedModels.QueryStringParameters; + +public class PagingMetadata +{ + public int CurrentPage { get; private set; } + public int TotalPages { get; private set; } + public int PageSize { get; private set; } + public int TotalCount { get; private set; } + + public bool HasPrevious => CurrentPage > 1; + public bool HasNext => CurrentPage < TotalPages; + + public PagingMetadata(IQueryable source, int pageNumber, int pageSize) + { + TotalCount = source.Count(); + PageSize = pageSize; + CurrentPage = pageNumber; + TotalPages = (int)Math.Ceiling(TotalCount / (double)pageSize); + } +} \ No newline at end of file