From 661a6a9701dd8a28df16dda983f998677f7513e9 Mon Sep 17 00:00:00 2001 From: Akamitori Date: Thu, 5 May 2022 20:54:38 +0300 Subject: [PATCH 1/2] Namespace cleanup --- Pages/Category/SelectedCategory.cshtml.cs | 10 +++++----- Pages/Components/Post/Default.cshtml | 2 +- Pages/Components/PostList/Default.cshtml | 2 +- Pages/Components/ShareWidget/Default.cshtml | 2 +- Pages/Post.cshtml.cs | 6 ++---- Pages/PostList.cshtml.cs | 4 ++-- Pages/RSS.cshtml.cs | 2 +- Pages/Sitemap.cshtml.cs | 3 +-- Program.cs | 12 +++++------- Startup.cs | 4 ++-- Tests/CollectionValidatorUnitTests.cs | 6 +----- Tests/DiskArchiveValidatorIntegrationTests.cs | 3 ++- Tests/LiveServerTests.cs | 2 +- Tests/PageValidationTests.cs | 2 +- Tests/PostTests.cs | 11 +++-------- Tests/RSSTests.cs | 2 +- Tests/TestUtil.cs | 2 +- Tests/XMLDeserIntTestHelper.cs | 6 ++---- Tests/XMLDeserializerTests.cs | 13 +++++-------- Utilities/Entities/Post.cs | 3 +-- Utilities/Interfaces/IDiskArchiveValidator.cs | 4 ++-- Utilities/Interfaces/IPostLoader.cs | 4 ++-- Utilities/Services/PostDeserializer.cs | 7 +++---- Utilities/Services/SitemapBuilder.cs | 1 - Utilities/Util.cs | 7 +------ ViewComponents/Post.cs | 3 ++- ViewComponents/PostList.cs | 2 +- ViewComponents/ShareWidget.cs | 3 ++- 28 files changed, 52 insertions(+), 76 deletions(-) diff --git a/Pages/Category/SelectedCategory.cshtml.cs b/Pages/Category/SelectedCategory.cshtml.cs index 6b4b3dc..fe869b5 100644 --- a/Pages/Category/SelectedCategory.cshtml.cs +++ b/Pages/Category/SelectedCategory.cshtml.cs @@ -4,10 +4,10 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; -using QCUtilities.Entities; -using QCUtilities.Interfaces; -using QCUtilities; - +using QCVault.Utilities; +using QCVault.Utilities.Entities; +using QCVault.Utilities.Interfaces; + namespace QCVault.Pages.Category { public class SelectedCategoryModel : PageModel @@ -42,7 +42,7 @@ public IActionResult OnGet(int? pageNumber, string categoryName) CategoryName = categoryName.Capitalize(); - if (!Utilities.Constants.Categories.TryGetValue(categoryName, out CategoryText)) + if (!Constants.Categories.TryGetValue(categoryName, out CategoryText)) { CategoryText = ""; } diff --git a/Pages/Components/Post/Default.cshtml b/Pages/Components/Post/Default.cshtml index 88de733..28affea 100644 --- a/Pages/Components/Post/Default.cshtml +++ b/Pages/Components/Post/Default.cshtml @@ -1,4 +1,4 @@ -@model QCUtilities.Entities.Post +@model QCVault.Utilities.Entities.Post
diff --git a/Pages/Components/PostList/Default.cshtml b/Pages/Components/PostList/Default.cshtml index c41b5ce..8d048c9 100644 --- a/Pages/Components/PostList/Default.cshtml +++ b/Pages/Components/PostList/Default.cshtml @@ -1,4 +1,4 @@ -@model IEnumerable +@model IEnumerable
@foreach (var post in Model) { diff --git a/Pages/Components/ShareWidget/Default.cshtml b/Pages/Components/ShareWidget/Default.cshtml index 942deac..728ef94 100644 --- a/Pages/Components/ShareWidget/Default.cshtml +++ b/Pages/Components/ShareWidget/Default.cshtml @@ -1,4 +1,4 @@ -@model QCUtilities.Entities.Post +@model QCVault.Utilities.Entities.Post @using Microsoft.AspNetCore.Http.Extensions diff --git a/Pages/Post.cshtml.cs b/Pages/Post.cshtml.cs index 71f344b..89002a8 100644 --- a/Pages/Post.cshtml.cs +++ b/Pages/Post.cshtml.cs @@ -1,13 +1,11 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; -using QCUtilities.Entities; +using QCVault.Utilities.Entities; using System.IO; using Microsoft.Extensions.Logging; -using QCUtilities.Interfaces; +using QCVault.Utilities.Interfaces; namespace QCVault.Pages { diff --git a/Pages/PostList.cshtml.cs b/Pages/PostList.cshtml.cs index 161ca73..55e0381 100644 --- a/Pages/PostList.cshtml.cs +++ b/Pages/PostList.cshtml.cs @@ -5,8 +5,8 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; -using QCUtilities.Entities; -using QCUtilities.Interfaces; +using QCVault.Utilities.Entities; +using QCVault.Utilities.Interfaces; namespace QCVault.Pages diff --git a/Pages/RSS.cshtml.cs b/Pages/RSS.cshtml.cs index 523ba43..027a770 100644 --- a/Pages/RSS.cshtml.cs +++ b/Pages/RSS.cshtml.cs @@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; -using QCUtilities.Interfaces; +using QCVault.Utilities.Interfaces; namespace QCVault.Pages { diff --git a/Pages/Sitemap.cshtml.cs b/Pages/Sitemap.cshtml.cs index 631d46f..88a675c 100644 --- a/Pages/Sitemap.cshtml.cs +++ b/Pages/Sitemap.cshtml.cs @@ -7,8 +7,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; -using QCUtilities.Interfaces; -using QCVault.Utilities.Entities; +using QCVault.Utilities.Interfaces; using QCVault.Utilities.Services; namespace QCVault.Pages diff --git a/Program.cs b/Program.cs index 1a5e553..db0f43e 100644 --- a/Program.cs +++ b/Program.cs @@ -1,11 +1,9 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; using System; -using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; +using QCVault.Utilities.Services; + namespace QCVault { @@ -20,7 +18,7 @@ public static void Main(string[] args) // All we really want to do here is load all the posts, then exit string xmlPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Posts", "posts"); string xsd = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Posts", "posts.xsd"); - new QCUtilities.PostDeserializer(new QCUtilities.DiskArchiveValidator(), new QCUtilities.CollectionValidator(), xmlPath, xsd); + new PostDeserializer(new DiskArchiveValidator(), new CollectionValidator(), xmlPath, xsd); Console.WriteLine("Testing complete!"); diff --git a/Startup.cs b/Startup.cs index 986813c..9487e06 100644 --- a/Startup.cs +++ b/Startup.cs @@ -4,8 +4,8 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Net.Http.Headers; -using QCUtilities; -using QCUtilities.Interfaces; +using QCVault.Utilities.Interfaces; +using QCVault.Utilities.Services; using System; using System.IO; diff --git a/Tests/CollectionValidatorUnitTests.cs b/Tests/CollectionValidatorUnitTests.cs index be4ba1a..863ba43 100644 --- a/Tests/CollectionValidatorUnitTests.cs +++ b/Tests/CollectionValidatorUnitTests.cs @@ -1,9 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using NUnit.Framework; -using QCUtilities; +using QCVault.Utilities.Services; namespace QCVault.Tests { diff --git a/Tests/DiskArchiveValidatorIntegrationTests.cs b/Tests/DiskArchiveValidatorIntegrationTests.cs index 66841ab..90476e9 100644 --- a/Tests/DiskArchiveValidatorIntegrationTests.cs +++ b/Tests/DiskArchiveValidatorIntegrationTests.cs @@ -5,7 +5,8 @@ using System.Threading.Tasks; using System.Xml; using NUnit.Framework; -using QCUtilities; +using QCVault; +using QCVault.Utilities.Services; namespace QCVault.Tests { diff --git a/Tests/LiveServerTests.cs b/Tests/LiveServerTests.cs index 0069b5c..775f284 100644 --- a/Tests/LiveServerTests.cs +++ b/Tests/LiveServerTests.cs @@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.AspNetCore.TestHost; using NUnit.Framework; -using QCUtilities; +using QCVault; namespace QCVault.Tests { diff --git a/Tests/PageValidationTests.cs b/Tests/PageValidationTests.cs index 0ae28a6..bce0557 100644 --- a/Tests/PageValidationTests.cs +++ b/Tests/PageValidationTests.cs @@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.AspNetCore.TestHost; using NUnit.Framework; -using QCUtilities; +using QCVault; namespace QCVault.Tests { diff --git a/Tests/PostTests.cs b/Tests/PostTests.cs index 79bac61..a8bf200 100644 --- a/Tests/PostTests.cs +++ b/Tests/PostTests.cs @@ -1,12 +1,7 @@ -using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc.Testing; -using Microsoft.AspNetCore.TestHost; using NUnit.Framework; -using QCUtilities; +using QCVault.Utilities.Entities; namespace QCVault.Tests { @@ -25,7 +20,7 @@ public async Task Blockquote() Assert.IsTrue(body.Contains("
nested context test
")); } - private QCUtilities.Entities.Post ReadTestPost(string filename) + private Post ReadTestPost(string filename) { var schemas = new System.Xml.Schema.XmlSchemaSet(); using (var input = new StreamReader("Posts/posts.xsd")) @@ -39,7 +34,7 @@ private QCUtilities.Entities.Post ReadTestPost(string filename) var readPost = deserializer.GetType().GetMethod("ReadPost", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); // I don't like the filename, this should be better. Couldn't find a good solution though. FIXME. - return readPost.Invoke(deserializer, new object[] { "../../../" + filename, schemas }) as QCUtilities.Entities.Post; + return readPost.Invoke(deserializer, new object[] { "../../../" + filename, schemas }) as Post; } [Test] diff --git a/Tests/RSSTests.cs b/Tests/RSSTests.cs index 068b4e0..973a356 100644 --- a/Tests/RSSTests.cs +++ b/Tests/RSSTests.cs @@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.AspNetCore.TestHost; using NUnit.Framework; -using QCUtilities; +using QCVault; namespace QCVault.Tests { diff --git a/Tests/TestUtil.cs b/Tests/TestUtil.cs index cded954..2c6f789 100644 --- a/Tests/TestUtil.cs +++ b/Tests/TestUtil.cs @@ -1,7 +1,7 @@ using System; using System.IO; -using QCUtilities; +using QCVault.Utilities.Services; namespace QCVault.Tests { diff --git a/Tests/XMLDeserIntTestHelper.cs b/Tests/XMLDeserIntTestHelper.cs index 547dd9f..67ea60d 100644 --- a/Tests/XMLDeserIntTestHelper.cs +++ b/Tests/XMLDeserIntTestHelper.cs @@ -1,12 +1,10 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Threading.Tasks; using System.Xml; using System.Xml.Serialization; -using QCUtilities.Entities; - +using QCVault.Utilities.Entities; + namespace QCVault.Tests { public static class XMLDeserIntTestHelper diff --git a/Tests/XMLDeserializerTests.cs b/Tests/XMLDeserializerTests.cs index 263dfea..9bb1af1 100644 --- a/Tests/XMLDeserializerTests.cs +++ b/Tests/XMLDeserializerTests.cs @@ -1,14 +1,11 @@ -using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Xml; using NSubstitute; using NUnit.Framework; -using QCUtilities; -using QCUtilities.Entities; -using QCUtilities.Interfaces; - +using QCVault.Utilities.Entities; +using QCVault.Utilities.Interfaces; +using QCVault.Utilities.Services; + namespace QCVault.Tests { public static class DeserializerFactory @@ -82,7 +79,7 @@ public void Deserialize_CompareResultSetToOriginalSet_AreEqual() return; } - [TestCase] + [TestCase] public void DeserializeXML_DuplicateURLS_Throws() { Assert.Warn("Test currently disabled; test XML output needs to be redesigned"); diff --git a/Utilities/Entities/Post.cs b/Utilities/Entities/Post.cs index 6771c79..20beaa8 100644 --- a/Utilities/Entities/Post.cs +++ b/Utilities/Entities/Post.cs @@ -1,11 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using System.Xml.Serialization; -namespace QCUtilities.Entities +namespace QCVault.Utilities.Entities { [Serializable] public class Post diff --git a/Utilities/Interfaces/IDiskArchiveValidator.cs b/Utilities/Interfaces/IDiskArchiveValidator.cs index e61a654..ae2527d 100644 --- a/Utilities/Interfaces/IDiskArchiveValidator.cs +++ b/Utilities/Interfaces/IDiskArchiveValidator.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using System.Text; -using QCUtilities.Entities; +using QCVault.Utilities.Entities; -namespace QCUtilities.Interfaces +namespace QCVault.Utilities.Interfaces { public interface IDiskArchiveValidator { diff --git a/Utilities/Interfaces/IPostLoader.cs b/Utilities/Interfaces/IPostLoader.cs index 62fb830..d836010 100644 --- a/Utilities/Interfaces/IPostLoader.cs +++ b/Utilities/Interfaces/IPostLoader.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using System.Text; -using QCUtilities.Entities; +using QCVault.Utilities.Entities; -namespace QCUtilities.Interfaces +namespace QCVault.Utilities.Interfaces { public interface IPostLoader { diff --git a/Utilities/Services/PostDeserializer.cs b/Utilities/Services/PostDeserializer.cs index 9aa3672..17823fe 100644 --- a/Utilities/Services/PostDeserializer.cs +++ b/Utilities/Services/PostDeserializer.cs @@ -2,16 +2,15 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using System.Xml; using System.Xml.Linq; using System.Xml.Schema; using System.Xml.Serialization; using Newtonsoft.Json; -using QCUtilities.Entities; -using QCUtilities.Interfaces; +using QCVault.Utilities.Entities; +using QCVault.Utilities.Interfaces; -namespace QCUtilities +namespace QCVault.Utilities.Services { public class PostDeserializer : IPostLoader { diff --git a/Utilities/Services/SitemapBuilder.cs b/Utilities/Services/SitemapBuilder.cs index ac8ac7d..de8597d 100644 --- a/Utilities/Services/SitemapBuilder.cs +++ b/Utilities/Services/SitemapBuilder.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using System.Xml.Linq; using QCVault.Utilities.Entities; diff --git a/Utilities/Util.cs b/Utilities/Util.cs index be3d120..63ae706 100644 --- a/Utilities/Util.cs +++ b/Utilities/Util.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace QCUtilities +namespace QCVault.Utilities { public static class Util { diff --git a/ViewComponents/Post.cs b/ViewComponents/Post.cs index 5edb1e5..2d70661 100644 --- a/ViewComponents/Post.cs +++ b/ViewComponents/Post.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc; +using QCVault.Utilities.Entities; namespace QCVault.Components { @@ -8,7 +9,7 @@ public PostViewComponent() { } - public IViewComponentResult Invoke(QCUtilities.Entities.Post post) + public IViewComponentResult Invoke(Post post) { return View("Default", post); } diff --git a/ViewComponents/PostList.cs b/ViewComponents/PostList.cs index 8fcd00e..6f61f3b 100644 --- a/ViewComponents/PostList.cs +++ b/ViewComponents/PostList.cs @@ -9,7 +9,7 @@ public PostListViewComponent() { } - public IViewComponentResult Invoke(IEnumerable postList) + public IViewComponentResult Invoke(IEnumerable postList) { return View("Default", postList); } diff --git a/ViewComponents/ShareWidget.cs b/ViewComponents/ShareWidget.cs index 04460a1..4bdeb98 100644 --- a/ViewComponents/ShareWidget.cs +++ b/ViewComponents/ShareWidget.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc; +using QCVault.Utilities.Entities; namespace QCVault.Components { @@ -8,7 +9,7 @@ public ShareWidgetViewComponent() { } - public IViewComponentResult Invoke(QCUtilities.Entities.Post post) + public IViewComponentResult Invoke(Post post) { return View("Default", post); } From 0baf8575542cd26a6b8919332ad6c13b200c8855 Mon Sep 17 00:00:00 2001 From: Akamitori Date: Thu, 5 May 2022 21:57:59 +0300 Subject: [PATCH 2/2] Implemented pagination --- .../PaginatedPostListButtons/Default.cshtml | 21 +++++++++++++ .../Default.cshtml.cs | 12 +++++++ Pages/PostList.cshtml | 3 ++ Pages/PostList.cshtml.cs | 7 ++--- Utilities/Entities/PaginatedList.cs | 31 +++++++++++++++++++ ViewComponents/PaginatedPostListButton.cs | 17 ++++++++++ 6 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 Pages/Components/PaginatedPostListButtons/Default.cshtml create mode 100644 Pages/Components/PaginatedPostListButtons/Default.cshtml.cs create mode 100644 Utilities/Entities/PaginatedList.cs create mode 100644 ViewComponents/PaginatedPostListButton.cs diff --git a/Pages/Components/PaginatedPostListButtons/Default.cshtml b/Pages/Components/PaginatedPostListButtons/Default.cshtml new file mode 100644 index 0000000..4a389be --- /dev/null +++ b/Pages/Components/PaginatedPostListButtons/Default.cshtml @@ -0,0 +1,21 @@ +@using QCVault.Utilities.Entities; +@model PaginatedList + +@{ + var prevDisabled = !Model.HasPreviousPage ? "disabled" : ""; + var nextDisabled = !Model.HasNextPage ? "disabled" : ""; +} + + + diff --git a/Pages/Components/PaginatedPostListButtons/Default.cshtml.cs b/Pages/Components/PaginatedPostListButtons/Default.cshtml.cs new file mode 100644 index 0000000..92931f7 --- /dev/null +++ b/Pages/Components/PaginatedPostListButtons/Default.cshtml.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace QCVault.Pages.Components.PaginatedButtons +{ + public class DefaultModel : PageModel + { + public void OnGet() + { + } + } +} diff --git a/Pages/PostList.cshtml b/Pages/PostList.cshtml index 3f0759a..31fc3a9 100644 --- a/Pages/PostList.cshtml +++ b/Pages/PostList.cshtml @@ -10,4 +10,7 @@ + + + diff --git a/Pages/PostList.cshtml.cs b/Pages/PostList.cshtml.cs index 55e0381..04e3966 100644 --- a/Pages/PostList.cshtml.cs +++ b/Pages/PostList.cshtml.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; @@ -17,7 +14,7 @@ public class PostListModel : PageModel private readonly ILogger logger; private readonly IPostLoader postLoader; - public IEnumerable Posts { get; set; } + public PaginatedList Posts { get; set; } public PostListModel(ILogger logger, IPostLoader postLoader) { @@ -27,7 +24,7 @@ public PostListModel(ILogger logger, IPostLoader postLoader) public IActionResult OnGet(int? pageNumber) { - Posts = postLoader.VisiblePosts(); + Posts = PaginatedList.Create(postLoader.VisiblePosts().AsQueryable(), pageNumber ?? 1, 5); return Page(); } } diff --git a/Utilities/Entities/PaginatedList.cs b/Utilities/Entities/PaginatedList.cs new file mode 100644 index 0000000..41a6513 --- /dev/null +++ b/Utilities/Entities/PaginatedList.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace QCVault.Utilities.Entities +{ + public class PaginatedList : List + { + public int PageIndex { get; private set; } + public int TotalPages { get; private set; } + + public PaginatedList(List items, int count, int pageIndex, int pageSize) + { + PageIndex = pageIndex; + TotalPages = (int)Math.Ceiling(count / (double)pageSize); + + this.AddRange(items); + } + + public bool HasPreviousPage => PageIndex > 1; + + public bool HasNextPage => PageIndex < TotalPages; + + public static PaginatedList Create(IQueryable source, int pageIndex, int pageSize) + { + var count = source.Count(); + var items = source.Skip(( pageIndex - 1 ) * pageSize).Take(pageSize).ToList(); + return new PaginatedList(items, count, pageIndex, pageSize); + } + } +} diff --git a/ViewComponents/PaginatedPostListButton.cs b/ViewComponents/PaginatedPostListButton.cs new file mode 100644 index 0000000..c747763 --- /dev/null +++ b/ViewComponents/PaginatedPostListButton.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Mvc; +using QCVault.Utilities.Entities; + +namespace QCVault.Components +{ + public class PaginatedPostListButtonsViewComponent : ViewComponent + { + public PaginatedPostListButtonsViewComponent() + { + } + + public IViewComponentResult Invoke(PaginatedList paginatedPosts) + { + return View("Default", paginatedPosts); + } + } +} \ No newline at end of file