Skip to content

Commit 86e4051

Browse files
committed
Add Pagination to Campaign View
1 parent a537e68 commit 86e4051

14 files changed

Lines changed: 185 additions & 109 deletions

File tree

src/Services/Marketing/Marketing.API/Controllers/CampaignsController.cs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
namespace Microsoft.eShopOnContainers.Services.Marketing.API.Controllers
22
{
3-
using Infrastructure.Repositories;
4-
using Microsoft.AspNetCore.Mvc;
5-
using Microsoft.eShopOnContainers.Services.Marketing.API.Infrastructure;
6-
using System.Threading.Tasks;
7-
using Microsoft.eShopOnContainers.Services.Marketing.API.Model;
8-
using Microsoft.EntityFrameworkCore;
9-
using Microsoft.eShopOnContainers.Services.Marketing.API.Dto;
10-
using System.Collections.Generic;
11-
using Microsoft.AspNetCore.Authorization;
123
using System;
134
using System.Linq;
14-
using Microsoft.Extensions.Options;
5+
using System.Collections.Generic;
6+
using Infrastructure.Repositories;
7+
using AspNetCore.Mvc;
8+
using Infrastructure;
9+
using System.Threading.Tasks;
10+
using Catalog.API.ViewModel;
11+
using Model;
12+
using EntityFrameworkCore;
13+
using Dto;
14+
using AspNetCore.Authorization;
15+
using Extensions.Options;
1516

1617
[Route("api/v1/[controller]")]
1718
[Authorize]
@@ -124,7 +125,7 @@ public async Task<IActionResult> Delete(int id)
124125
}
125126

126127
[HttpGet("user/{userId:guid}")]
127-
public async Task<IActionResult> GetCampaignsByUserId(Guid userId)
128+
public async Task<IActionResult> GetCampaignsByUserId(Guid userId, int pageSize = 10, int pageIndex = 0)
128129
{
129130
var marketingData = await _marketingDataRepository.GetAsync(userId.ToString());
130131

@@ -136,13 +137,13 @@ public async Task<IActionResult> GetCampaignsByUserId(Guid userId)
136137
var campaignDtoList = new List<CampaignDTO>();
137138

138139
//Get User Location Campaign
139-
foreach(var userLocation in marketingData.Locations)
140+
foreach (var userLocation in marketingData.Locations)
140141
{
141142
var userCampaignList = await _context.Rules
142143
.OfType<UserLocationRule>()
143144
.Include(c => c.Campaign)
144145
.Where(c => c.Campaign.From <= DateTime.Now
145-
&& c.Campaign.To >= DateTime.Now
146+
&& c.Campaign.To >= DateTime.Now
146147
&& c.LocationId == userLocation.LocationId)
147148
.Select(c => c.Campaign)
148149
.ToListAsync();
@@ -154,7 +155,15 @@ public async Task<IActionResult> GetCampaignsByUserId(Guid userId)
154155
}
155156
}
156157

157-
return Ok(campaignDtoList);
158+
var totalItems = campaignDtoList.Count();
159+
campaignDtoList = campaignDtoList
160+
.Skip(pageSize * pageIndex)
161+
.Take(pageSize).ToList();
162+
163+
var model = new PaginatedItemsViewModel<CampaignDTO>(
164+
pageIndex, pageSize, totalItems, campaignDtoList);
165+
166+
return Ok(model);
158167
}
159168

