Refactoring: Added interfaces, custom exceptions, UserManager unit tests, dependency injection/inversion; Regex match search by date, keywords

This commit is contained in:
Dimitar Byalkov
2023-06-06 17:52:36 +02:00
parent 180b261d37
commit 53c42a35d8
43 changed files with 668 additions and 211 deletions

View File

@@ -3,16 +3,23 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Logic;
using Models;
using Data;
namespace WebApp.Pages
{
[Authorize]
public class AnnouncementModel : PageModel
{
private readonly IAnnouncementRepository _announcementRepository;
public AnnouncementModel(IAnnouncementRepository announcementRepository)
{
_announcementRepository = announcementRepository;
}
public void OnGet(int id)
{
AnnouncementManager announcementManager = new AnnouncementManager();
ViewData.Add("announcement", announcementManager.GetAllAnnouncements().Where(x => x.ID == id).First());
AnnouncementManager announcementManager = new AnnouncementManager(_announcementRepository);
ViewData.Add("announcement", announcementManager.GetAllAnnouncements().First(x => x.ID == id));
}
}
}

View File

@@ -4,12 +4,26 @@
@model WebApp.Pages.AnnouncementsModel
@{
ViewData["Title"] = "Announcements";
List<Announcement> announcements = ((List<Announcement>)ViewData["announcements"]).OrderByDescending(x => x.PublishDate).OrderByDescending(x => x.IsSticky).ToList();
int currentPage = @Convert.ToInt32(ViewData["page"]);
List<Announcement> announcements = ((List<Announcement>)ViewData["announcements"]).OrderByDescending(x => x.IsSticky).ToList();
int currentPage = 0;
if (ViewData["page"] != null)
{
currentPage = Convert.ToInt32(ViewData["page"]);
}
}
<a href="./CreateAnnouncement" class="btn btn-primary">Create new announcement</a>
<form method="get">
<div class="form-actions no-color">
<p>
<input type="hidden" name="handler" value="search" />
<input type="text" name="s" />
<input type="submit" asp-page-handler="Search" value="Search" class="btn btn-default" />
</p>
</div>
</form>
<div class="mb-3 mt-3">
@foreach (Announcement announcement in announcements)
{
@@ -27,7 +41,9 @@
}
</div>
<nav aria-label="Page navigation">
@if (ViewData["page"] != null)
{
<nav aria-label="Page navigation">
<ul class="pagination justify-content-center">
@if (currentPage <= 1)
{
@@ -57,4 +73,5 @@
@: </li>
}
</ul>
</nav>
</nav>
}

View File

@@ -11,21 +11,33 @@ namespace WebApp.Pages
public class AnnouncementsModel : PageModel
{
public AnnouncementManager AnnouncementManager { get; set; }
public void OnGet(int? p, int? c)
private readonly IAnnouncementRepository _announcementRepository;
public AnnouncementsModel(IAnnouncementRepository announcementRepository)
{
AnnouncementManager = new AnnouncementManager();
if (p == null || p < 1)
_announcementRepository = announcementRepository;
}
public void OnGet(int? p, int? c) // page, count
{
AnnouncementManager = new AnnouncementManager(_announcementRepository);
if (!(p < 0))
{
p = 1;
}
if (c == null || c < 1)
if (!(c < 1))
{
c = 10;
}
ViewData.Add("announcements", AnnouncementManager.GetAnnouncementsByPage(p - 1, c));
ViewData.Add("announcements", AnnouncementManager.GetAnnouncementsByPage(p.Value - 1, c.Value));
ViewData.Add("page", p);
ViewData.Add("count", c);
ViewData.Add("allCount", AnnouncementManager.GetAllAnnouncements().Count());
ViewData.Add("allCount", AnnouncementManager.GetAllAnnouncements().Count);
}
public void OnGetSearch(string s) // search
{
AnnouncementManager = new AnnouncementManager(_announcementRepository);
ViewData.Add("announcements", AnnouncementManager.SearchAnnouncements(s));
}
}
}

View File

