added NewModelDTOs edit controllers

This commit is contained in:
Ruidy Nemausat 2020-02-27 13:43:17 +01:00
parent 6ac62d7176
commit 481832fdbc
12 changed files with 146 additions and 58 deletions

View file

@ -148,13 +148,23 @@ namespace TicketManager.Controllers
[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<AppUserDTO>> PostUser(AppUser user)
public async Task<ActionResult<AppUserDTO>> PostUser([FromBody] NewAppUserDTO userDto)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
var user = new AppUser()
{
FirstName = userDto.FirstName,
LastName = userDto.LastName,
Presentation = userDto.Presentation,
Email = userDto.Email,
Phone = userDto.Phone,
Picture = userDto.Picture,
};
_context.AppUsers.Add(user);
await _context.SaveChangesAsync();
@ -190,7 +200,7 @@ namespace TicketManager.Controllers
}
[HttpGet("{id}/projects")]
public async Task<ActionResult<IEnumerable<ProjectDTO>>> GetAppUserProjects(Guid id)
public async Task<ActionResult<IEnumerable<ProjectDTORequest>>> GetAppUserProjects(Guid id)
{
var user = await _context.AppUsers
.Include(u => u.Assignments)
@ -201,11 +211,11 @@ namespace TicketManager.Controllers
{
return BadRequest();
}
return user.GetProjects().Select(p => new ProjectDTO(p)).ToList();
return user.GetProjects().Select(p => new ProjectDTORequest(p)).ToList();
}
[HttpGet("{id}/tickets/")]
public async Task<ActionResult<IEnumerable<TicketDTO>>> GetAppUserTickets(Guid id)
public async Task<ActionResult<IEnumerable<TicketDTORead>>> GetAppUserTickets(Guid id)
{
var user = await _context.AppUsers
.Include(u => u.Assignments)
@ -217,7 +227,7 @@ namespace TicketManager.Controllers
{
return BadRequest();
}
return user.GetTickets().Select(t => new TicketDTO(t)).ToList();
return user.GetTickets().Select(t => new TicketDTORead(t)).ToList();
}
private bool UserExists(Guid id)

View file