160169

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
namespace Microsoft.eShopOnContainers.Services.Catalog.API.ViewModel
2+
{
3+
using System.Collections.Generic;
4+
5+
6+
public class PaginatedItemsViewModel<TEntity> where TEntity : class
7+
{
8+
public int PageIndex { get; private set; }
9+
10+
public int PageSize { get; private set; }
11+
12+
public long Count { get; private set; }
13+
14+
public IEnumerable<TEntity> Data { get; private set; }
15+
16+
public PaginatedItemsViewModel(int pageIndex, int pageSize, long count, IEnumerable<TEntity> data)
17+
{
18+
this.PageIndex = pageIndex;
19+
this.PageSize = pageSize;
20+
this.Count = count;
21+
this.Data = data;
22+
}
23+
}
24+
}
Lines changed: 26 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,44 @@
1+
using Microsoft.EntityFrameworkCore.Query.Internal;
2+
using WebMVC.ViewModels;
3+
14
namespace Microsoft.eShopOnContainers.WebMVC.Controllers
25
{
3-
using Microsoft.AspNetCore.Authorization;
4-
using Microsoft.AspNetCore.Mvc;
5-
using Microsoft.eShopOnContainers.WebMVC.Models;
6-
using Microsoft.eShopOnContainers.WebMVC.Services;
7-
using Microsoft.eShopOnContainers.WebMVC.ViewModels;
8-
using System.Collections.Generic;
6+
using AspNetCore.Authorization;
7+
using AspNetCore.Mvc;
8+
using Services;
9+
using ViewModels;
910
using System.Threading.Tasks;
11+
using System;
12+
using ViewModels.Pagination;
1013

1114
[Authorize]
1215
public class CampaignsController : Controller
1316
{
14-
private ICampaignService _campaignService;
17+
private readonly ICampaignService _campaignService;
1518

1619
public CampaignsController(ICampaignService campaignService) =>
1720
_campaignService = campaignService;
1821

19-
public async Task<IActionResult> Index()
22+
public async Task<IActionResult> Index(int page = 0, int pageSize = 10)
2023
{
21-
var campaignDtoList = await _campaignService.GetCampaigns();
24+
var campaignList = await _campaignService.GetCampaigns(pageSize, page);
2225

23-
if(campaignDtoList is null)
26+
var vm = new CampaignViewModel()
2427
{
25-
return View();
26-
}
28+
CampaignItems = campaignList.Data,
29+
PaginationInfo = new PaginationInfo()
30+
{
31+
ActualPage = page,
32+
ItemsPerPage = pageSize,
33+
TotalItems = campaignList.Count,
34+
TotalPages = (int)Math.Ceiling(((decimal)campaignList.Count / pageSize))
35+
}
36+
};
2737

28-
var campaignList = MapCampaignModelListToDtoList(campaignDtoList);
38+
vm.PaginationInfo.Next = (vm.PaginationInfo.ActualPage == vm.PaginationInfo.TotalPages - 1) ? "is-disabled" : "";
39+
vm.PaginationInfo.Previous = (vm.PaginationInfo.ActualPage == 0) ? "is-disabled" : "";
2940

30-
return View(campaignList);
41+
return View(vm);
3142
}
3243

3344
public async Task<IActionResult> Details(int id)
@@ -39,7 +50,7 @@ public async Task<IActionResult> Details(int id)
3950
return NotFound();
4051
}
4152

42-
var campaign = new Campaign
53+
var campaign = new CampaignItem
4354
{
4455
Id = campaignDto.Id,
4556
Name = campaignDto.Name,
@@ -51,30 +62,5 @@ public async Task<IActionResult> Details(int id)
5162

5263
return View(campaign);
5364
}
54-
55-
private List<Campaign> MapCampaignModelListToDtoList(IEnumerable<CampaignDTO> campaignDtoList)
56-
{
57-
var campaignList = new List<Campaign>();
58-
59-
foreach(var campaignDto in campaignDtoList)
60-
{
61-
campaignList.Add(MapCampaignDtoToModel(campaignDto));
62-
}
63-
64-
return campaignList;
65-
}
66-
67-
private Campaign MapCampaignDtoToModel(CampaignDTO campaign)
68-
{
69-
return new Campaign
70-
{
71-
Id = campaign.Id,
72-
Name = campaign.Name,
73-
Description = campaign.Description,
74-
From = campaign.From,
75-
To = campaign.To,
76-
PictureUri = campaign.PictureUri
77-
};
78-
}
7965
}
8066
}

src/Web/WebMVC/Infrastructure/API.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ public static string GetAllTypes(string baseUri)
8484

8585
public static class Marketing
8686
{
87-
public static string GetAllCampaigns(string baseUri, Guid userId)
87+
public static string GetAllCampaigns(string baseUri, string userId, int take, int page)
8888
{
89-
return $"{baseUri}user/{userId}";
89+
return $"{baseUri}user/{userId}?pageSize={take}&pageIndex={page}";
9090
}
9191

9292
public static string GetAllCampaignById(string baseUri, int id)
@@ -95,4 +95,4 @@ public static string GetAllCampaignById(string baseUri, int id)
9595
}
9696
}
9797
}
98-
}
98+
}

