Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
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<ProjectEntity, ProjectModel>
{
private readonly IMapper<UserEntity, UserModel> _userMapper;

public ProjectMapper(IMapper<UserEntity, UserModel> userMapper)
{
_userMapper = userMapper;
}

public ProjectEntity Map(ProjectModel source)
{
return new ProjectEntity
{
Id = source.Id,
Title = source.Title,
Color = source.Color,
UserProjects = source.Members?.Select(member => new UserProjectsEntity
{
UserId = member.Id,
ProjectId = source.Id,
}).ToList(),
};
}

Expand All @@ -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()
};
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,18 @@ UserManager<UserEntity> userManager
_userManager = userManager;
}

public async Task<List<ProjectModel>> GetProjects(ClaimsPrincipal user)
public async Task<List<ProjectModel>> 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<List<ProjectModel>> GetUserProjects(ClaimsPrincipal user)
{
var userId = int.Parse(_userManager.GetUserId(user));

Expand All @@ -45,23 +56,19 @@ public async Task<List<ProjectModel>> GetProjects(ClaimsPrincipal user)
return projectsList;
}

public async Task<ProjectModel> CreateProject(ProjectModel projectModel, ClaimsPrincipal user)
public async Task<ProjectModel> 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)
{
Expand All @@ -71,17 +78,29 @@ await _context.UserProjects.AddAsync(new UserProjectsEntity

public async Task<ProjectModel> 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;
Expand All @@ -99,7 +118,6 @@ public async Task<bool> RemoveProject(int projectId)
}

_context.Projects.Remove(projectEntityToRemove);
_context.UserProjects.RemoveRange(projectEntityToRemove.UserProjects);
await _context.SaveChangesAsync();

return true;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Timetracker.BLL.Exceptions;
Expand All @@ -24,6 +26,15 @@ IMapper<UserEntity, UserModel> userMapper
_userMapper = userMapper;
}

public async Task<List<UserModel>> GetAllUsers()
{
var users = await _context.Users
.Select(user => _userMapper.Map(user))
.ToListAsync();

return users;
}

public async Task<UserModel> GetUser(int id)
{
UserEntity userEntity = await _context.Users.FirstOrDefaultAsync(u => u.Id == id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ namespace Timetracker.BLL.Services.Interfaces
{
public interface IProjectService
{
Task<ProjectModel> CreateProject(ProjectModel project, ClaimsPrincipal user);
Task<ProjectModel> CreateProject(ProjectModel project);

Task<List<ProjectModel>> GetProjects(ClaimsPrincipal user);
Task<List<ProjectModel>> GetProjects();

Task<List<ProjectModel>> GetUserProjects(ClaimsPrincipal user);

Task<ProjectModel> UpdateProject(ProjectModel project);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Threading.Tasks;
using Timetracker.Models.Data;

namespace Timetracker.BLL.Services.Interfaces
{
public interface IUserService
{
Task<UserModel> GetUser(int id);

Task<List<UserModel>> GetAllUsers();
}
}
4 changes: 4 additions & 0 deletions Timetracker/Web/Timetracker.Models/Data/ProjectModel.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using System.Collections.Generic;

namespace Timetracker.Models.Data
{
public class ProjectModel
Expand All @@ -7,5 +9,7 @@ public class ProjectModel
public string Title { get; set; }

public string Color { get; set; }

public List<UserModel> Members { get; set; }
}
}
14 changes: 11 additions & 3 deletions Timetracker/Web/Timetracker.Web/Controllers/ProjectController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,26 @@ IRoleService roleService
_roleService = roleService;
}

[HttpGet("getList")]
[HttpGet("getProjects")]
public async Task<IActionResult> GetProjects()
{
var result = await _projectService.GetProjects(User);
var result = await _projectService.GetProjects();

return Ok(result);
}

[HttpGet("getUserProjects")]
public async Task<IActionResult> GetUserProjects()
{
var result = await _projectService.GetUserProjects(User);

return Ok(result);
}

[HttpPost("create")]
public async Task<IActionResult> CreateProject([FromBody] ProjectModel projectModel)
{
var result = await _projectService.CreateProject(projectModel, User);
var result = await _projectService.CreateProject(projectModel);

return Ok(result);
}
Expand Down
11 changes: 11 additions & 0 deletions Timetracker/Web/Timetracker.Web/Controllers/UsersController.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
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;
using Timetracker.Models.Data;

namespace Timetracker.Web.Controllers
{
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
Expand All @@ -20,6 +23,14 @@ IUserService userServivce
_userService = userServivce;
}

[HttpGet("getAll")]
public async Task<IActionResult> GetAllUsers()
{
var res = await _userService.GetAllUsers();

return Ok(res);
}

[HttpGet("get/{id}")]
public async Task<ActionResult> GetUser(int id)
{
Expand Down