@ -9,6 +9,7 @@ using TicketManager.Data;
using TicketManager.Models;
using TicketManager.DTO;
namespace TicketManager.Controllers
{
// [Authorize(Roles = "Admin")]
@ -107,12 +108,22 @@ namespace TicketManager.Controllers
[HttpPut("{id}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> PutProject(int id, Project project)
public async Task<IActionResult> PutProject([FromRoute] int id, [FromBody] Project project)
{
if (id != project.Id)
{
return BadRequest();
}
// var project = await _context.Projects.FindAsync(projectDto.Id);
// project.Title = projectDto.Title;
// project.Description = projectDto.Description;
// project.EndingDate = projectDto.EndingDate;
// project.Manager = await _context.AppUsers.FindAsync(projectDto.Manager.Id);
_context.Entry(project).State = EntityState.Modified;
try
{
@ -212,7 +223,7 @@ namespace TicketManager.Controllers
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[HttpGet("{id}/members")]
public async Task<ActionResult<List<AppUser>>> GetProjectMembers(int id)
public async Task<ActionResult<List<AppUserDTORead>>> GetProjectMembers(int id)
{
Project project = await _context.Projects
.Include(p => p.Assignments)
@ -228,7 +239,7 @@ namespace TicketManager.Controllers
{
return NotFound();
}
return project.GetMembers();
return project.GetMembers().Select(m => new AppUserDTORead(m)).ToList();
}
/// <summary>
@ -255,7 +266,7 @@ namespace TicketManager.Controllers
public async Task<ActionResult<Project>> SetProjectMembers(int id, List<AppUser> projectMembers)
{
Project project = await _context.Projects
// .Include(p => p.Assignments)
.Include(p => p.Assignments)
.FirstOrDefaultAsync(p => p.Id == id);
if (project == null)

View file

@ -46,14 +46,13 @@ namespace TicketManager.Controllers
.Include(t => t.Activities)
.Include(t => t.Notes)
.AsNoTracking()
.Select(t => new TicketDTO(t))
.FirstOrDefaultAsync(t => t.Id == id);
if (ticket == null)
{
return NotFound();
}
return ticket;
return new TicketDTO(ticket);
}
// PUT: api/Tickets/5
@ -89,8 +88,22 @@ namespace TicketManager.Controllers
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see https://aka.ms/RazorPagesCRUD.
[HttpPost]
public async Task<ActionResult<Ticket>> PostTicket(Ticket ticket)
public async Task<ActionResult<Ticket>> PostTicket([FromBody] NewTicketDTO ticketDto)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
var ticket = new Ticket()
{
Title = ticketDto.Title,
Description = ticketDto.Description,
EndingDate = ticketDto.EndingDate,
CreatorId = ticketDto.CreatorId,
Project = await _context.Projects.FindAsync(ticketDto.ProjectId)
};
_context.Tickets.Add(ticket);
await _context.SaveChangesAsync();

View file

@ -19,7 +19,7 @@ namespace TicketManager.DTO
CreationDate = user.CreationDate;
Picture = user.Picture;
Activities = user.Activities;
Projects = user.GetProjects().Select(u => new ProjectDTORead(u)).ToList();
Projects = user.GetProjects().Select(u => new ProjectDTORequest(u)).ToList();
Tickets = user.GetTickets().Select(u => new TicketDTORead(u)).ToList();
}
@ -46,7 +46,7 @@ namespace TicketManager.DTO
public List<Activity> Activities { get; set; } = new List<Activity>();
public List<ProjectDTORead> Projects { get; set; } = new List<ProjectDTORead>();
public List<ProjectDTORequest> Projects { get; set; } = new List<ProjectDTORequest>();
public List<TicketDTORead> Tickets { get; set; } = new List<TicketDTORead>();
}

View file

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using TicketManager.Models;
namespace TicketManager.DTO
{
public class NewAppUserDTO
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Presentation { get; set; }
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[DataType(DataType.PhoneNumber)]
public string Phone { get; set; }
public string Picture { get; set; }
}
}

View file

@ -16,7 +16,7 @@ namespace TicketManager.DTO
EndingDate = project.EndingDate;
Progression = project.Progression;
Status = project.Status.ToString();
// Manager = project.Manager != null ? new AppUserDTORead(project.Manager) : null;
Manager = project.Manager != null ? new AppUserDTORead(project.Manager) : null;
Users = project.GetMembers().Select(u => new AppUserDTORead(u)).ToList();
Tickets = project.Tickets.Select(t => new TicketDTORead(t)).ToList();
Activities = project.Activities;

View file

@ -5,9 +5,9 @@ using TicketManager.Models;
namespace TicketManager.DTO
{
public class ProjectDTORead
public class ProjectDTORequest
{
public ProjectDTORead(Project project)
public ProjectDTORequest(Project project)
{
Id = project.Id;
Title = project.Title;
@ -16,7 +16,7 @@ namespace TicketManager.DTO
EndingDate = project.EndingDate;
Progression = project.Progression;
Status = project.Status.ToString();
// Manager = project.Manager != null ? new AppUserDTORead(project.Manager) : null;
Manager = project.Manager != null ? new AppUserDTORead(project.Manager) : null;
}
public int Id { get; set; }

View file

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using TicketManager.Models;
namespace TicketManager.DTO
{
public class NewTicketDTO
{
public string Title { get; set; }
public string Description { get; set; }
[DataType(DataType.Date)]
public DateTime EndingDate { get; set; }
public string Impact { get; set; }
public string Difficulty { get; set; }
public string Category { get; set; }
public Guid CreatorId { get; set; }
public int ProjectId { get; set; }
}
}

View file

@ -20,11 +20,11 @@ namespace TicketManager.DTO
Difficulty = ticket.Difficulty.ToString();
Category = ticket.Category.ToString();
CreatorId = ticket.CreatorId;
// Project = new ProjectDTORead(ticket.Project);
Project = new ProjectDTORequest(ticket.Project);
Notes = ticket.Notes;
Activities = ticket.Activities;
Files = ticket.Files;
// Users = ticket.GetAssignees().Select(u => new AppUserDTORead(u)).ToList();
Users = ticket.GetAssignees().Select(u => new AppUserDTORead(u)).ToList();
}
public int Id { get; set; }
@ -49,7 +49,7 @@ namespace TicketManager.DTO
public Guid CreatorId { get; set; }
public ProjectDTORead Project { get; set; }
public ProjectDTORequest Project { get; set; }
public List<Note> Notes { get; set; } = new List<Note>();

View file

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel.DataAnnotations;
using TicketManager.DTO;
namespace TicketManager.Models
{

View file

@ -49,3 +49,4 @@
- [ ] ticket/files/activities list placeholders when empty
- [ ] think about public/private DTO's constructor, getters and setters
- [x] write dtos without circular dependencies
- [ ] use dtoRequest for PutProjects

View file

@ -122,53 +122,53 @@ namespace TicketManager.Tests
{
var controller = new ProjectsController(context);
var result = await controller.PutProject(1,
new Project()
{
Id = 1,
Title = "Top Secret Project",
Description = "Shht Don't Ask don't tell",
EndingDate = new DateTime(2020, 7, 21)
}
);
// var result = await controller.PutProject(1,
// new Project()
// {
// Id = 1,
// Title = "Top Secret Project",
// Description = "Shht Don't Ask don't tell",
// EndingDate = new DateTime(2020, 7, 21)
// }
// );
// Should Update
Assert.Equal("Top Secret Project", context.Projects.Find(1).Title);
Assert.Equal(new DateTime(2020, 7, 21), context.Projects.Find(1).EndingDate);
Assert.IsType<NoContentResult>(result);
// // Should Update
// Assert.Equal("Top Secret Project", context.Projects.Find(1).Title);
// Assert.Equal(new DateTime(2020, 7, 21), context.Projects.Find(1).EndingDate);
// Assert.IsType<NoContentResult>(result);
result = await controller.PutProject(2,
new Project()
{
Id = 1,
Title = "Top Secret Project",
Description = "Shht Don't Ask don't tell",
EndingDate = new DateTime(2020, 7, 21)
}
);
// result = await controller.PutProject(2,
// new Project()
// {
// Id = 1,
// Title = "Top Secret Project",
// Description = "Shht Don't Ask don't tell",
// EndingDate = new DateTime(2020, 7, 21)
// }
// );
// Should Return BadRequest
Assert.NotEqual("Top Secret Project", context.Projects.Find(2).Title);
Assert.NotEqual(new DateTime(2020, 7, 21), context.Projects.Find(2).CreationDate);
Assert.IsType<BadRequestResult>(result);
// // Should Return BadRequest
// Assert.NotEqual("Top Secret Project", context.Projects.Find(2).Title);
// Assert.NotEqual(new DateTime(2020, 7, 21), context.Projects.Find(2).CreationDate);
// Assert.IsType<BadRequestResult>(result);
// Delete updated project
context.Projects.RemoveRange(context.Projects.Find(1));
await context.SaveChangesAsync();
result = await controller.PutProject(1,
new Project()
{
Id = 1,
Title = "Top Secret Project",
Description = "Shht Don't Ask don't tell",
EndingDate = new DateTime(2020, 7, 21)
}
);
// result = await controller.PatchProject(1,
// new ProjectDTORequest()
// {
// Id = 1,
// Title = "Top Secret Project",
// Description = "Shht Don't Ask don't tell",
// EndingDate = new DateTime(2020, 7, 21)
// }
// );
// Should Throw
Assert.IsType<NotFoundResult>(result);
// // Should Throw
// Assert.IsType<NotFoundResult>(result);
Assert.Equal("Top Secret Project", context.Projects.Find(1).Title);
Assert.Equal(new DateTime(2020, 7, 21), context.Projects.Find(1).EndingDate);
}