src/Web/WebMVC/Services/CampaignService.cs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
namespace Microsoft.eShopOnContainers.WebMVC.Services
22
{
33
using global::WebMVC.Infrastructure;
4-
using Microsoft.AspNetCore.Authentication;
5-
using Microsoft.AspNetCore.Http;
6-
using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http;
7-
using Microsoft.eShopOnContainers.WebMVC.Models;
4+
using AspNetCore.Authentication;
5+
using AspNetCore.Http;
6+
using BuildingBlocks.Resilience.Http;
7+
using ViewModels;
88
using Microsoft.Extensions.Logging;
99
using Microsoft.Extensions.Options;
1010
using Newtonsoft.Json;
1111
using System;
12-
using System.Collections.Generic;
1312
using System.Threading.Tasks;
1413

1514
public class CampaignService : ICampaignService
@@ -31,28 +30,28 @@ public CampaignService(IOptionsSnapshot<AppSettings> settings, IHttpClient httpC
3130
_httpContextAccesor = httpContextAccesor ?? throw new ArgumentNullException(nameof(httpContextAccesor));
3231
}
3332

34-
public async Task<IEnumerable<CampaignDTO>> GetCampaigns()
33+
public async Task<Campaign> GetCampaigns(int pageSize, int pageIndex)
3534
{
3635
var userId = GetUserIdentity();
37-
var allCampaignItemsUri = API.Marketing.GetAllCampaigns(_remoteServiceBaseUrl, Guid.Parse(userId));
36+
var allCampaignItemsUri = API.Marketing.GetAllCampaigns(_remoteServiceBaseUrl,
37+
userId, pageSize, pageIndex);
3838

3939
var authorizationToken = await GetUserTokenAsync();
4040
var dataString = await _apiClient.GetStringAsync(allCampaignItemsUri, authorizationToken);
4141

42-
var response = JsonConvert.DeserializeObject<IEnumerable<CampaignDTO>>(dataString);
42+
var response = JsonConvert.DeserializeObject<Campaign>(dataString);
4343

4444
return response;
4545
}
4646

47-
public async Task<CampaignDTO> GetCampaignById(int id)
47+
public async Task<CampaignItem> GetCampaignById(int id)
4848
{
49-
var userId = GetUserIdentity();
5049
var campaignByIdItemUri = API.Marketing.GetAllCampaignById(_remoteServiceBaseUrl, id);
5150

5251
var authorizationToken = await GetUserTokenAsync();
5352
var dataString = await _apiClient.GetStringAsync(campaignByIdItemUri, authorizationToken);
5453

55-
var response = JsonConvert.DeserializeObject<CampaignDTO>(dataString);
54+
var response = JsonConvert.DeserializeObject<CampaignItem>(dataString);
5655

5756
return response;
5857
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
namespace Microsoft.eShopOnContainers.WebMVC.Services
22
{
3-
using Microsoft.eShopOnContainers.WebMVC.Models;
43
using System.Collections.Generic;
54
using System.Threading.Tasks;
5+
using ViewModels;
66

77
public interface ICampaignService
88
{
9-
Task<IEnumerable<CampaignDTO>> GetCampaigns();
9+
Task<Campaign> GetCampaigns(int pageSize, int pageIndex);
1010

11-
Task<CampaignDTO> GetCampaignById(int id);
11+
Task<CampaignItem> GetCampaignById(int id);
1212
}
1313
}
Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,12 @@
11
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
22
{
3-
using System;
3+
using System.Collections.Generic;
44

55
public class Campaign
66
{
7-
public int Id { get; set; }
8-
9-
public string Name { get; set; }
10-
11-
public string Description { get; set; }
12-
13-
public DateTime From { get; set; }
14-
15-
public DateTime To { get; set; }
16-
17-
public string PictureUri { get; set; }
7+
public int PageIndex { get; set; }
8+
public int PageSize { get; set; }
9+
public int Count { get; set; }
10+
public List<CampaignItem> Data { get; set; }
1811
}
1912
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
namespace Microsoft.eShopOnContainers.WebMVC.Models
1+
namespace Microsoft.eShopOnContainers.WebMVC.ViewModels
22
{
33
using System;
44

5-
public class CampaignDTO
5+
public class CampaignItem
66
{
77
public int Id { get; set; }
88

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace WebMVC.ViewModels
2+
{
3+
using System.Collections.Generic;
4+
using Microsoft.eShopOnContainers.WebMVC.ViewModels;
5+
using Microsoft.eShopOnContainers.WebMVC.ViewModels.Pagination;
6+
7+
public class CampaignViewModel
8+
{
9+
public IEnumerable<CampaignItem> CampaignItems { get; set; }
10+
public PaginationInfo PaginationInfo { get; set; }
11+
}
12+
}

src/Web/WebMVC/Views/Campaigns/Details.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
@{
22
ViewData["Title"] = "Campaign details";
3-
@model Microsoft.eShopOnContainers.WebMVC.ViewModels.Campaign
3+
@model CampaignItem
44
}
55
<section class="esh-campaigns-hero">
66
<div class="container">

0 commit comments

Comments
 (0)