project model & endpoints done

This commit is contained in:
Ruidy Nemausat 2020-02-11 18:45:37 +01:00
parent 0ca71cfcf9
commit 0fa327ee7c
7 changed files with 71 additions and 59 deletions

View file

@ -112,10 +112,18 @@ namespace TicketManager.Controllers
public async Task<ActionResult<Project>> SetProjectMembers(int id, List<User> projectMembers)
{
Project project = await GetProjectByIdAsync(id);
project.SetMembers(projectMembers);
await _context.SaveChangesAsync();
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateException /* ex */)
{
//Log the error (uncomment ex variable name and write a log.)
ModelState.AddModelError("", "Unable to save changes. " +
"Try again, and if the problem persists, " +
"see your system administrator.");
}
return project;
}
@ -127,7 +135,6 @@ namespace TicketManager.Controllers
return BadRequest();
}
Project project = await GetProjectByIdAsync(id);
project.AddMembers(usersToAdd);
try
{
@ -140,19 +147,25 @@ namespace TicketManager.Controllers
"Try again, and if the problem persists, " +
"see your system administrator.");
}
return project;
}
[HttpPost("{id}/removeMembers")]
public async Task<ActionResult<Project>> RemoveMembersToProject(int id, List<User> usersToRemove)
[HttpPut("{id}/removeMembers")]
public async Task<ActionResult<Project>> RemoveMembersFromProject(int id, List<User> usersToRemove)
{
Project project = await GetProjectByIdAsync(id);
project.RemoveMembers(usersToRemove);
await _context.SaveChangesAsync();
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateException /* ex */)
{
//Log the error (uncomment ex variable name and write a log.)
ModelState.AddModelError("", "Unable to save changes. " +
"Try again, and if the problem persists, " +
"see your system administrator.");
}
return project;
}
@ -160,6 +173,7 @@ namespace TicketManager.Controllers
{
return _context.Projects.Any(e => e.Id == id);
}
private async Task<ActionResult<IEnumerable<Project>>> GetAllProjectsAsync()
{
return await makeProjectsQueryAsync()
@ -171,16 +185,14 @@ namespace TicketManager.Controllers
.FirstOrDefaultAsync(p => p.Id == id);
}
private IQueryable<TicketManager.Models.Project> makeProjectsQueryAsync()
private IQueryable<Project> makeProjectsQueryAsync()
{
return _context.Projects
.Include(p => p.Assignments)
.ThenInclude(a => a.User)
.Include(p => p.Tickets)
.Include(p => p.Manager)
.Include(p => p.Files)
.AsNoTracking();
.Include(p => p.Files);
}
}
}

View file

@ -16,10 +16,10 @@ namespace TicketManager.Data
public DbSet<Note> Notes { get; set; }
public DbSet<File> Files { get; set; }
// protected override void OnModelCreating(ModelBuilder builder)
// {
// base.OnModelCreating(builder);
// builder.Entity<Team>().HasKey(t => new { t.ProjectId, t.UserId });
// }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Assignment>().HasKey(a => new { a.ProjectId, a.UserId });
}
}
}

View file

@ -4,7 +4,7 @@ namespace TicketManager.Models
{
public class Assignment
{
public int Id { get; set; }
// public int Id { get; set; }
public User User { get; set; }
public Guid UserId { get; set; }
public Project Project { get; set; }

View file

@ -6,11 +6,9 @@ namespace TicketManager.Models
public class History
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public DateTime UpdateDate { get; set; } = DateTime.Now;
public ActivityType ActivityType { get; set; } = ActivityType.Undefined;
public User User { get; set; }
public int UserId { get; set; }
}

View file

@ -1,13 +1,16 @@
using System;
using System.Collections.Generic;
namespace TicketManager.Models
{
public interface ITask
// public interface ITask
public abstract class ITask
{
int Id { get; set; }
string Title { get; set; }
string Description { get; set; }
DateTime CreatedAt { get; }
DateTime PlannedEnding { get; set; }
List<History> Edits { get; set; }
}
}

View file

@ -7,10 +7,6 @@ namespace TicketManager.Models
{
public class Project : ITask
{
public Project()
{
}
public int Id { get; set; }
[Required]
@ -48,36 +44,17 @@ namespace TicketManager.Models
[Display(Name = "Project Manager")]
public User Manager { get; set; }
public Guid ManagerId { get; set; }
private List<Assignment> _assignments;
public List<Assignment> Assignments { get; set; } = new List<Assignment>();
// {
// get
// { return _assignments ?? new List<Assignment>(); }
// set
// { _assignments = value; }
// }
private List<Ticket> _tickets;
public List<Ticket> Tickets
{
get
{ return _tickets ?? new List<Ticket>(); }
set { _tickets = value; }
}
private List<History> _edits;
public List<History> Edits
{
get
{ return _edits ?? new List<History>(); }
set { _edits = value; }
}
private List<File> _files;
public List<File> Files
{
get
{ return _files ?? new List<File>(); }
set { _files = value; }
}
public List<Ticket> Tickets { get; set; } = new List<Ticket>();
public List<History> Edits { get; set; } = new List<History>();
public List<File> Files { get; set; } = new List<File>();
// Methods
public List<User> GetMembers()
@ -96,6 +73,7 @@ namespace TicketManager.Models
UserId = user.Id
};
this.Assignments.Add(newAssign);
AddLogEntry(" joined the project.");
}
}
public void RemoveMembers(List<User> membersToRemove)
@ -113,10 +91,18 @@ namespace TicketManager.Models
cp => !projectMembers.Contains(cp)
);
this.RemoveMembers(membersToRemove);
var membersToAdd = projectMembers.FindAll(
pm => !currentProjectMembers.Contains(pm)
);
this.AddMembers(membersToAdd);
}
else
{
this.AddMembers(projectMembers);
}
this.AddMembers(projectMembers);
// remove precedent members first
}
public int GetMembersCount() => this.GetMembers().Count();
public void GetTicketsCount() => this.Tickets.Count();
@ -126,5 +112,17 @@ namespace TicketManager.Models
{
this.Status = Status.Done;
}
private void AddLogEntry(string description)//, User user)
{
History Edit = new History()
{
Description = description,
ActivityType = ActivityType.Undefined,
// User = user,
UpdateDate = DateTime.Now
};
this.Edits.Add(Edit);
}
}
}

View file

@ -37,3 +37,4 @@
- Write backend tests
- Ensure Tickets Edits belong to Project Edits
- Ensure Tickets Files belong to Project Files
- Write a query class to refactor code and optimize perf on get queries (AsNoTracking)