From 53c42a35d894e502c1563ab0c9ea3c2ff43131d4 Mon Sep 17 00:00:00 2001 From: Dimitar Byalkov Date: Tue, 6 Jun 2023 17:52:36 +0200 Subject: [PATCH] Refactoring: Added interfaces, custom exceptions, UserManager unit tests, dependency injection/inversion; Regex match search by date, keywords --- .../Data/AnnouncementRepository.cs | 84 +++++++--- .../Data/CommentRepository.cs | 32 +++- StudentHouseDashboard/Data/Data.csproj | 1 + .../Data/SqlConnectionHelper.cs | 4 +- StudentHouseDashboard/Data/UserRepository.cs | 58 +++---- .../Logic/AnnouncementManager.cs | 44 +++-- StudentHouseDashboard/Logic/CommentManager.cs | 7 +- .../Exceptions/DatabaseNetworkException.cs} | 2 +- .../Exceptions/DatabaseOperationException.cs | 19 +++ .../Logic/IAnnouncementRepository.cs | 21 +++ .../Logic/ICommentRepository.cs | 19 +++ .../Logic/IUserRepository.cs | 20 +++ StudentHouseDashboard/Logic/Logic.csproj | 1 - StudentHouseDashboard/Logic/UserManager.cs | 38 +++-- StudentHouseDashboard/Models/Announcement.cs | 12 +- StudentHouseDashboard/Models/Comment.cs | 11 +- .../Models/GenericMessage.cs | 17 +- StudentHouseDashboard/Models/IVotable.cs | 19 --- StudentHouseDashboard/Models/User.cs | 17 +- .../Tests/AnnouncementManagerTest.cs | 14 ++ .../Tests/Mocks/AnnouncementRepositoryFake.cs | 60 +++++++ .../Tests/Mocks/UserRepositoryFake.cs | 64 ++++++++ StudentHouseDashboard/Tests/Tests.csproj | 5 + StudentHouseDashboard/Tests/UnitTest1.cs | 11 -- .../Tests/UserManagerTest.cs | 153 ++++++++++++++++++ .../WebApp/Pages/Announcement.cshtml.cs | 11 +- .../WebApp/Pages/Announcements.cshtml | 25 ++- .../WebApp/Pages/Announcements.cshtml.cs | 24 ++- .../WebApp/Pages/ChangePassword.cshtml.cs | 3 +- .../WebApp/Pages/CreateAnnouncement.cshtml.cs | 5 +- .../WebApp/Pages/DeleteAnnouncement.cshtml.cs | 10 +- .../WebApp/Pages/EditAnnouncement.cshtml.cs | 10 +- .../WebApp/Pages/Login.cshtml.cs | 3 +- .../WebApp/Pages/Register.cshtml.cs | 5 +- StudentHouseDashboard/WebApp/Program.cs | 6 + StudentHouseDashboard/WebApp/WebApp.csproj | 1 + .../WinForms/AnnouncementForm.cs | 7 +- StudentHouseDashboard/WinForms/CommentForm.cs | 16 +- StudentHouseDashboard/WinForms/Dashboard.cs | 11 +- StudentHouseDashboard/WinForms/Login.cs | 3 +- StudentHouseDashboard/WinForms/UserForm.cs | 5 +- .../WinForms/WinForms.csproj | 1 + docs/umlclass.vsdx | Bin 79415 -> 94492 bytes 43 files changed, 668 insertions(+), 211 deletions(-) rename StudentHouseDashboard/{Data/Exceptions.cs => Logic/Exceptions/DatabaseNetworkException.cs} (94%) create mode 100644 StudentHouseDashboard/Logic/Exceptions/DatabaseOperationException.cs create mode 100644 StudentHouseDashboard/Logic/IAnnouncementRepository.cs create mode 100644 StudentHouseDashboard/Logic/ICommentRepository.cs create mode 100644 StudentHouseDashboard/Logic/IUserRepository.cs delete mode 100644 StudentHouseDashboard/Models/IVotable.cs create mode 100644 StudentHouseDashboard/Tests/AnnouncementManagerTest.cs create mode 100644 StudentHouseDashboard/Tests/Mocks/AnnouncementRepositoryFake.cs create mode 100644 StudentHouseDashboard/Tests/Mocks/UserRepositoryFake.cs delete mode 100644 StudentHouseDashboard/Tests/UnitTest1.cs create mode 100644 StudentHouseDashboard/Tests/UserManagerTest.cs diff --git a/StudentHouseDashboard/Data/AnnouncementRepository.cs b/StudentHouseDashboard/Data/AnnouncementRepository.cs index a3d4b78..f97bb8c 100644 --- a/StudentHouseDashboard/Data/AnnouncementRepository.cs +++ b/StudentHouseDashboard/Data/AnnouncementRepository.cs @@ -1,14 +1,17 @@ using Models; +using Logic; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; +using Logic.Exceptions; +using System.Reflection; namespace Data { - public class AnnouncementRepository + public class AnnouncementRepository : IAnnouncementRepository { public AnnouncementRepository() { } public List GetAllAnnouncements() @@ -58,21 +61,21 @@ namespace Data return announcement; } } - public List GetAnnouncementsByPage(int? p, int? c) + public List GetAnnouncementsByPage(int p, int c) { List announcements = new List(); UserRepository userRepository = new UserRepository(); - if (c == null || c < 0) + if (c == null) { - c = 10; + throw new DatabaseOperationException("Get announcements: Invalid item count"); } - if (p == null || p < 0) + if (p == null) { - p = 0; + throw new DatabaseOperationException("Get announcements: Invalid page number"); } using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { - string sql = "SELECT * FROM Announcements ORDER BY ID OFFSET @start ROWS FETCH NEXT @count ROWS ONLY;"; + string sql = "SELECT * FROM Announcements ORDER BY ID DESC OFFSET @start ROWS FETCH NEXT @count ROWS ONLY;"; SqlCommand sqlCommand = new SqlCommand(sql, conn); sqlCommand.Parameters.AddWithValue("@start", p * c); sqlCommand.Parameters.AddWithValue("@count", c); @@ -89,7 +92,7 @@ namespace Data } return announcements; } - public bool CreateAnnouncement(string title, string description, User author, DateTime publishDate, bool isImportant, bool isSticky) + public void CreateAnnouncement(string title, string description, User author, DateTime publishDate, bool isImportant, bool isSticky) { using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { @@ -102,15 +105,13 @@ namespace Data cmd.Parameters.AddWithValue("@important", isImportant); cmd.Parameters.AddWithValue("@sticky", isSticky); int writer = cmd.ExecuteNonQuery(); - - if (writer == 1) + if (writer != 1) { - return true; + throw new DatabaseOperationException("Database error: Announcement not created"); } - else return false; } } - public bool UpdateAnnouncement(int id, string title, string description, bool isImportant, bool isSticky) + public void UpdateAnnouncement(int id, string title, string description, bool isImportant, bool isSticky) { using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { @@ -124,15 +125,13 @@ namespace Data cmd.Parameters.AddWithValue("@sticky", isSticky); cmd.Parameters.AddWithValue("@id", id); int writer = cmd.ExecuteNonQuery(); - - if (writer == 1) + if (writer != 1) { - return true; + throw new DatabaseOperationException("Database error: Announcement not updated"); } - else return false; } } - public bool DeleteAnnouncement(int id) + public void DeleteAnnouncement(int id) { using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { @@ -140,13 +139,54 @@ namespace Data SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@id", id); int writer = cmd.ExecuteNonQuery(); - - if (writer == 1) + if (writer != 1) { - return true; + throw new DatabaseOperationException("Database error: Announcement not deleted"); } - else return false; } } + + public List SearchAnnouncement(string query) + { + if (string.IsNullOrEmpty(query)) + { + throw new DatabaseOperationException("Search announements error: Search query is empty"); + } + List announcements = new List(); + UserRepository userRepository = new UserRepository(); + StringBuilder sql = new StringBuilder(); + sql.Append("SELECT * FROM Announcements "); + string[] searchStrings = query.Trim().Split(' '); + for (int i = 0; i < searchStrings.Length; i++) + { + if (i == 0) + { + sql.Append($"WHERE Title LIKE @query{i} OR Description LIKE @query{i} "); + } + else + { + sql.Append($"OR Title LIKE @query{i} OR Description LIKE @query{i} "); + } + } + sql.Append(';'); + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) + { + SqlCommand sqlCommand = new SqlCommand(sql.ToString(), conn); + for (int i = 0; i < searchStrings.Length; i++) + { + sqlCommand.Parameters.AddWithValue($"@query{i}", $"%{searchStrings[i]}%"); + } + var reader = sqlCommand.ExecuteReader(); + while (reader.Read()) + { + announcements.Add(new Announcement(Convert.ToInt32(reader["ID"]), + userRepository.GetUserById(Convert.ToInt32(reader["Author"])), + reader["Description"].ToString(), reader["Title"].ToString(), + (DateTime)reader["PublishDate"], (bool)reader["IsImportant"], + (bool)reader["IsSticky"])); + } + } + return announcements; + } } } diff --git a/StudentHouseDashboard/Data/CommentRepository.cs b/StudentHouseDashboard/Data/CommentRepository.cs index 9848bb3..53eb699 100644 --- a/StudentHouseDashboard/Data/CommentRepository.cs +++ b/StudentHouseDashboard/Data/CommentRepository.cs @@ -1,10 +1,12 @@ using System.ComponentModel.Design; using System.Data.SqlClient; using Models; +using Logic; +using Logic.Exceptions; namespace Data; -public class CommentRepository +public class CommentRepository : ICommentRepository { public CommentRepository() { @@ -100,10 +102,14 @@ public class CommentRepository cmd.Parameters.AddWithValue("@desc", description); cmd.Parameters.AddWithValue("@id", id); int writer = cmd.ExecuteNonQuery(); + if (writer != 1) + { + throw new DatabaseOperationException("Database error: Comment not updated"); + } } } - private Comment CreateComment(User author, string description, string title, DateTime publishDate) + public Comment CreateComment(User author, string description, string title, DateTime publishDate) { using (SqlConnection connection = SqlConnectionHelper.CreateConnection()) { @@ -128,6 +134,10 @@ public class CommentRepository cmd.Parameters.AddWithValue("@announcementID", announcementId); cmd.Parameters.AddWithValue("@commentID", comment.ID); int writer = cmd.ExecuteNonQuery(); + if (writer != 1) + { + throw new DatabaseOperationException("Database error: Announcement comment not created"); + } } } public void CreateResponseOnComment(User author, string description, string title, DateTime publishDate, int commentId) @@ -140,10 +150,14 @@ public class CommentRepository cmd.Parameters.AddWithValue("@commentID", commentId); cmd.Parameters.AddWithValue("@responseID", response.ID); int writer = cmd.ExecuteNonQuery(); + if (writer != 1) + { + throw new DatabaseOperationException("Database error: Comment response not created"); + } } } - private void DeleteComment(int id) + public void DeleteComment(int id) { using (SqlConnection connection = SqlConnectionHelper.CreateConnection()) { @@ -152,6 +166,10 @@ public class CommentRepository SqlCommand cmd = new SqlCommand(sql, connection); cmd.Parameters.AddWithValue("@id", id); int writer = cmd.ExecuteNonQuery(); + if (writer != 1) + { + throw new DatabaseOperationException("Database error: Comment not deleted"); + } } } @@ -165,6 +183,10 @@ public class CommentRepository cmd.Parameters.AddWithValue("@commentId", commentId); cmd.Parameters.AddWithValue("@announcementId", announcementId); int writer = cmd.ExecuteNonQuery(); + if (writer != 1) + { + throw new DatabaseOperationException("Database error: Announcement comment not deleted"); + } } DeleteComment(commentId); } @@ -178,6 +200,10 @@ public class CommentRepository cmd.Parameters.AddWithValue("@commentId", commentId); cmd.Parameters.AddWithValue("@responseId", responseId); int writer = cmd.ExecuteNonQuery(); + if (writer != 1) + { + throw new DatabaseOperationException("Database error: Announcement not created"); + } } DeleteComment(commentId); } diff --git a/StudentHouseDashboard/Data/Data.csproj b/StudentHouseDashboard/Data/Data.csproj index d55a82b..3ee3c33 100644 --- a/StudentHouseDashboard/Data/Data.csproj +++ b/StudentHouseDashboard/Data/Data.csproj @@ -11,6 +11,7 @@ + diff --git a/StudentHouseDashboard/Data/SqlConnectionHelper.cs b/StudentHouseDashboard/Data/SqlConnectionHelper.cs index d445913..9b03e2d 100644 --- a/StudentHouseDashboard/Data/SqlConnectionHelper.cs +++ b/StudentHouseDashboard/Data/SqlConnectionHelper.cs @@ -1,4 +1,5 @@ -using System; +using Logic.Exceptions; +using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; @@ -20,7 +21,6 @@ namespace Data catch (SqlException e) { throw new DatabaseNetworkException("Unable to access FHICT VDI database", e); - // Console.WriteLine("Database connection error. Are you connected to the VDI VPN?"); } return connection; diff --git a/StudentHouseDashboard/Data/UserRepository.cs b/StudentHouseDashboard/Data/UserRepository.cs index acdd681..1cfbfa1 100644 --- a/StudentHouseDashboard/Data/UserRepository.cs +++ b/StudentHouseDashboard/Data/UserRepository.cs @@ -7,10 +7,11 @@ using System.Data.SqlClient; using Models; using System.Data; using System.Xml.Linq; +using Logic; namespace Data { - public class UserRepository + public class UserRepository : IUserRepository { public UserRepository() { } public List GetAllUsers() @@ -54,17 +55,9 @@ namespace Data (UserRole)reader["Role"]); } } - public List GetUsersByPage(int? p, int? c) + public List GetUsersByPage(int p, int c) { List users = new List(); - if (c == null || c < 0) - { - c = 10; - } - if (p == null || p < 0) - { - p = 0; - } using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { string sql = "SELECT * FROM Users ORDER BY ID OFFSET @start ROWS FETCH NEXT @count ROWS ONLY;"; @@ -81,25 +74,20 @@ namespace Data } return users; } - public bool CreateUser(string name, string password, UserRole role) + public User CreateUser(string name, string password, UserRole role) { using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { - string sql = "INSERT INTO Users (Name, Password, Role) VALUES (@name, @pass, @role);"; + string sql = "INSERT INTO Users (Name, Password, Role) VALUES (@name, @pass, @role) " + + "SELECT SCOPE_IDENTITY();"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@name", name); cmd.Parameters.AddWithValue("@pass", password); cmd.Parameters.AddWithValue("@role", (int)role); - int writer = cmd.ExecuteNonQuery(); - - if (writer == 1) - { - return true; - } - else return false; + return GetUserById(Convert.ToInt32(cmd.ExecuteScalar())); } } - public bool UpdateUser(int id, string name, string password, UserRole role) + public void UpdateUser(int id, string name, string password, UserRole role) { using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { @@ -111,16 +99,10 @@ namespace Data cmd.Parameters.AddWithValue("@pass", password); cmd.Parameters.AddWithValue("@role", (int)role); cmd.Parameters.AddWithValue("@id", id); - int writer = cmd.ExecuteNonQuery(); - - if (writer == 1) - { - return true; - } - else return false; + cmd.ExecuteNonQuery(); } } - public bool DisableUser(int id) + public void DisableUser(int id) { using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) { @@ -129,13 +111,21 @@ namespace Data "WHERE ID = @id;"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@id", id.ToString()); - int writer = cmd.ExecuteNonQuery(); + cmd.ExecuteNonQuery(); + } + } - if (writer == 1) - { - return true; - } - else return false; + public User GetUserByName(string userName) + { + using (SqlConnection conn = SqlConnectionHelper.CreateConnection()) + { + string sql = "SELECT * FROM Users WHERE Name = @userName;"; + SqlCommand cmd = new SqlCommand(sql, conn); + cmd.Parameters.AddWithValue("@userName", userName); + var reader = cmd.ExecuteReader(); + + return new User(Convert.ToInt32(reader["ID"]), reader["Name"].ToString(), + reader["Password"].ToString(), (UserRole)reader["Role"]); } } } diff --git a/StudentHouseDashboard/Logic/AnnouncementManager.cs b/StudentHouseDashboard/Logic/AnnouncementManager.cs index f981cd6..78c178b 100644 --- a/StudentHouseDashboard/Logic/AnnouncementManager.cs +++ b/StudentHouseDashboard/Logic/AnnouncementManager.cs @@ -1,20 +1,20 @@ using Models; -using Data; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace Logic { public class AnnouncementManager { - private AnnouncementRepository announcementRepository; - public AnnouncementManager() + private IAnnouncementRepository announcementRepository; + public AnnouncementManager(IAnnouncementRepository announcementRepository) { - announcementRepository = new AnnouncementRepository(); + this.announcementRepository = announcementRepository; } public List GetAllAnnouncements() { @@ -24,22 +24,44 @@ namespace Logic { return announcementRepository.GetAnnouncementById(id); } - public List GetAnnouncementsByPage(int? p, int? c) + public List GetAnnouncementsByPage(int p = 0, int c = 10) { return announcementRepository.GetAnnouncementsByPage(p, c); } - public bool CreateAnnouncement(string title, string description, User author, DateTime publishDate, bool isImportant, bool isSticky) + public void CreateAnnouncement(string title, string description, User author, DateTime publishDate, bool isImportant, bool isSticky) { - return announcementRepository.CreateAnnouncement(title, description, author, publishDate, isImportant, isSticky); + announcementRepository.CreateAnnouncement(title, description, author, publishDate, isImportant, isSticky); } - public bool UpdateAnnouncement(int id, string title, string description, bool isImportant, bool isSticky) + public void UpdateAnnouncement(int id, string title, string description, bool isImportant, bool isSticky) { description += $"{Environment.NewLine}{Environment.NewLine}Updated: {DateTime.Now.ToString("g")}"; - return announcementRepository.UpdateAnnouncement(id, title, description, isImportant, isSticky); + announcementRepository.UpdateAnnouncement(id, title, description, isImportant, isSticky); } - public bool DeleteAnnouncement(int id) + public void DeleteAnnouncement(int id) { - return announcementRepository.DeleteAnnouncement(id); + announcementRepository.DeleteAnnouncement(id); + } + public List SearchAnnouncements(string query) + { + if (string.IsNullOrEmpty(query)) + { + return new List(); + } + else + { + var match = Regex.Match(query, "(?<=date:)[0-9]{4}-[0-9]{2}-[0-9]{2}"); + DateTime date; + if (DateTime.TryParse(match.Groups[0].Value, out date)) + { + query = Regex.Replace(query, "date:[0-9]{4}-[0-9]{2}-[0-9]{2}", ""); + if (string.IsNullOrEmpty(query)) + { + return announcementRepository.GetAllAnnouncements().Where(x => x.PublishDate.Date == date.Date).ToList(); + } + else return announcementRepository.SearchAnnouncement(query).Where(x => x.PublishDate.Date == date.Date).ToList(); + } + else return announcementRepository.SearchAnnouncement(query); + } } } } diff --git a/StudentHouseDashboard/Logic/CommentManager.cs b/StudentHouseDashboard/Logic/CommentManager.cs index 7e12047..e97cb6a 100644 --- a/StudentHouseDashboard/Logic/CommentManager.cs +++ b/StudentHouseDashboard/Logic/CommentManager.cs @@ -1,5 +1,4 @@ using Models; -using Data; using System; using System.Collections.Generic; using System.Linq; @@ -10,10 +9,10 @@ namespace Logic { public class CommentManager { - private CommentRepository commentRepository; - public CommentManager() + private ICommentRepository commentRepository; + public CommentManager(ICommentRepository commentRepository) { - commentRepository = new CommentRepository(); + this.commentRepository = commentRepository; } public void CreateCommentToAnnouncement(User author, string description, string title, DateTime publishDate, int announcementId) diff --git a/StudentHouseDashboard/Data/Exceptions.cs b/StudentHouseDashboard/Logic/Exceptions/DatabaseNetworkException.cs similarity index 94% rename from StudentHouseDashboard/Data/Exceptions.cs rename to StudentHouseDashboard/Logic/Exceptions/DatabaseNetworkException.cs index e7c1dfb..0f16393 100644 --- a/StudentHouseDashboard/Data/Exceptions.cs +++ b/StudentHouseDashboard/Logic/Exceptions/DatabaseNetworkException.cs @@ -5,7 +5,7 @@ using System.Net; using System.Text; using System.Threading.Tasks; -namespace Data +namespace Logic.Exceptions { public class DatabaseNetworkException : WebException { diff --git a/StudentHouseDashboard/Logic/Exceptions/DatabaseOperationException.cs b/StudentHouseDashboard/Logic/Exceptions/DatabaseOperationException.cs new file mode 100644 index 0000000..28ff46c --- /dev/null +++ b/StudentHouseDashboard/Logic/Exceptions/DatabaseOperationException.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Logic.Exceptions +{ + public class DatabaseOperationException : ApplicationException + { + public DatabaseOperationException(string? message) : base(message) + { + } + + public DatabaseOperationException(string? message, Exception? innerException) : base(message, innerException) + { + } + } +} diff --git a/StudentHouseDashboard/Logic/IAnnouncementRepository.cs b/StudentHouseDashboard/Logic/IAnnouncementRepository.cs new file mode 100644 index 0000000..3cbb7ad --- /dev/null +++ b/StudentHouseDashboard/Logic/IAnnouncementRepository.cs @@ -0,0 +1,21 @@ +using Models; +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Logic +{ + public interface IAnnouncementRepository + { + public List GetAllAnnouncements(); + public Announcement GetAnnouncementById(int id); + public List GetAnnouncementsByPage(int p, int c); + public void CreateAnnouncement(string title, string description, User author, DateTime publishDate, bool isImportant, bool isSticky); + public void UpdateAnnouncement(int id, string title, string description, bool isImportant, bool isSticky); + public void DeleteAnnouncement(int id); + public List SearchAnnouncement(string query); + } +} diff --git a/StudentHouseDashboard/Logic/ICommentRepository.cs b/StudentHouseDashboard/Logic/ICommentRepository.cs new file mode 100644 index 0000000..436d3d4 --- /dev/null +++ b/StudentHouseDashboard/Logic/ICommentRepository.cs @@ -0,0 +1,19 @@ +using System.ComponentModel.Design; +using System.Data.SqlClient; +using Models; + +namespace Logic; + +public interface ICommentRepository +{ + public List GetAllCommentsOnAnnouncement(int announcementId); + public List GetAllCommentResponses(int commentId); + public Comment GetCommentById(int id); + public void UpdateComment(int id, string description); + public Comment CreateComment(User author, string description, string title, DateTime publishDate); + public void CreateCommentOnAnnouncement(User author, string description, string title, DateTime publishDate, int announcementId); + public void CreateResponseOnComment(User author, string description, string title, DateTime publishDate, int commentId); + public void DeleteComment(int id); + public void DeleteCommentOnAnnouncement(int commentId, int announcementId); + public void DeleteResponseOnComment(int responseId, int commentId); +} \ No newline at end of file diff --git a/StudentHouseDashboard/Logic/IUserRepository.cs b/StudentHouseDashboard/Logic/IUserRepository.cs new file mode 100644 index 0000000..0ef7674 --- /dev/null +++ b/StudentHouseDashboard/Logic/IUserRepository.cs @@ -0,0 +1,20 @@ +using Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Logic +{ + public interface IUserRepository + { + public List GetAllUsers(); + public User GetUserById(int id); + public User GetUserByName(string userName); + public List GetUsersByPage(int p, int c); + public User CreateUser(string name, string password, UserRole role); + public void UpdateUser(int id, string name, string password, UserRole role); + public void DisableUser(int id); + } +} diff --git a/StudentHouseDashboard/Logic/Logic.csproj b/StudentHouseDashboard/Logic/Logic.csproj index de87000..98717fc 100644 --- a/StudentHouseDashboard/Logic/Logic.csproj +++ b/StudentHouseDashboard/Logic/Logic.csproj @@ -11,7 +11,6 @@ - diff --git a/StudentHouseDashboard/Logic/UserManager.cs b/StudentHouseDashboard/Logic/UserManager.cs index 07410bf..7479b01 100644 --- a/StudentHouseDashboard/Logic/UserManager.cs +++ b/StudentHouseDashboard/Logic/UserManager.cs @@ -1,6 +1,5 @@ using BCrypt.Net; using Models; -using Data; using System; using System.Collections.Generic; using System.Data; @@ -15,10 +14,10 @@ namespace Logic { public class UserManager { - private UserRepository userRepository; - public UserManager() + private readonly IUserRepository userRepository; + public UserManager(IUserRepository userRepository) { - userRepository = new UserRepository(); + this.userRepository = userRepository; } public List GetAllUsers() { @@ -28,29 +27,38 @@ namespace Logic { return userRepository.GetUserById(id); } - public List GetUsersByPage(int? p, int? c) + public List GetUsersByPage(int p = 0, int c = 10) { return userRepository.GetUsersByPage(p, c); } public User? AuthenticatedUser(string name, string password) { List users = userRepository.GetAllUsers(); - User user = users.Find(x => x.Name == name); - if (user == null) + User? user = users.Find(x => x.Name == name); + if (name == null || password == null) { - return null; + throw new ArgumentNullException(); } - else + if (user != null && BCrypt.Net.BCrypt.Verify(password, user.Password)) { - if (BCrypt.Net.BCrypt.Verify(password, user.Password)) - { - return user; - } - else return null; + return user; } + return null; } - public bool CreateUser(string name, string password, UserRole role) + public bool UserExists(string name) { + return userRepository.GetUserByName(name) != null; + } + public User CreateUser(string name, string password, UserRole role) + { + if (UserExists(name)) + { + throw new ArgumentException("User with given username already exists!"); + } + if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(password)) + { + throw new ArgumentException("Name or password should not be empty"); + } return userRepository.CreateUser(name, password, role); } public void UpdateUser(int id, string name, string password, UserRole role) diff --git a/StudentHouseDashboard/Models/Announcement.cs b/StudentHouseDashboard/Models/Announcement.cs index cff3052..d496073 100644 --- a/StudentHouseDashboard/Models/Announcement.cs +++ b/StudentHouseDashboard/Models/Announcement.cs @@ -5,7 +5,7 @@ using System.Text; namespace Models { - public class Announcement : GenericMessage, IVotable + public class Announcement : GenericMessage { public Announcement(int id, User author, string description, string title, DateTime publishDate, bool isImportant, bool isSticky) : base(id, author, description, title, publishDate) { @@ -31,16 +31,6 @@ namespace Models { get; set; } - - public void DownVote() - { - throw new NotImplementedException(); - } - - public void UpVote() - { - throw new NotImplementedException(); - } public override string ToString() { return $"{Title} ({PublishDate.ToString("g")} - {Author.Name})"; diff --git a/StudentHouseDashboard/Models/Comment.cs b/StudentHouseDashboard/Models/Comment.cs index 96bb824..562cf64 100644 --- a/StudentHouseDashboard/Models/Comment.cs +++ b/StudentHouseDashboard/Models/Comment.cs @@ -5,7 +5,7 @@ using System.Text; namespace Models { - public class Comment : GenericMessage, IVotable + public class Comment : GenericMessage { public Comment(int id, User author, string description, string title, DateTime publishDate) : base(id, author, description, title, publishDate) { @@ -13,15 +13,6 @@ namespace Models } public List Responses { get; set; } - public void DownVote() - { - throw new NotImplementedException(); - } - - public void UpVote() - { - throw new NotImplementedException(); - } public override string ToString() { return $"{Author.Name} ({PublishDate.ToString("g")}) - {Description.PadRight(100).Trim()}"; diff --git a/StudentHouseDashboard/Models/GenericMessage.cs b/StudentHouseDashboard/Models/GenericMessage.cs index 35a219c..f6d087d 100644 --- a/StudentHouseDashboard/Models/GenericMessage.cs +++ b/StudentHouseDashboard/Models/GenericMessage.cs @@ -7,11 +7,6 @@ namespace Models { public abstract class GenericMessage { - private User author; - private string description; - private string title; - private DateTime publishDate; - protected GenericMessage(int id, User author, string description, string title, DateTime publishDate) { ID = id; @@ -31,23 +26,19 @@ namespace Models public User Author { - get => author; - set => author = value; + get;set; } public string Description { - get => description; - set => description = value; + get;set; } public string Title { - get => title; - set => title = value; + get;set; } public DateTime PublishDate { - get => publishDate; - set => publishDate = value; + get; set; } } } \ No newline at end of file diff --git a/StudentHouseDashboard/Models/IVotable.cs b/StudentHouseDashboard/Models/IVotable.cs deleted file mode 100644 index 559778f..0000000 --- a/StudentHouseDashboard/Models/IVotable.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Models -{ - public interface IVotable - { - void UpVote() - { - throw new NotImplementedException(); - } - void DownVote() - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/StudentHouseDashboard/Models/User.cs b/StudentHouseDashboard/Models/User.cs index e2771b7..9febc1b 100644 --- a/StudentHouseDashboard/Models/User.cs +++ b/StudentHouseDashboard/Models/User.cs @@ -9,10 +9,6 @@ namespace Models { public class User { - private int id; - private string name; - private string password; - private UserRole role; public User(int id, string name, string password, UserRole role) { @@ -23,29 +19,26 @@ namespace Models } public User() { - + } public int ID { - get; private set; + get; set; } public string Name { - get => name; - set => name = value; + get; set; } [DataType(DataType.Password)] public string Password { - get => password; - set => password = value; + get; set; } public UserRole Role { - get => role; - set => role = value; + get; set; } public override string ToString() { diff --git a/StudentHouseDashboard/Tests/AnnouncementManagerTest.cs b/StudentHouseDashboard/Tests/AnnouncementManagerTest.cs new file mode 100644 index 0000000..86d3b7e --- /dev/null +++ b/StudentHouseDashboard/Tests/AnnouncementManagerTest.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tests +{ + [TestClass] + public class AnnouncementManagerTest + { + + } +} diff --git a/StudentHouseDashboard/Tests/Mocks/AnnouncementRepositoryFake.cs b/StudentHouseDashboard/Tests/Mocks/AnnouncementRepositoryFake.cs new file mode 100644 index 0000000..6014d45 --- /dev/null +++ b/StudentHouseDashboard/Tests/Mocks/AnnouncementRepositoryFake.cs @@ -0,0 +1,60 @@ +using Logic; +using Models; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace Tests.Mocks +{ + public class AnnouncementRepositoryFake : IAnnouncementRepository + { + private List announcements; + private int currentId; + + public AnnouncementRepositoryFake() + { + announcements = new List(); + currentId = 1; + } + + public void CreateAnnouncement(string title, string description, User author, DateTime publishDate, bool isImportant, bool isSticky) + { + announcements.Add(new Announcement(currentId, author, description, title, publishDate, isImportant, isSticky)); + currentId++; + } + + public void DeleteAnnouncement(int id) + { + announcements.RemoveAt(id--); + } + + public List GetAllAnnouncements() + { + return announcements; + } + + public Announcement GetAnnouncementById(int id) + { + return announcements.FirstOrDefault(x => x.ID == id); + } + + public List GetAnnouncementsByPage(int p, int c) + { + return announcements.GetRange(p + c, c); + } + + public void UpdateAnnouncement(int id, string title, string description, bool isImportant, bool isSticky) + { + Announcement announcement = announcements.First(x => x.ID == id); + announcement.Title = title; + announcement.Description = description; + announcement.IsImportant = isImportant; + announcement.IsSticky = isSticky; + } + } +} diff --git a/StudentHouseDashboard/Tests/Mocks/UserRepositoryFake.cs b/StudentHouseDashboard/Tests/Mocks/UserRepositoryFake.cs new file mode 100644 index 0000000..cb2d411 --- /dev/null +++ b/StudentHouseDashboard/Tests/Mocks/UserRepositoryFake.cs @@ -0,0 +1,64 @@ +using Models; +using Logic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tests.Mocks +{ + public class UserRepositoryFake : IUserRepository + { + private List users; + private int currentId; + public UserRepositoryFake() + { + users = new List(); + currentId = 1; + } + + public User CreateUser(string name, string password, UserRole role) + { + User user = new User(currentId, name, password, role); + users.Add(user); + currentId++; + return user; + } + + public void DisableUser(int id) + { + User user = users.First(x => x.ID == id); + user.Name = $"Deleted User {user.ID}"; + user.Password = "0"; + } + + public List GetAllUsers() + { + return users; + } + + public User GetUserById(int id) + { + return users.First(x => x.ID == id); + } + + public User GetUserByName(string userName) + { + return users.FirstOrDefault(x => x.Name == userName); + } + + public List GetUsersByPage(int p, int c) + { + return users.GetRange(p + c, c); + } + + public void UpdateUser(int id, string name, string password, UserRole role) + { + User user = users.First(x => x.ID == id); + user.Name = name; + user.Password = password; + user.Role = role; + } + } +} diff --git a/StudentHouseDashboard/Tests/Tests.csproj b/StudentHouseDashboard/Tests/Tests.csproj index d0a09ad..5bb4e96 100644 --- a/StudentHouseDashboard/Tests/Tests.csproj +++ b/StudentHouseDashboard/Tests/Tests.csproj @@ -16,4 +16,9 @@ + + + + + diff --git a/StudentHouseDashboard/Tests/UnitTest1.cs b/StudentHouseDashboard/Tests/UnitTest1.cs deleted file mode 100644 index f91fc3b..0000000 --- a/StudentHouseDashboard/Tests/UnitTest1.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Tests -{ - [TestClass] - public class UnitTest1 - { - [TestMethod] - public void TestMethod1() - { - } - } -} \ No newline at end of file diff --git a/StudentHouseDashboard/Tests/UserManagerTest.cs b/StudentHouseDashboard/Tests/UserManagerTest.cs new file mode 100644 index 0000000..525eef2 --- /dev/null +++ b/StudentHouseDashboard/Tests/UserManagerTest.cs @@ -0,0 +1,153 @@ +using BCrypt.Net; +using Logic; +using Models; +using Tests.Mocks; + +namespace Tests +{ + + [TestClass] + public class UserManagerTest + { + // constants + readonly string USER_NAME = "user"; + readonly string USER_PASSWORD = "password"; + + [TestMethod] + public void AuthenticatedUserWrongPasswordTest() + { + // Arrange + UserManager userManager = new UserManager(new UserRepositoryFake()); + + // Act + userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT); + User? result = userManager.AuthenticatedUser(USER_NAME, "incorrect"); + + // Assert + Assert.IsNull(result); + } + + [TestMethod] + [ExpectedException(typeof(ArgumentNullException))] + public void AuthenticatedUserNullPasswordTest() + { + // Arrange + UserManager userManager = new UserManager(new UserRepositoryFake()); + + // Act + userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT); + userManager.AuthenticatedUser(USER_NAME, null); + + // Assert + // ArgumentNullException expected + } + + [TestMethod] + public void AuthenticatedUserWrongNameTest() + { + // Arrange + UserManager userManager = new UserManager(new UserRepositoryFake()); + userManager.CreateUser(USER_NAME, USER_PASSWORD, UserRole.TENANT); + + // Act + User? result = userManager.AuthenticatedUser("incorrect", USER_PASSWORD); + + // Assert + Assert.IsNull(result); + } + + [TestMethod] + public void AuthenticatedUserCorrectDetailsTest() + { + // Arrange + UserManager userManager = new UserManager(new UserRepositoryFake()); + + User user = userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT); + + // Act + User? result = userManager.AuthenticatedUser(USER_NAME, USER_PASSWORD); + + // Assert + Assert.AreEqual(user, result); + } + + [TestMethod] + public void CreateUserCorrectDetailsTest() + { + // Arrange + UserManager userManager = new UserManager(new UserRepositoryFake()); + + int userId = 1; + string hashedPassword = BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD); + User user = new User(userId, USER_NAME, hashedPassword, UserRole.TENANT); + + // Act + User result = userManager.CreateUser(USER_NAME, hashedPassword, UserRole.TENANT); + + // Assert + Assert.AreEqual(user.ID, result.ID); + Assert.AreEqual(user.Name, result.Name); + Assert.AreEqual(user.Password, result.Password); + Assert.AreEqual(user.Role, result.Role); + } + + [TestMethod] + [ExpectedException(typeof(ArgumentException))] + public void CreateUserDuplicateNameTest() + { + // Arrange + UserManager userManager = new UserManager(new UserRepositoryFake()); + + // Act + userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT); + userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT); + + // Assert + // ArgumentException expected + } + + [TestMethod] + [ExpectedException(typeof(ArgumentException))] + public void CreateUserEmptyNameTest() + { + // Arrange + UserManager userManager = new UserManager(new UserRepositoryFake()); + + // Act + userManager.CreateUser("", BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT); + + // Assert + // ArgumentException expected + } + + [TestMethod] + [ExpectedException(typeof(ArgumentException))] + public void CreateUserEmptyPasswordTest() + { + // Arrange + UserManager userManager = new UserManager(new UserRepositoryFake()); + + // Act + userManager.CreateUser(USER_NAME, "", UserRole.TENANT); + + // Assert + // ArgumentException expected + } + + [TestMethod] + public void DisableUserTest() + { + // Arrange + UserManager userManager = new UserManager(new UserRepositoryFake()); + User user = userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT); + + // Act + userManager.DisableUser(user.ID); + + // Assert + Assert.AreEqual(user.Name, $"Deleted User {user.ID}"); + Assert.AreEqual(user.Password, "0"); + } + + } +} \ No newline at end of file diff --git a/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml.cs index 1035b2b..3a71f2f 100644 --- a/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml.cs +++ b/StudentHouseDashboard/WebApp/Pages/Announcement.cshtml.cs @@ -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)); } } } diff --git a/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml b/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml index 8fd37e7..2cf7b98 100644 --- a/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml +++ b/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml @@ -4,12 +4,26 @@ @model WebApp.Pages.AnnouncementsModel @{ ViewData["Title"] = "Announcements"; - List announcements = ((List)ViewData["announcements"]).OrderByDescending(x => x.PublishDate).OrderByDescending(x => x.IsSticky).ToList(); - int currentPage = @Convert.ToInt32(ViewData["page"]); + List announcements = ((List)ViewData["announcements"]).OrderByDescending(x => x.IsSticky).ToList(); + int currentPage = 0; + if (ViewData["page"] != null) + { + currentPage = Convert.ToInt32(ViewData["page"]); + } } Create new announcement +
+
+

+ + + +

+
+
+
@foreach (Announcement announcement in announcements) { @@ -27,7 +41,9 @@ }
- +} \ No newline at end of file diff --git a/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml.cs index 5f13b08..2a12b95 100644 --- a/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml.cs +++ b/StudentHouseDashboard/WebApp/Pages/Announcements.cshtml.cs @@ -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)); } } } diff --git a/StudentHouseDashboard/WebApp/Pages/ChangePassword.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/ChangePassword.cshtml.cs index e22d79f..8582c93 100644 --- a/StudentHouseDashboard/WebApp/Pages/ChangePassword.cshtml.cs +++ b/StudentHouseDashboard/WebApp/Pages/ChangePassword.cshtml.cs @@ -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) { diff --git a/StudentHouseDashboard/WebApp/Pages/CreateAnnouncement.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/CreateAnnouncement.cshtml.cs index 9ac90be..e44a826 100644 --- a/StudentHouseDashboard/WebApp/Pages/CreateAnnouncement.cshtml.cs +++ b/StudentHouseDashboard/WebApp/Pages/CreateAnnouncement.cshtml.cs @@ -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"); diff --git a/StudentHouseDashboard/WebApp/Pages/DeleteAnnouncement.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/DeleteAnnouncement.cshtml.cs index c8d57d8..f022e0a 100644 --- a/StudentHouseDashboard/WebApp/Pages/DeleteAnnouncement.cshtml.cs +++ b/StudentHouseDashboard/WebApp/Pages/DeleteAnnouncement.cshtml.cs @@ -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"); } diff --git a/StudentHouseDashboard/WebApp/Pages/EditAnnouncement.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/EditAnnouncement.cshtml.cs index 3000016..d35567d 100644 --- a/StudentHouseDashboard/WebApp/Pages/EditAnnouncement.cshtml.cs +++ b/StudentHouseDashboard/WebApp/Pages/EditAnnouncement.cshtml.cs @@ -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"); } diff --git a/StudentHouseDashboard/WebApp/Pages/Login.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/Login.cshtml.cs index 37452d6..004bfda 100644 --- a/StudentHouseDashboard/WebApp/Pages/Login.cshtml.cs +++ b/StudentHouseDashboard/WebApp/Pages/Login.cshtml.cs @@ -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) { diff --git a/StudentHouseDashboard/WebApp/Pages/Register.cshtml.cs b/StudentHouseDashboard/WebApp/Pages/Register.cshtml.cs index e349e95..18bbaa3 100644 --- a/StudentHouseDashboard/WebApp/Pages/Register.cshtml.cs +++ b/StudentHouseDashboard/WebApp/Pages/Register.cshtml.cs @@ -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}!"; } diff --git a/StudentHouseDashboard/WebApp/Program.cs b/StudentHouseDashboard/WebApp/Program.cs index abbb8e9..70b2416 100644 --- a/StudentHouseDashboard/WebApp/Program.cs +++ b/StudentHouseDashboard/WebApp/Program.cs @@ -1,3 +1,5 @@ +using Data; +using Logic; using Microsoft.AspNetCore.Authentication.Cookies; namespace WebApp @@ -16,6 +18,10 @@ namespace WebApp options.AccessDeniedPath = new PathString("/Error/401"); }); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + builder.Services.AddScoped(); + var app = builder.Build(); // Configure the HTTP request pipeline. diff --git a/StudentHouseDashboard/WebApp/WebApp.csproj b/StudentHouseDashboard/WebApp/WebApp.csproj index ea9c409..ad917eb 100644 --- a/StudentHouseDashboard/WebApp/WebApp.csproj +++ b/StudentHouseDashboard/WebApp/WebApp.csproj @@ -22,6 +22,7 @@ + diff --git a/StudentHouseDashboard/WinForms/AnnouncementForm.cs b/StudentHouseDashboard/WinForms/AnnouncementForm.cs index 38efd03..979c87d 100644 --- a/StudentHouseDashboard/WinForms/AnnouncementForm.cs +++ b/StudentHouseDashboard/WinForms/AnnouncementForm.cs @@ -1,4 +1,5 @@ -using Logic; +using Data; +using Logic; using Models; using System; using System.Collections.Generic; @@ -56,7 +57,7 @@ namespace WinForms private void btnSave_Click(object sender, EventArgs e) { - AnnouncementManager announcementManager = new AnnouncementManager(); + AnnouncementManager announcementManager = new AnnouncementManager(new AnnouncementRepository()); if (string.IsNullOrEmpty(tbTitle.Text)) { MessageBox.Show("Please enter a title"); @@ -114,7 +115,7 @@ namespace WinForms if (MessageBox.Show($"Are you sure you want to delete\n{currentComment.Title}\nCreated at {currentComment.PublishDate.ToString("g")} by {currentComment.Author.Name}", "Delete announcement", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - CommentManager commentManager = new CommentManager(); + CommentManager commentManager = new CommentManager(new CommentRepository()); commentManager.DeleteCommentOnAnnouncement(currentComment.ID, announcement.ID); } RefreshComments(); diff --git a/StudentHouseDashboard/WinForms/CommentForm.cs b/StudentHouseDashboard/WinForms/CommentForm.cs index ea21cd0..f504c64 100644 --- a/StudentHouseDashboard/WinForms/CommentForm.cs +++ b/StudentHouseDashboard/WinForms/CommentForm.cs @@ -1,4 +1,5 @@ -using Logic; +using Data; +using Logic; using Models; using System; using System.Collections.Generic; @@ -43,13 +44,10 @@ namespace WinForms btnViewComment.Enabled = false; } - if (comment != null && currentUser != null) + if (comment != null && currentUser != null && currentUser.ID != comment.Author.ID) { - if (currentUser.ID != comment.Author.ID) - { - // restriction: only edit personal comments - readOnly = true; - } + // restriction: only edit personal comments + readOnly = true; } if (readOnly) @@ -71,7 +69,7 @@ namespace WinForms } private void btnSave_Click(object sender, EventArgs e) { - CommentManager commentManager = new CommentManager(); + CommentManager commentManager = new CommentManager(new CommentRepository()); if (string.IsNullOrEmpty(tbTitle.Text) || string.IsNullOrEmpty(tbDescription.Text)) { MessageBox.Show("Please enter a title and comment text"); @@ -135,7 +133,7 @@ namespace WinForms if (MessageBox.Show($"Are you sure you want to delete\n{currentResponse.Title}\nCreated at {currentResponse.PublishDate.ToString("g")} by {currentResponse.Author.Name}", "Delete announcement", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - CommentManager commentManager = new CommentManager(); + CommentManager commentManager = new CommentManager(new CommentRepository()); commentManager.DeleteResponseOnComment(currentResponse.ID, comment.ID); } RefreshComments(); diff --git a/StudentHouseDashboard/WinForms/Dashboard.cs b/StudentHouseDashboard/WinForms/Dashboard.cs index 7aecd7a..751e746 100644 --- a/StudentHouseDashboard/WinForms/Dashboard.cs +++ b/StudentHouseDashboard/WinForms/Dashboard.cs @@ -1,4 +1,5 @@ -using Logic; +using Data; +using Logic; using Models; using System; using System.Collections.Generic; @@ -70,7 +71,7 @@ namespace WinForms User currentUser = (User)lbUsers.SelectedItem; if (MessageBox.Show($"Are you sure you want to delete\n{currentUser.Name}\n{currentUser.Role}", "Delete user", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - UserManager userManager = new UserManager(); + UserManager userManager = new UserManager(new UserRepository()); userManager.DisableUser(currentUser.ID); } } @@ -107,13 +108,13 @@ namespace WinForms private void RefreshLists() { - UserManager userManager = new UserManager(); + UserManager userManager = new UserManager(new UserRepository()); lbUsers.Items.Clear(); foreach (User _user in userManager.GetAllUsers()) { lbUsers.Items.Add(_user); } - AnnouncementManager announcementManager = new AnnouncementManager(); + AnnouncementManager announcementManager = new AnnouncementManager(new AnnouncementRepository()); lbAnnouncements.Items.Clear(); foreach (Announcement announcement in announcementManager.GetAllAnnouncements()) { @@ -145,7 +146,7 @@ namespace WinForms if (MessageBox.Show($"Are you sure you want to delete\n{currentAnnouncement.Title}\nCreated at {currentAnnouncement.PublishDate.ToString("g")} by {currentAnnouncement.Author.Name}", "Delete announcement", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - AnnouncementManager announcementManager = new AnnouncementManager(); + AnnouncementManager announcementManager = new AnnouncementManager(new AnnouncementRepository()); announcementManager.DeleteAnnouncement(currentAnnouncement.ID); } RefreshLists(); diff --git a/StudentHouseDashboard/WinForms/Login.cs b/StudentHouseDashboard/WinForms/Login.cs index 77e552e..474978f 100644 --- a/StudentHouseDashboard/WinForms/Login.cs +++ b/StudentHouseDashboard/WinForms/Login.cs @@ -1,3 +1,4 @@ +using Data; using Logic; using Models; @@ -12,7 +13,7 @@ namespace WinForms private void btnLogin_Click(object sender, EventArgs e) { - UserManager userManager = new UserManager(); + UserManager userManager = new UserManager(new UserRepository()); User? user = userManager.AuthenticatedUser(tbUsername.Text, tbPassword.Text); if (user == null) { diff --git a/StudentHouseDashboard/WinForms/UserForm.cs b/StudentHouseDashboard/WinForms/UserForm.cs index 0478c4d..952d0df 100644 --- a/StudentHouseDashboard/WinForms/UserForm.cs +++ b/StudentHouseDashboard/WinForms/UserForm.cs @@ -1,4 +1,5 @@ -using Logic; +using Data; +using Logic; using Models; using System; using System.Collections.Generic; @@ -41,7 +42,7 @@ namespace WinForms private void btnSave_Click(object sender, EventArgs e) { - UserManager userManager = new UserManager(); + UserManager userManager = new UserManager(new UserRepository()); if (string.IsNullOrEmpty(tbUsername.Text) || string.IsNullOrEmpty(tbPassword.Text) || cbUserRole.SelectedIndex == -1) { MessageBox.Show("Please enter data in all fields"); diff --git a/StudentHouseDashboard/WinForms/WinForms.csproj b/StudentHouseDashboard/WinForms/WinForms.csproj index 51e0aa1..262e438 100644 --- a/StudentHouseDashboard/WinForms/WinForms.csproj +++ b/StudentHouseDashboard/WinForms/WinForms.csproj @@ -10,6 +10,7 @@ + diff --git a/docs/umlclass.vsdx b/docs/umlclass.vsdx index 016a9c3f55f77573813c1b1423284ab0bb470d4a..caad035de3fe4c9b206b97341959a16e94549205 100644 GIT binary patch delta 60820 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 delta 45804 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