From e3d4ef87c2af74389be4fe329e3f8bfec52bc351 Mon Sep 17 00:00:00 2001 From: Stanislav Mykhailenko Date: Thu, 18 May 2023 19:42:14 +0300 Subject: [PATCH] Use separate DTOs, entities and models --- NG_2023_Kanban.BusinessLayer/Injecting.cs | 3 +- .../Interfaces/IUserService.cs | 6 ++-- .../MappingProfile.cs | 27 ++++++++++++++++ .../Models/BaseModel.cs | 7 ++++ .../Models/BoardModel.cs | 11 +++++++ .../Models/CardModel.cs | 15 +++++++++ .../Models/ColumnModel.cs | 12 +++++++ .../Models/CommentModel.cs | 12 +++++++ .../Models/UserModel.cs | 16 ++++++++++ .../NG_2023_Kanban.BusinessLayer.csproj | 5 +++ .../Service/UserService.cs | 20 +++++++----- NG_2023_Kanban/Controllers/HomeController.cs | 32 ++++++++++++------- NG_2023_Kanban/DTOs/BaseDto.cs | 7 ++++ NG_2023_Kanban/DTOs/BoardDto.cs | 11 +++++++ NG_2023_Kanban/DTOs/CardDto.cs | 15 +++++++++ NG_2023_Kanban/DTOs/ColumnDto.cs | 12 +++++++ NG_2023_Kanban/DTOs/CommentDto.cs | 12 +++++++ NG_2023_Kanban/DTOs/UserDto.cs | 16 ++++++++++ NG_2023_Kanban/MappingProfile.cs | 27 ++++++++++++++++ .../Models/ErrorViewModel.cs | 2 +- NG_2023_Kanban/NG_2023_Kanban.csproj | 1 + NG_2023_Kanban/Program.cs | 2 ++ NG_2023_Kanban/Views/Home/Index.cshtml | 4 +-- NG_2023_Kanban/Views/_ViewImports.cshtml | 2 +- 24 files changed, 249 insertions(+), 28 deletions(-) create mode 100644 NG_2023_Kanban.BusinessLayer/MappingProfile.cs create mode 100644 NG_2023_Kanban.BusinessLayer/Models/BaseModel.cs create mode 100644 NG_2023_Kanban.BusinessLayer/Models/BoardModel.cs create mode 100644 NG_2023_Kanban.BusinessLayer/Models/CardModel.cs create mode 100644 NG_2023_Kanban.BusinessLayer/Models/ColumnModel.cs create mode 100644 NG_2023_Kanban.BusinessLayer/Models/CommentModel.cs create mode 100644 NG_2023_Kanban.BusinessLayer/Models/UserModel.cs create mode 100644 NG_2023_Kanban/DTOs/BaseDto.cs create mode 100644 NG_2023_Kanban/DTOs/BoardDto.cs create mode 100644 NG_2023_Kanban/DTOs/CardDto.cs create mode 100644 NG_2023_Kanban/DTOs/ColumnDto.cs create mode 100644 NG_2023_Kanban/DTOs/CommentDto.cs create mode 100644 NG_2023_Kanban/DTOs/UserDto.cs create mode 100644 NG_2023_Kanban/MappingProfile.cs rename {NG_2023_Kanban.DataLayer => NG_2023_Kanban}/Models/ErrorViewModel.cs (77%) diff --git a/NG_2023_Kanban.BusinessLayer/Injecting.cs b/NG_2023_Kanban.BusinessLayer/Injecting.cs index daa2e30..3dc1ce5 100644 --- a/NG_2023_Kanban.BusinessLayer/Injecting.cs +++ b/NG_2023_Kanban.BusinessLayer/Injecting.cs @@ -1,4 +1,4 @@ -using NG_2023_Kanban.BusinessLayer.Services; +using NG_2023_Kanban.BusinessLayer.Services; using Microsoft.Extensions.DependencyInjection; namespace NG_2023_Kanban.BusinessLayer.Inject @@ -8,6 +8,7 @@ namespace NG_2023_Kanban.BusinessLayer.Inject public static void InjectBLL( this IServiceCollection services) { + services.AddAutoMapper(typeof(MappingProfile)); services.AddScoped(); } } diff --git a/NG_2023_Kanban.BusinessLayer/Interfaces/IUserService.cs b/NG_2023_Kanban.BusinessLayer/Interfaces/IUserService.cs index f40c43e..5597e6d 100644 --- a/NG_2023_Kanban.BusinessLayer/Interfaces/IUserService.cs +++ b/NG_2023_Kanban.BusinessLayer/Interfaces/IUserService.cs @@ -1,10 +1,10 @@ -using NG_2023_Kanban.DataLayer.Entities; +using NG_2023_Kanban.BusinessLayer.Models; namespace NG_2023_Kanban.BusinessLayer.Interfaces { public interface IUserService { - Task LoginAsync(User user); - Task RegisterAsync(User user); + Task LoginAsync(UserModel user); + Task RegisterAsync(UserModel user); } } diff --git a/NG_2023_Kanban.BusinessLayer/MappingProfile.cs b/NG_2023_Kanban.BusinessLayer/MappingProfile.cs new file mode 100644 index 0000000..39e3de8 --- /dev/null +++ b/NG_2023_Kanban.BusinessLayer/MappingProfile.cs @@ -0,0 +1,27 @@ +using AutoMapper; +using NG_2023_Kanban.BusinessLayer.Models; +using NG_2023_Kanban.DataLayer.Entities; + +namespace NG_2023_Kanban.BusinessLayer +{ + public class MappingProfile : Profile + { + public MappingProfile() + { + CreateMap() + .ReverseMap(); + + CreateMap() + .ReverseMap(); + + CreateMap() + .ReverseMap(); + + CreateMap() + .ReverseMap(); + + CreateMap() + .ReverseMap(); + } + } +} diff --git a/NG_2023_Kanban.BusinessLayer/Models/BaseModel.cs b/NG_2023_Kanban.BusinessLayer/Models/BaseModel.cs new file mode 100644 index 0000000..ea2aa6c --- /dev/null +++ b/NG_2023_Kanban.BusinessLayer/Models/BaseModel.cs @@ -0,0 +1,7 @@ +namespace NG_2023_Kanban.BusinessLayer.Models +{ + public abstract class BaseModel + { + public int Id { get; set; } + } +} diff --git a/NG_2023_Kanban.BusinessLayer/Models/BoardModel.cs b/NG_2023_Kanban.BusinessLayer/Models/BoardModel.cs new file mode 100644 index 0000000..6fbf216 --- /dev/null +++ b/NG_2023_Kanban.BusinessLayer/Models/BoardModel.cs @@ -0,0 +1,11 @@ +namespace NG_2023_Kanban.BusinessLayer.Models +{ + public class BoardModel : BaseModel + { + public string Name { get; set; } + + public virtual ICollection? Users { get; set; } = new HashSet(); + + public virtual ICollection? Columns { get; set; } = new HashSet(); + } +} diff --git a/NG_2023_Kanban.BusinessLayer/Models/CardModel.cs b/NG_2023_Kanban.BusinessLayer/Models/CardModel.cs new file mode 100644 index 0000000..98a13ff --- /dev/null +++ b/NG_2023_Kanban.BusinessLayer/Models/CardModel.cs @@ -0,0 +1,15 @@ +namespace NG_2023_Kanban.BusinessLayer.Models +{ + public class CardModel : BaseModel + { + public string Name { get; set; } + public string Description { get; set; } + public int SenderId { get; set; } + public int ColumnId { get; set; } + + public virtual UserModel Sender { get; set; } + public virtual ColumnModel Column { get; set; } + + public virtual ICollection Comments { get; set; } = new HashSet(); + } +} diff --git a/NG_2023_Kanban.BusinessLayer/Models/ColumnModel.cs b/NG_2023_Kanban.BusinessLayer/Models/ColumnModel.cs new file mode 100644 index 0000000..600bed5 --- /dev/null +++ b/NG_2023_Kanban.BusinessLayer/Models/ColumnModel.cs @@ -0,0 +1,12 @@ +namespace NG_2023_Kanban.BusinessLayer.Models +{ + public class ColumnModel : BaseModel + { + public string Name { get; set; } + public int BoardId { get; set; } + + public virtual BoardModel Board { get; set; } + + public virtual ICollection? Cards { get; set; } = new HashSet(); + } +} diff --git a/NG_2023_Kanban.BusinessLayer/Models/CommentModel.cs b/NG_2023_Kanban.BusinessLayer/Models/CommentModel.cs new file mode 100644 index 0000000..a1e19b2 --- /dev/null +++ b/NG_2023_Kanban.BusinessLayer/Models/CommentModel.cs @@ -0,0 +1,12 @@ +namespace NG_2023_Kanban.BusinessLayer.Models +{ + public class CommentModel : BaseModel + { + public string Text { get; set; } + public int SenderId { get; set; } + public int CardId { get; set; } + + public virtual UserModel? Sender { get; set; } + public virtual CardModel? Card { get; set; } + } +} diff --git a/NG_2023_Kanban.BusinessLayer/Models/UserModel.cs b/NG_2023_Kanban.BusinessLayer/Models/UserModel.cs new file mode 100644 index 0000000..b77555a --- /dev/null +++ b/NG_2023_Kanban.BusinessLayer/Models/UserModel.cs @@ -0,0 +1,16 @@ +namespace NG_2023_Kanban.BusinessLayer.Models +{ + public class UserModel : BaseModel + { + public string FullName { get; set; } + + public string Username { get; set; } + public string Password { get; set; } + + public bool IsAdmin { get; set; } = false; + + public virtual ICollection? Boards { get; set; } = new HashSet(); + public virtual ICollection? Cards { get; set; } = new HashSet(); + public virtual ICollection? Comments { get; set; } = new HashSet(); + } +} diff --git a/NG_2023_Kanban.BusinessLayer/NG_2023_Kanban.BusinessLayer.csproj b/NG_2023_Kanban.BusinessLayer/NG_2023_Kanban.BusinessLayer.csproj index 36caefd..f53719a 100644 --- a/NG_2023_Kanban.BusinessLayer/NG_2023_Kanban.BusinessLayer.csproj +++ b/NG_2023_Kanban.BusinessLayer/NG_2023_Kanban.BusinessLayer.csproj @@ -10,4 +10,9 @@ + + + + + diff --git a/NG_2023_Kanban.BusinessLayer/Service/UserService.cs b/NG_2023_Kanban.BusinessLayer/Service/UserService.cs index d544b8c..ffbb449 100644 --- a/NG_2023_Kanban.BusinessLayer/Service/UserService.cs +++ b/NG_2023_Kanban.BusinessLayer/Service/UserService.cs @@ -1,33 +1,37 @@ -using NG_2023_Kanban.BusinessLayer.Interfaces; +using AutoMapper; +using NG_2023_Kanban.BusinessLayer.Interfaces; +using NG_2023_Kanban.BusinessLayer.Models; using NG_2023_Kanban.DataLayer.Repositories; using NG_2023_Kanban.DataLayer.Entities; using NG_2023_Kanban.DataLayer.Interfaces; -using Microsoft.EntityFrameworkCore; namespace NG_2023_Kanban.BusinessLayer.Services { public class UserService : IUserService { private readonly IUserRepository _userRepository; + private readonly IMapper _mapper; - public UserService(IUserRepository userRepository) + public UserService(IUserRepository userRepository, IMapper mapper) { _userRepository = userRepository; + _mapper = mapper; } - public async Task LoginAsync(User user) + public async Task LoginAsync(UserModel user) { var data = await _userRepository.FindAsync(x => x.Username == user.Username && x.Password == user.Password); if (data.Any()) - return data.First(); + return _mapper.Map>(data).First(); else return null; } - public async Task RegisterAsync(User user) + public async Task RegisterAsync(UserModel user) { - await _userRepository.CreateAsync(user); - return user; + var entity = _mapper.Map(user); + await _userRepository.CreateAsync(entity); + return _mapper.Map(entity); } } } diff --git a/NG_2023_Kanban/Controllers/HomeController.cs b/NG_2023_Kanban/Controllers/HomeController.cs index ea38165..ccac681 100644 --- a/NG_2023_Kanban/Controllers/HomeController.cs +++ b/NG_2023_Kanban/Controllers/HomeController.cs @@ -1,8 +1,10 @@ using System.Diagnostics; using Microsoft.AspNetCore.Mvc; -using NG_2023_Kanban.DataLayer.Entities; +using AutoMapper; +using NG_2023_Kanban.Models; +using NG_2023_Kanban.DTOs; using NG_2023_Kanban.Extensions; -using NG_2023_Kanban.DataLayer.Models; +using NG_2023_Kanban.BusinessLayer.Models; using NG_2023_Kanban.BusinessLayer.Services; namespace NG_2023_Kanban.Controllers; @@ -11,16 +13,18 @@ public class HomeController : Controller { private readonly UserService _userService; private readonly ILogger _logger; + private readonly IMapper _mapper; - public HomeController(ILogger logger, UserService userService) + public HomeController(ILogger logger, UserService userService, IMapper mapper) { _logger = logger; _userService = userService; + _mapper = mapper; } public IActionResult Index() { - User? currentAccount = HttpContext.Session.GetObject("Account"); + var currentAccount = HttpContext.Session.GetObject("Account"); if (currentAccount != null) { ViewData["Account"] = currentAccount; @@ -31,7 +35,7 @@ public class HomeController : Controller public IActionResult Login() { - User? currentAccount = HttpContext.Session.GetObject("Account"); + var currentAccount = HttpContext.Session.GetObject("Account"); if (currentAccount != null) return Redirect("/Home/Index"); @@ -39,13 +43,16 @@ public class HomeController : Controller } [HttpPost] - public async Task Login(User user) + public async Task Login(UserDto user) { - User? currentAccount = HttpContext.Session.GetObject("Account"); + var currentAccount = HttpContext.Session.GetObject("Account"); if (currentAccount != null) return Redirect("/Home/Index"); - User? account = await _userService.LoginAsync(user); + var model = _mapper.Map(user); + + var account = _mapper.Map(await _userService.LoginAsync(model)); + if (account != null) { HttpContext.Session.SetObject("Account", account); @@ -66,7 +73,7 @@ public class HomeController : Controller public IActionResult Register() { - User? currentAccount = HttpContext.Session.GetObject("Account"); + var currentAccount = HttpContext.Session.GetObject("Account"); if (currentAccount != null) return Redirect("/Home/Index"); @@ -74,15 +81,16 @@ public class HomeController : Controller } [HttpPost] - public async Task Register(User user) + public async Task Register(UserDto user) { - User? currentAccount = HttpContext.Session.GetObject("Account"); + var currentAccount = HttpContext.Session.GetObject("Account"); if (currentAccount != null) return Redirect("/Home/Index"); try { - User account = await _userService.RegisterAsync(user); + var model = _mapper.Map(user); + var account = _mapper.Map(await _userService.RegisterAsync(model)); HttpContext.Session.SetObject("Account", account); return Redirect("/Home/Index"); diff --git a/NG_2023_Kanban/DTOs/BaseDto.cs b/NG_2023_Kanban/DTOs/BaseDto.cs new file mode 100644 index 0000000..35cd7f0 --- /dev/null +++ b/NG_2023_Kanban/DTOs/BaseDto.cs @@ -0,0 +1,7 @@ +namespace NG_2023_Kanban.DTOs +{ + public abstract class BaseDto + { + public int Id { get; set; } + } +} diff --git a/NG_2023_Kanban/DTOs/BoardDto.cs b/NG_2023_Kanban/DTOs/BoardDto.cs new file mode 100644 index 0000000..1f2ecdb --- /dev/null +++ b/NG_2023_Kanban/DTOs/BoardDto.cs @@ -0,0 +1,11 @@ +namespace NG_2023_Kanban.DTOs +{ + public class BoardDto : BaseDto + { + public string Name { get; set; } + + public virtual ICollection? Users { get; set; } = new HashSet(); + + public virtual ICollection? Columns { get; set; } = new HashSet(); + } +} diff --git a/NG_2023_Kanban/DTOs/CardDto.cs b/NG_2023_Kanban/DTOs/CardDto.cs new file mode 100644 index 0000000..5b6fdf4 --- /dev/null +++ b/NG_2023_Kanban/DTOs/CardDto.cs @@ -0,0 +1,15 @@ +namespace NG_2023_Kanban.DTOs +{ + public class CardDto : BaseDto + { + public string Name { get; set; } + public string Description { get; set; } + public int SenderId { get; set; } + public int ColumnId { get; set; } + + public virtual UserDto Sender { get; set; } + public virtual ColumnDto Column { get; set; } + + public virtual ICollection Comments { get; set; } = new HashSet(); + } +} diff --git a/NG_2023_Kanban/DTOs/ColumnDto.cs b/NG_2023_Kanban/DTOs/ColumnDto.cs new file mode 100644 index 0000000..3907f3f --- /dev/null +++ b/NG_2023_Kanban/DTOs/ColumnDto.cs @@ -0,0 +1,12 @@ +namespace NG_2023_Kanban.DTOs +{ + public class ColumnDto : BaseDto + { + public string Name { get; set; } + public int BoardId { get; set; } + + public virtual BoardDto Board { get; set; } + + public virtual ICollection? Cards { get; set; } = new HashSet(); + } +} diff --git a/NG_2023_Kanban/DTOs/CommentDto.cs b/NG_2023_Kanban/DTOs/CommentDto.cs new file mode 100644 index 0000000..0313367 --- /dev/null +++ b/NG_2023_Kanban/DTOs/CommentDto.cs @@ -0,0 +1,12 @@ +namespace NG_2023_Kanban.DTOs +{ + public class CommentDto : BaseDto + { + public string Text { get; set; } + public int SenderId { get; set; } + public int CardId { get; set; } + + public virtual UserDto? Sender { get; set; } + public virtual CardDto? Card { get; set; } + } +} diff --git a/NG_2023_Kanban/DTOs/UserDto.cs b/NG_2023_Kanban/DTOs/UserDto.cs new file mode 100644 index 0000000..d439f05 --- /dev/null +++ b/NG_2023_Kanban/DTOs/UserDto.cs @@ -0,0 +1,16 @@ +namespace NG_2023_Kanban.DTOs +{ + public class UserDto : BaseDto + { + public string FullName { get; set; } + + public string Username { get; set; } + public string Password { get; set; } + + public bool IsAdmin { get; set; } = false; + + public virtual ICollection? Boards { get; set; } = new HashSet(); + public virtual ICollection? Cards { get; set; } = new HashSet(); + public virtual ICollection? Comments { get; set; } = new HashSet(); + } +} diff --git a/NG_2023_Kanban/MappingProfile.cs b/NG_2023_Kanban/MappingProfile.cs new file mode 100644 index 0000000..a23ac3b --- /dev/null +++ b/NG_2023_Kanban/MappingProfile.cs @@ -0,0 +1,27 @@ +using AutoMapper; +using NG_2023_Kanban.DTOs; +using NG_2023_Kanban.BusinessLayer.Models; + +namespace NG_2023_Kanban +{ + public class MappingProfile : Profile + { + public MappingProfile() + { + CreateMap() + .ReverseMap(); + + CreateMap() + .ReverseMap(); + + CreateMap() + .ReverseMap(); + + CreateMap() + .ReverseMap(); + + CreateMap() + .ReverseMap(); + } + } +} diff --git a/NG_2023_Kanban.DataLayer/Models/ErrorViewModel.cs b/NG_2023_Kanban/Models/ErrorViewModel.cs similarity index 77% rename from NG_2023_Kanban.DataLayer/Models/ErrorViewModel.cs rename to NG_2023_Kanban/Models/ErrorViewModel.cs index ab5c981..eb8ed3a 100644 --- a/NG_2023_Kanban.DataLayer/Models/ErrorViewModel.cs +++ b/NG_2023_Kanban/Models/ErrorViewModel.cs @@ -1,4 +1,4 @@ -namespace NG_2023_Kanban.DataLayer.Models; +namespace NG_2023_Kanban.Models; public class ErrorViewModel { diff --git a/NG_2023_Kanban/NG_2023_Kanban.csproj b/NG_2023_Kanban/NG_2023_Kanban.csproj index 155cbfc..6a087ce 100644 --- a/NG_2023_Kanban/NG_2023_Kanban.csproj +++ b/NG_2023_Kanban/NG_2023_Kanban.csproj @@ -7,6 +7,7 @@ + diff --git a/NG_2023_Kanban/Program.cs b/NG_2023_Kanban/Program.cs index ae3683c..7203051 100644 --- a/NG_2023_Kanban/Program.cs +++ b/NG_2023_Kanban/Program.cs @@ -1,3 +1,4 @@ +using NG_2023_Kanban; using NG_2023_Kanban.BusinessLayer.Inject; using NG_2023_Kanban.DataLayer.DbStartup; @@ -7,6 +8,7 @@ IConfiguration configuration = builder.Configuration; builder.Services.InjectDAL(configuration); builder.Services.InjectBLL(); +builder.Services.AddAutoMapper(typeof(MappingProfile)); // Add services to the container. builder.Services.AddControllersWithViews(); diff --git a/NG_2023_Kanban/Views/Home/Index.cshtml b/NG_2023_Kanban/Views/Home/Index.cshtml index 76a8290..491c6d7 100644 --- a/NG_2023_Kanban/Views/Home/Index.cshtml +++ b/NG_2023_Kanban/Views/Home/Index.cshtml @@ -1,6 +1,6 @@ -@using NG_2023_Kanban.DataLayer.Entities +@using NG_2023_Kanban.DTOs @{ - var user = ViewData["Account"] as User; + var user = ViewData["Account"] as UserDto; } @{ diff --git a/NG_2023_Kanban/Views/_ViewImports.cshtml b/NG_2023_Kanban/Views/_ViewImports.cshtml index 0a03a7d..9439c11 100644 --- a/NG_2023_Kanban/Views/_ViewImports.cshtml +++ b/NG_2023_Kanban/Views/_ViewImports.cshtml @@ -1,3 +1,3 @@ @using NG_2023_Kanban -@using NG_2023_Kanban.DataLayer.Models +@using NG_2023_Kanban.Models @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers