diff --git a/src/Services/Marketing/Marketing.API/Controllers/CampaignsController.cs b/src/Services/Marketing/Marketing.API/Controllers/CampaignsController.cs index 00e8e6eab..94185a608 100644 --- a/src/Services/Marketing/Marketing.API/Controllers/CampaignsController.cs +++ b/src/Services/Marketing/Marketing.API/Controllers/CampaignsController.cs @@ -1,17 +1,18 @@ namespace Microsoft.eShopOnContainers.Services.Marketing.API.Controllers { - using Infrastructure.Repositories; - using Microsoft.AspNetCore.Mvc; - using Microsoft.eShopOnContainers.Services.Marketing.API.Infrastructure; - using System.Threading.Tasks; - using Microsoft.eShopOnContainers.Services.Marketing.API.Model; - using Microsoft.EntityFrameworkCore; - using Microsoft.eShopOnContainers.Services.Marketing.API.Dto; - using System.Collections.Generic; - using Microsoft.AspNetCore.Authorization; using System; using System.Linq; - using Microsoft.Extensions.Options; + using System.Collections.Generic; + using Infrastructure.Repositories; + using AspNetCore.Mvc; + using Infrastructure; + using System.Threading.Tasks; + using Catalog.API.ViewModel; + using Model; + using EntityFrameworkCore; + using Dto; + using AspNetCore.Authorization; + using Extensions.Options; [Route("api/v1/[controller]")] [Authorize] @@ -124,7 +125,7 @@ } [HttpGet("user/{userId:guid}")] - public async Task GetCampaignsByUserId(Guid userId) + public async Task GetCampaignsByUserId(Guid userId, int pageSize = 10, int pageIndex = 0) { var marketingData = await _marketingDataRepository.GetAsync(userId.ToString()); @@ -136,13 +137,13 @@ var campaignDtoList = new List(); //Get User Location Campaign - foreach(var userLocation in marketingData.Locations) + foreach (var userLocation in marketingData.Locations) { var userCampaignList = await _context.Rules .OfType() .Include(c => c.Campaign) .Where(c => c.Campaign.From <= DateTime.Now - && c.Campaign.To >= DateTime.Now + && c.Campaign.To >= DateTime.Now && c.LocationId == userLocation.LocationId) .Select(c => c.Campaign) .ToListAsync(); @@ -154,7 +155,15 @@ } } - return Ok(campaignDtoList); + var totalItems = campaignDtoList.Count(); + campaignDtoList = campaignDtoList + .Skip(pageSize * pageIndex) + .Take(pageSize).ToList(); + + var model = new PaginatedItemsViewModel( + pageIndex, pageSize, totalItems, campaignDtoList); + + return Ok(model); } diff --git a/src/Services/Marketing/Marketing.API/ViewModel/PaginatedItemsViewModel.cs b/src/Services/Marketing/Marketing.API/ViewModel/PaginatedItemsViewModel.cs new file mode 100644 index 000000000..844f38e2b --- /dev/null +++ b/src/Services/Marketing/Marketing.API/ViewModel/PaginatedItemsViewModel.cs @@ -0,0 +1,24 @@ +namespace Microsoft.eShopOnContainers.Services.Catalog.API.ViewModel +{ + using System.Collections.Generic; + + + public class PaginatedItemsViewModel where TEntity : class + { + public int PageIndex { get; private set; } + + public int PageSize { get; private set; } + + public long Count { get; private set; } + + public IEnumerable Data { get; private set; } + + public PaginatedItemsViewModel(int pageIndex, int pageSize, long count, IEnumerable data) + { + this.PageIndex = pageIndex; + this.PageSize = pageSize; + this.Count = count; + this.Data = data; + } + } +} diff --git a/src/Web/WebMVC/Controllers/CampaignsController.cs b/src/Web/WebMVC/Controllers/CampaignsController.cs index 2bdc14652..5ecd24c6d 100644 --- a/src/Web/WebMVC/Controllers/CampaignsController.cs +++ b/src/Web/WebMVC/Controllers/CampaignsController.cs @@ -1,33 +1,44 @@ +using Microsoft.EntityFrameworkCore.Query.Internal; +using WebMVC.ViewModels; + namespace Microsoft.eShopOnContainers.WebMVC.Controllers { - using Microsoft.AspNetCore.Authorization; - using Microsoft.AspNetCore.Mvc; - using Microsoft.eShopOnContainers.WebMVC.Models; - using Microsoft.eShopOnContainers.WebMVC.Services; - using Microsoft.eShopOnContainers.WebMVC.ViewModels; - using System.Collections.Generic; + using AspNetCore.Authorization; + using AspNetCore.Mvc; + using Services; + using ViewModels; using System.Threading.Tasks; + using System; + using ViewModels.Pagination; [Authorize] public class CampaignsController : Controller { - private ICampaignService _campaignService; + private readonly ICampaignService _campaignService; public CampaignsController(ICampaignService campaignService) => _campaignService = campaignService; - public async Task Index() + public async Task Index(int page = 0, int pageSize = 10) { - var campaignDtoList = await _campaignService.GetCampaigns(); + var campaignList = await _campaignService.GetCampaigns(pageSize, page); - if(campaignDtoList is null) + var vm = new CampaignViewModel() { - return View(); - } + CampaignItems = campaignList.Data, + PaginationInfo = new PaginationInfo() + { + ActualPage = page, + ItemsPerPage = pageSize, + TotalItems = campaignList.Count, + TotalPages = (int)Math.Ceiling(((decimal)campaignList.Count / pageSize)) + } + }; - var campaignList = MapCampaignModelListToDtoList(campaignDtoList); + vm.PaginationInfo.Next = (vm.PaginationInfo.ActualPage == vm.PaginationInfo.TotalPages - 1) ? "is-disabled" : ""; + vm.PaginationInfo.Previous = (vm.PaginationInfo.ActualPage == 0) ? "is-disabled" : ""; - return View(campaignList); + return View(vm); } public async Task Details(int id) @@ -39,7 +50,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers return NotFound(); } - var campaign = new Campaign + var campaign = new CampaignItem { Id = campaignDto.Id, Name = campaignDto.Name, @@ -51,30 +62,5 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers return View(campaign); } - - private List MapCampaignModelListToDtoList(IEnumerable campaignDtoList) - { - var campaignList = new List(); - - foreach(var campaignDto in campaignDtoList) - { - campaignList.Add(MapCampaignDtoToModel(campaignDto)); - } - - return campaignList; - } - - private Campaign MapCampaignDtoToModel(CampaignDTO campaign) - { - return new Campaign - { - Id = campaign.Id, - Name = campaign.Name, - Description = campaign.Description, - From = campaign.From, - To = campaign.To, - PictureUri = campaign.PictureUri - }; - } } } \ No newline at end of file diff --git a/src/Web/WebMVC/Infrastructure/API.cs b/src/Web/WebMVC/Infrastructure/API.cs index c41ada86e..2dcf555df 100644 --- a/src/Web/WebMVC/Infrastructure/API.cs +++ b/src/Web/WebMVC/Infrastructure/API.cs @@ -84,9 +84,9 @@ namespace WebMVC.Infrastructure public static class Marketing { - public static string GetAllCampaigns(string baseUri, Guid userId) + public static string GetAllCampaigns(string baseUri, string userId, int take, int page) { - return $"{baseUri}user/{userId}"; + return $"{baseUri}user/{userId}?pageSize={take}&pageIndex={page}"; } public static string GetAllCampaignById(string baseUri, int id) @@ -95,4 +95,4 @@ namespace WebMVC.Infrastructure } } } -} +} \ No newline at end of file diff --git a/src/Web/WebMVC/Services/CampaignService.cs b/src/Web/WebMVC/Services/CampaignService.cs index fa5bd7095..e90be9590 100644 --- a/src/Web/WebMVC/Services/CampaignService.cs +++ b/src/Web/WebMVC/Services/CampaignService.cs @@ -1,15 +1,14 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services { using global::WebMVC.Infrastructure; - using Microsoft.AspNetCore.Authentication; - using Microsoft.AspNetCore.Http; - using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; - using Microsoft.eShopOnContainers.WebMVC.Models; + using AspNetCore.Authentication; + using AspNetCore.Http; + using BuildingBlocks.Resilience.Http; + using ViewModels; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; using System; - using System.Collections.Generic; using System.Threading.Tasks; public class CampaignService : ICampaignService @@ -31,28 +30,28 @@ _httpContextAccesor = httpContextAccesor ?? throw new ArgumentNullException(nameof(httpContextAccesor)); } - public async Task> GetCampaigns() + public async Task GetCampaigns(int pageSize, int pageIndex) { var userId = GetUserIdentity(); - var allCampaignItemsUri = API.Marketing.GetAllCampaigns(_remoteServiceBaseUrl, Guid.Parse(userId)); + var allCampaignItemsUri = API.Marketing.GetAllCampaigns(_remoteServiceBaseUrl, + userId, pageSize, pageIndex); var authorizationToken = await GetUserTokenAsync(); var dataString = await _apiClient.GetStringAsync(allCampaignItemsUri, authorizationToken); - var response = JsonConvert.DeserializeObject>(dataString); + var response = JsonConvert.DeserializeObject(dataString); return response; } - public async Task GetCampaignById(int id) + public async Task GetCampaignById(int id) { - var userId = GetUserIdentity(); var campaignByIdItemUri = API.Marketing.GetAllCampaignById(_remoteServiceBaseUrl, id); var authorizationToken = await GetUserTokenAsync(); var dataString = await _apiClient.GetStringAsync(campaignByIdItemUri, authorizationToken); - var response = JsonConvert.DeserializeObject(dataString); + var response = JsonConvert.DeserializeObject(dataString); return response; } diff --git a/src/Web/WebMVC/Services/ICampaignService.cs b/src/Web/WebMVC/Services/ICampaignService.cs index 2546d7a01..ab80e930a 100644 --- a/src/Web/WebMVC/Services/ICampaignService.cs +++ b/src/Web/WebMVC/Services/ICampaignService.cs @@ -1,13 +1,13 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services { - using Microsoft.eShopOnContainers.WebMVC.Models; using System.Collections.Generic; using System.Threading.Tasks; + using ViewModels; public interface ICampaignService { - Task> GetCampaigns(); + Task GetCampaigns(int pageSize, int pageIndex); - Task GetCampaignById(int id); + Task GetCampaignById(int id); } } \ No newline at end of file diff --git a/src/Web/WebMVC/ViewModels/Campaign.cs b/src/Web/WebMVC/ViewModels/Campaign.cs index dd75085e1..11841fc3f 100644 --- a/src/Web/WebMVC/ViewModels/Campaign.cs +++ b/src/Web/WebMVC/ViewModels/Campaign.cs @@ -1,19 +1,12 @@ namespace Microsoft.eShopOnContainers.WebMVC.ViewModels { - using System; + using System.Collections.Generic; public class Campaign { - public int Id { get; set; } - - public string Name { get; set; } - - public string Description { get; set; } - - public DateTime From { get; set; } - - public DateTime To { get; set; } - - public string PictureUri { get; set; } + public int PageIndex { get; set; } + public int PageSize { get; set; } + public int Count { get; set; } + public List Data { get; set; } } } \ No newline at end of file diff --git a/src/Web/WebMVC/Models/CampaignDTO.cs b/src/Web/WebMVC/ViewModels/CampaignItem.cs similarity index 76% rename from src/Web/WebMVC/Models/CampaignDTO.cs rename to src/Web/WebMVC/ViewModels/CampaignItem.cs index 8368a8a20..a0bfbaf66 100644 --- a/src/Web/WebMVC/Models/CampaignDTO.cs +++ b/src/Web/WebMVC/ViewModels/CampaignItem.cs @@ -1,8 +1,8 @@ -namespace Microsoft.eShopOnContainers.WebMVC.Models +namespace Microsoft.eShopOnContainers.WebMVC.ViewModels { using System; - public class CampaignDTO + public class CampaignItem { public int Id { get; set; } diff --git a/src/Web/WebMVC/ViewModels/CampaignViewModel/CampaignViewModel.cs b/src/Web/WebMVC/ViewModels/CampaignViewModel/CampaignViewModel.cs new file mode 100644 index 000000000..67fdf9cbb --- /dev/null +++ b/src/Web/WebMVC/ViewModels/CampaignViewModel/CampaignViewModel.cs @@ -0,0 +1,12 @@ +namespace WebMVC.ViewModels +{ + using System.Collections.Generic; + using Microsoft.eShopOnContainers.WebMVC.ViewModels; + using Microsoft.eShopOnContainers.WebMVC.ViewModels.Pagination; + + public class CampaignViewModel + { + public IEnumerable CampaignItems { get; set; } + public PaginationInfo PaginationInfo { get; set; } + } +} \ No newline at end of file diff --git a/src/Web/WebMVC/Views/Campaigns/Details.cshtml b/src/Web/WebMVC/Views/Campaigns/Details.cshtml index 3b3dc68a9..2cb2648b6 100644 --- a/src/Web/WebMVC/Views/Campaigns/Details.cshtml +++ b/src/Web/WebMVC/Views/Campaigns/Details.cshtml @@ -1,6 +1,6 @@ @{ ViewData["Title"] = "Campaign details"; - @model Microsoft.eShopOnContainers.WebMVC.ViewModels.Campaign + @model CampaignItem }
diff --git a/src/Web/WebMVC/Views/Campaigns/Index.cshtml b/src/Web/WebMVC/Views/Campaigns/Index.cshtml index ce48ade59..d4c8abe48 100644 --- a/src/Web/WebMVC/Views/Campaigns/Index.cshtml +++ b/src/Web/WebMVC/Views/Campaigns/Index.cshtml @@ -1,6 +1,6 @@ @{ ViewData["Title"] = "Campaigns"; - @model IEnumerable +@model WebMVC.ViewModels.CampaignViewModel }
@@ -9,28 +9,29 @@
- @Html.Partial("_Header", new List
() { - new Header() { Controller = "Catalog", Text = "Back to catalog" } }) +@Html.Partial("_Header", new List
() { + new Header() { Controller = "Catalog", Text = "Back to catalog" } })
-
- @foreach (var campaign in Model ?? Enumerable.Empty()) - { -
-
-
-

@campaign.Name

- @campaign.Name - -
- -
-
- } +
+ @foreach (var catalogItem in Model.CampaignItems) + { +
+ @Html.Partial("_campaign", catalogItem) +
+ }
-
\ No newline at end of file + + @Html.Partial("_pagination", Model.PaginationInfo) + } + else + { +
+ THERE ARE NO CAMPAIGNS +
+ } +
diff --git a/src/Web/WebMVC/Views/Campaigns/_campaign.cshtml b/src/Web/WebMVC/Views/Campaigns/_campaign.cshtml new file mode 100644 index 000000000..de3b52657 --- /dev/null +++ b/src/Web/WebMVC/Views/Campaigns/_campaign.cshtml @@ -0,0 +1,17 @@ +@model CampaignItem + + + +
+
+

@Model.Name

+ @Model.Name + +
+ +
diff --git a/src/Web/WebMVC/Views/Campaigns/_pagination.cshtml b/src/Web/WebMVC/Views/Campaigns/_pagination.cshtml new file mode 100644 index 000000000..038222e93 --- /dev/null +++ b/src/Web/WebMVC/Views/Campaigns/_pagination.cshtml @@ -0,0 +1,32 @@ +@model Microsoft.eShopOnContainers.WebMVC.ViewModels.Pagination.PaginationInfo + +
+
+
+ +
+
+
+ diff --git a/src/Web/WebMVC/WebMVC.csproj b/src/Web/WebMVC/WebMVC.csproj index 7e292cac6..48925ab34 100644 --- a/src/Web/WebMVC/WebMVC.csproj +++ b/src/Web/WebMVC/WebMVC.csproj @@ -79,8 +79,11 @@ - + + + +