diff --git a/Website/Controllers/BlogController.cs b/Website/Controllers/BlogController.cs index 9cf7486..444eb93 100644 --- a/Website/Controllers/BlogController.cs +++ b/Website/Controllers/BlogController.cs @@ -11,6 +11,7 @@ namespace Website.Controllers { public class BlogController : Controller { + const int MaxPostsPerPage = 10; private readonly BlogRepository _repo; public BlogController(BlogRepository repo) @@ -18,9 +19,13 @@ namespace Website.Controllers _repo = repo; } - public IActionResult Index() + public async Task Page(int page) { - return View(); + var offset = (page - 1) * MaxPostsPerPage; + var posts = (await _repo.GetLatestPostsAsync(MaxPostsPerPage, offset)).Select(p => new BlogPostViewModel(p)); + var maxPages = (await _repo.GetCountAsync()) / MaxPostsPerPage; + var model = new BlogViewModel(posts, page, maxPages); + return View(model); } public async Task View(int id) diff --git a/Website/Data/BlogRepository.cs b/Website/Data/BlogRepository.cs index 6a0aacc..00515c3 100644 --- a/Website/Data/BlogRepository.cs +++ b/Website/Data/BlogRepository.cs @@ -3,6 +3,7 @@ using System.Linq; using Dapper; using Website.Models; using Website.Data.States; +using System.Collections.Generic; namespace Website.Data { @@ -21,12 +22,24 @@ namespace Website.Data } } - public async Task GetLatestPostAsync() { - const string query = "SELECT * FROM blog_posts WHERE post_content<>'' AND post_deleted=0 ORDER BY post_timestamp DESC LIMIT 1"; + public async Task> GetLatestPostsAsync(int limit, int offset) { + const string query = "SELECT * FROM blog_posts WHERE post_content<>'' AND post_deleted=0 ORDER BY post_timestamp DESC LIMIT @offset,@limit"; using (var connection = _dbProvider.NewConnection()) { connection.Open(); - var result = await connection.QueryAsync(query); - return new BlogPost(result.First()); + var results = await connection.QueryAsync(query, new{limit, offset}); + return results.Select(result => new BlogPost(result)); + } + } + + public async Task GetLatestPostAsync() => (await GetLatestPostsAsync(1, 0)).First(); + + public async Task GetCountAsync() + { + var query="SELECT COUNT(*) FROM blog_posts WHERE post_content<>'' AND post_deleted=0"; + using(var connection = _dbProvider.NewConnection()) { + connection.Open(); + var result = await connection.QueryAsync(query); + return result.First(); } } } diff --git a/Website/Startup.cs b/Website/Startup.cs index 756dcdf..4a66dfc 100644 --- a/Website/Startup.cs +++ b/Website/Startup.cs @@ -57,6 +57,13 @@ namespace Website app.UseMvc(routes => { + routes.MapRoute( + name: "blogPages", + template: "blog/{action}/{page:int}", + new { controller = "Blog", action = "Page", page = 1 }); + routes.MapRoute( + name: "blogView", + template: "blog/view/{url}"); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); diff --git a/Website/ViewModels/BlogViewModel.cs b/Website/ViewModels/BlogViewModel.cs new file mode 100644 index 0000000..e8a0354 --- /dev/null +++ b/Website/ViewModels/BlogViewModel.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace Website.ViewModels +{ + public class BlogViewModel + { + public BlogViewModel(IEnumerable posts, int page, int maxPages) + { + Posts = posts; + Page = page; + MaxPages = maxPages; + } + + public IEnumerable Posts { get; } + public int Page { get; } + public int MaxPages { get; } + } +} \ No newline at end of file diff --git a/Website/Views/Blog/Page.cshtml b/Website/Views/Blog/Page.cshtml new file mode 100644 index 0000000..41b7ebc --- /dev/null +++ b/Website/Views/Blog/Page.cshtml @@ -0,0 +1,29 @@ +@model BlogViewModel; + +@{ + ViewData["Title"] = "Blog"; +} + +@section ButtonsLeft { + @if (Model.Page > 1) { + + } +} +@section ButtonsRight { + @if (Model.Page < Model.MaxPages) { + + } +} + +@foreach (var post in Model.Posts) { + +} \ No newline at end of file