@@ -1,3 +1,4 @@
using Data;
using Logic;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -29,7 +30,7 @@ namespace WebApp.Pages
}
public void OnPost()
{
UserManager userManager = new UserManager();
UserManager userManager = new UserManager(new UserRepository());
User user = userManager.GetUserById(int.Parse(User.FindFirstValue("id")));
if (NewPassword == null)
{

View File

@@ -1,3 +1,4 @@
using Data;
using Logic;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -17,8 +18,8 @@ namespace WebApp.Pages
}
public IActionResult OnPost()
{
AnnouncementManager announcementManager = new AnnouncementManager();
UserManager userManager = new UserManager();
AnnouncementManager announcementManager = new AnnouncementManager(new AnnouncementRepository());
UserManager userManager = new UserManager(new UserRepository());
User user = userManager.GetUserById(int.Parse(User.FindFirstValue("id")));
announcementManager.CreateAnnouncement(Announcement.Title, Announcement.Description, user, DateTime.Now, Announcement.IsImportant, Announcement.IsSticky);
return RedirectToPage("Announcements");

View File

@@ -10,11 +10,17 @@ namespace WebApp.Pages
[Authorize]
public class DeleteAnnouncementModel : PageModel
{
private readonly IAnnouncementRepository _announcementRepository;
public DeleteAnnouncementModel(IAnnouncementRepository announcementRepository)
{
_announcementRepository = announcementRepository;
}
[BindProperty]
public int AnnouncementId { get; set; }
public void OnGet(int id)
{
AnnouncementManager announcementManager = new AnnouncementManager();
AnnouncementManager announcementManager = new AnnouncementManager(_announcementRepository);
if (id != null)
{
Announcement announcement = announcementManager.GetAnnouncementById(id);
@@ -26,7 +32,7 @@ namespace WebApp.Pages
}
public IActionResult OnPost()
{
AnnouncementManager announcementManager = new AnnouncementManager();
AnnouncementManager announcementManager = new AnnouncementManager(_announcementRepository);
announcementManager.DeleteAnnouncement(AnnouncementId);
return RedirectToPage("Announcements");
}

View File

@@ -10,11 +10,17 @@ namespace WebApp.Pages
[Authorize]
public class EditAnnouncementModel : PageModel
{
private readonly IAnnouncementRepository _announcementRepository;
public EditAnnouncementModel(IAnnouncementRepository announcementRepository)
{
_announcementRepository = announcementRepository;
}
[BindProperty]
public Announcement Announcement { get; set; }
public void OnGet(int id)
{
AnnouncementManager announcementManager = new AnnouncementManager();
AnnouncementManager announcementManager = new AnnouncementManager(_announcementRepository);
if (id != null)
{
Announcement announcement = announcementManager.GetAnnouncementById(id);
@@ -26,7 +32,7 @@ namespace WebApp.Pages
}
public IActionResult OnPost()
{
AnnouncementManager announcementManager = new AnnouncementManager();
AnnouncementManager announcementManager = new AnnouncementManager(_announcementRepository);
announcementManager.UpdateAnnouncement(Announcement.ID, Announcement.Title, Announcement.Description, Announcement.IsImportant, Announcement.IsSticky);
return RedirectToPage("Announcements");
}

View File

@@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Authentication.Cookies;
using Models;
using Logic;
using System.Security.Claims;
using Data;
namespace WebApp.Pages
{
@@ -19,7 +20,7 @@ namespace WebApp.Pages
public IActionResult OnPost(string? returnUrl)
{
var userManager = new UserManager();
var userManager = new UserManager(new UserRepository());
User? user = userManager.AuthenticatedUser(MyUser.Name, MyUser.Password);
if (user != null)
{

View File

@@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Logic;
using Models;
using Data;
namespace WebApp.Pages
{
@@ -14,8 +15,8 @@ namespace WebApp.Pages
}
public void OnPost()
{
var userManager = new UserManager();
if (userManager.CreateUser(MyUser.Name, BCrypt.Net.BCrypt.HashPassword(MyUser.Password), MyUser.Role))
var userManager = new UserManager(new UserRepository());
if (userManager.CreateUser(MyUser.Name, BCrypt.Net.BCrypt.HashPassword(MyUser.Password), MyUser.Role) != null)
{
ViewData["confirm"] = $"Successfully registered {MyUser.Name}!";
}