From b1a7d146fd5875f3224aeb225334e15a1ca84044 Mon Sep 17 00:00:00 2001 From: Yehor Nestin Date: Mon, 30 Mar 2020 10:42:47 +0300 Subject: [PATCH] Project page fixes and improvements --- .../Mappers/Implementations/ProjectMapper.cs | 14 ++++++ .../Implementations/ProjectService.cs | 50 +++++++++++++------ .../Services/Implementations/UserService.cs | 11 ++++ .../Services/Interfaces/IProjectService.cs | 6 ++- .../Services/Interfaces/IUserService.cs | 5 +- .../Timetracker.Models/Data/ProjectModel.cs | 4 ++ .../Controllers/ProjectController.cs | 14 ++++-- .../Controllers/UsersController.cs | 11 ++++ 8 files changed, 93 insertions(+), 22 deletions(-) diff --git a/Timetracker/Web/Timetracker.BLL/Mappers/Implementations/ProjectMapper.cs b/Timetracker/Web/Timetracker.BLL/Mappers/Implementations/ProjectMapper.cs index be0588c..111aea4 100644 --- a/Timetracker/Web/Timetracker.BLL/Mappers/Implementations/ProjectMapper.cs +++ b/Timetracker/Web/Timetracker.BLL/Mappers/Implementations/ProjectMapper.cs @@ -1,11 +1,19 @@ using Timetracker.Entities.Data; using Timetracker.Models.Data; using Timetracker.BLL.Mappers.Interfaces; +using System.Linq; namespace Timetracker.BLL.Mappers.Implementations { public class ProjectMapper : IMapper { + private readonly IMapper _userMapper; + + public ProjectMapper(IMapper userMapper) + { + _userMapper = userMapper; + } + public ProjectEntity Map(ProjectModel source) { return new ProjectEntity @@ -13,6 +21,11 @@ public ProjectEntity Map(ProjectModel source) Id = source.Id, Title = source.Title, Color = source.Color, + UserProjects = source.Members?.Select(member => new UserProjectsEntity + { + UserId = member.Id, + ProjectId = source.Id, + }).ToList(), }; } @@ -23,6 +36,7 @@ public ProjectModel Map(ProjectEntity source) Id = source.Id, Title = source.Title, Color = source.Color, + Members = source.UserProjects?.Select(up => up.User != null ? _userMapper.Map(up.User) : null).ToList() }; } } diff --git a/Timetracker/Web/Timetracker.BLL/Services/Implementations/ProjectService.cs b/Timetracker/Web/Timetracker.BLL/Services/Implementations/ProjectService.cs index fa1bc2e..ecf2f9f 100644 --- a/Timetracker/Web/Timetracker.BLL/Services/Implementations/ProjectService.cs +++ b/Timetracker/Web/Timetracker.BLL/Services/Implementations/ProjectService.cs @@ -32,7 +32,18 @@ UserManager userManager _userManager = userManager; } - public async Task> GetProjects(ClaimsPrincipal user) + public async Task> GetProjects() + { + var projectsList = await _context.Projects + .Include(p => p.UserProjects) + .ThenInclude(up => up.User) + .Select(p => _projectMapper.Map(p)) + .ToListAsync(); + + return projectsList; + } + + public async Task> GetUserProjects(ClaimsPrincipal user) { var userId = int.Parse(_userManager.GetUserId(user)); @@ -45,23 +56,19 @@ public async Task> GetProjects(ClaimsPrincipal user) return projectsList; } - public async Task CreateProject(ProjectModel projectModel, ClaimsPrincipal user) + public async Task CreateProject(ProjectModel projectModel) { - var userId = int.Parse(_userManager.GetUserId(user)); - try { var projectEntity = _projectMapper.Map(projectModel); await _context.Projects.AddAsync(projectEntity); - await _context.UserProjects.AddAsync(new UserProjectsEntity - { - UserId = userId, - ProjectId = projectEntity.Id, - }); await _context.SaveChangesAsync(); - return _projectMapper.Map(projectEntity); + var result = _projectMapper.Map(projectEntity); + result.Members = projectModel.Members; + + return result; } catch (Exception exception) { @@ -71,17 +78,29 @@ await _context.UserProjects.AddAsync(new UserProjectsEntity public async Task UpdateProject(ProjectModel project) { - var projectEntity = await _context.Projects.FirstOrDefaultAsync(a => a.Id == project.Id); + var existingProjectEntity = _context.Projects + .Include(p => p.UserProjects) + .FirstOrDefault(p => p.Id == project.Id); + + var existingUserProjects = existingProjectEntity?.UserProjects; - if (projectEntity == null) + if (existingProjectEntity == null) { throw new NoSuchEntityException("The entity does not exist"); } - projectEntity.Title = project.Title; - projectEntity.Color = project.Color; + var incomingProjectEntity = _projectMapper.Map(project); + var incomingUserProjects = incomingProjectEntity.UserProjects; + + var userProjectsToRemove = existingUserProjects.Where(eup => incomingUserProjects.All(iup => iup.UserId != eup.UserId)); + _context.UserProjects.RemoveRange(userProjectsToRemove); + var userProjectsToAdd = incomingUserProjects.Where(iup => existingUserProjects.All(eup => eup.UserId != iup.UserId)); + _context.UserProjects.AddRange(userProjectsToAdd); + + existingProjectEntity.Title = incomingProjectEntity.Title; + existingProjectEntity.Color = incomingProjectEntity.Color; - _context.Projects.Update(projectEntity); + _context.Projects.Update(existingProjectEntity); await _context.SaveChangesAsync(); return project; @@ -99,7 +118,6 @@ public async Task RemoveProject(int projectId) } _context.Projects.Remove(projectEntityToRemove); - _context.UserProjects.RemoveRange(projectEntityToRemove.UserProjects); await _context.SaveChangesAsync(); return true; diff --git a/Timetracker/Web/Timetracker.BLL/Services/Implementations/UserService.cs b/Timetracker/Web/Timetracker.BLL/Services/Implementations/UserService.cs index 38269c7..2bb1740 100644 --- a/Timetracker/Web/Timetracker.BLL/Services/Implementations/UserService.cs +++ b/Timetracker/Web/Timetracker.BLL/Services/Implementations/UserService.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Timetracker.BLL.Exceptions; @@ -24,6 +26,15 @@ IMapper userMapper _userMapper = userMapper; } + public async Task> GetAllUsers() + { + var users = await _context.Users + .Select(user => _userMapper.Map(user)) + .ToListAsync(); + + return users; + } + public async Task GetUser(int id) { UserEntity userEntity = await _context.Users.FirstOrDefaultAsync(u => u.Id == id); diff --git a/Timetracker/Web/Timetracker.BLL/Services/Interfaces/IProjectService.cs b/Timetracker/Web/Timetracker.BLL/Services/Interfaces/IProjectService.cs index 44e790b..e17ee3c 100644 --- a/Timetracker/Web/Timetracker.BLL/Services/Interfaces/IProjectService.cs +++ b/Timetracker/Web/Timetracker.BLL/Services/Interfaces/IProjectService.cs @@ -7,9 +7,11 @@ namespace Timetracker.BLL.Services.Interfaces { public interface IProjectService { - Task CreateProject(ProjectModel project, ClaimsPrincipal user); + Task CreateProject(ProjectModel project); - Task> GetProjects(ClaimsPrincipal user); + Task> GetProjects(); + + Task> GetUserProjects(ClaimsPrincipal user); Task UpdateProject(ProjectModel project); diff --git a/Timetracker/Web/Timetracker.BLL/Services/Interfaces/IUserService.cs b/Timetracker/Web/Timetracker.BLL/Services/Interfaces/IUserService.cs index 2c76302..f3f3fc5 100644 --- a/Timetracker/Web/Timetracker.BLL/Services/Interfaces/IUserService.cs +++ b/Timetracker/Web/Timetracker.BLL/Services/Interfaces/IUserService.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Collections.Generic; +using System.Threading.Tasks; using Timetracker.Models.Data; namespace Timetracker.BLL.Services.Interfaces @@ -6,5 +7,7 @@ namespace Timetracker.BLL.Services.Interfaces public interface IUserService { Task GetUser(int id); + + Task> GetAllUsers(); } } diff --git a/Timetracker/Web/Timetracker.Models/Data/ProjectModel.cs b/Timetracker/Web/Timetracker.Models/Data/ProjectModel.cs index 4420dd8..321b7d1 100644 --- a/Timetracker/Web/Timetracker.Models/Data/ProjectModel.cs +++ b/Timetracker/Web/Timetracker.Models/Data/ProjectModel.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace Timetracker.Models.Data { public class ProjectModel @@ -7,5 +9,7 @@ public class ProjectModel public string Title { get; set; } public string Color { get; set; } + + public List Members { get; set; } } } \ No newline at end of file diff --git a/Timetracker/Web/Timetracker.Web/Controllers/ProjectController.cs b/Timetracker/Web/Timetracker.Web/Controllers/ProjectController.cs index 7ad854d..623fb60 100644 --- a/Timetracker/Web/Timetracker.Web/Controllers/ProjectController.cs +++ b/Timetracker/Web/Timetracker.Web/Controllers/ProjectController.cs @@ -24,10 +24,18 @@ IRoleService roleService _roleService = roleService; } - [HttpGet("getList")] + [HttpGet("getProjects")] public async Task GetProjects() { - var result = await _projectService.GetProjects(User); + var result = await _projectService.GetProjects(); + + return Ok(result); + } + + [HttpGet("getUserProjects")] + public async Task GetUserProjects() + { + var result = await _projectService.GetUserProjects(User); return Ok(result); } @@ -35,7 +43,7 @@ public async Task GetProjects() [HttpPost("create")] public async Task CreateProject([FromBody] ProjectModel projectModel) { - var result = await _projectService.CreateProject(projectModel, User); + var result = await _projectService.CreateProject(projectModel); return Ok(result); } diff --git a/Timetracker/Web/Timetracker.Web/Controllers/UsersController.cs b/Timetracker/Web/Timetracker.Web/Controllers/UsersController.cs index 90b3dc1..495b0af 100644 --- a/Timetracker/Web/Timetracker.Web/Controllers/UsersController.cs +++ b/Timetracker/Web/Timetracker.Web/Controllers/UsersController.cs @@ -1,4 +1,6 @@ using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Timetracker.BLL.Exceptions; using Timetracker.BLL.Services.Interfaces; @@ -6,6 +8,7 @@ namespace Timetracker.Web.Controllers { + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] [Route("api/[controller]")] [ApiController] public class UsersController : ControllerBase @@ -20,6 +23,14 @@ IUserService userServivce _userService = userServivce; } + [HttpGet("getAll")] + public async Task GetAllUsers() + { + var res = await _userService.GetAllUsers(); + + return Ok(res); + } + [HttpGet("get/{id}")] public async Task GetUser(int id) {