From 0fa327ee7c447ae9ef5f728496d78ccfc93ec7ea Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Tue, 11 Feb 2020 18:45:37 +0100 Subject: [PATCH] project model & endpoints done --- Controllers/ProjectsController.cs | 42 ++++++++++++------- Data/AppDbContext.cs | 10 ++--- Models/Assignment.cs | 2 +- Models/History.cs | 2 - Models/Interfaces/ITask.cs | 5 ++- Models/Project.cs | 68 +++++++++++++++---------------- README.md | 1 + 7 files changed, 71 insertions(+), 59 deletions(-) diff --git a/Controllers/ProjectsController.cs b/Controllers/ProjectsController.cs index 0d4e0b8..f5ac843 100644 --- a/Controllers/ProjectsController.cs +++ b/Controllers/ProjectsController.cs @@ -112,10 +112,18 @@ namespace TicketManager.Controllers public async Task> SetProjectMembers(int id, List 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> RemoveMembersToProject(int id, List usersToRemove) + [HttpPut("{id}/removeMembers")] + public async Task> RemoveMembersFromProject(int id, List 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>> GetAllProjectsAsync() { return await makeProjectsQueryAsync() @@ -171,16 +185,14 @@ namespace TicketManager.Controllers .FirstOrDefaultAsync(p => p.Id == id); } - private IQueryable makeProjectsQueryAsync() + private IQueryable 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); } - } } diff --git a/Data/AppDbContext.cs b/Data/AppDbContext.cs index a74eb96..92e11be 100644 --- a/Data/AppDbContext.cs +++ b/Data/AppDbContext.cs @@ -16,10 +16,10 @@ namespace TicketManager.Data public DbSet Notes { get; set; } public DbSet Files { get; set; } - // protected override void OnModelCreating(ModelBuilder builder) - // { - // base.OnModelCreating(builder); - // builder.Entity().HasKey(t => new { t.ProjectId, t.UserId }); - // } + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + builder.Entity().HasKey(a => new { a.ProjectId, a.UserId }); + } } } \ No newline at end of file diff --git a/Models/Assignment.cs b/Models/Assignment.cs index 02aaa9c..42afe79 100644 --- a/Models/Assignment.cs +++ b/Models/Assignment.cs @@ -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; } diff --git a/Models/History.cs b/Models/History.cs index 2f1f3ad..53b4be7 100644 --- a/Models/History.cs +++ b/Models/History.cs @@ -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; } } diff --git a/Models/Interfaces/ITask.cs b/Models/Interfaces/ITask.cs index 9311efe..0773186 100644 --- a/Models/Interfaces/ITask.cs +++ b/Models/Interfaces/ITask.cs @@ -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 Edits { get; set; } } } diff --git a/Models/Project.cs b/Models/Project.cs index 9354748..ca9d38d 100644 --- a/Models/Project.cs +++ b/Models/Project.cs @@ -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 _assignments; + public List Assignments { get; set; } = new List(); - // { - // get - // { return _assignments ?? new List(); } - // set - // { _assignments = value; } - // } - private List _tickets; - public List Tickets - { - get - { return _tickets ?? new List(); } - set { _tickets = value; } - } - private List _edits; - public List Edits - { - get - { return _edits ?? new List(); } - set { _edits = value; } - } - private List _files; - public List Files - { - get - { return _files ?? new List(); } - set { _files = value; } - } + + + public List Tickets { get; set; } = new List(); + + + public List Edits { get; set; } = new List(); + + + public List Files { get; set; } = new List(); // Methods public List GetMembers() @@ -96,6 +73,7 @@ namespace TicketManager.Models UserId = user.Id }; this.Assignments.Add(newAssign); + AddLogEntry(" joined the project."); } } public void RemoveMembers(List 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); + } } } \ No newline at end of file diff --git a/README.md b/README.md index 0232ef5..26d4bde 100644 --- a/README.md +++ b/README.md @@ -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)