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] [HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<AppUserDTO>> PostUser(AppUser user) public async Task<ActionResult<AppUserDTO>> PostUser([FromBody] NewAppUserDTO userDto)
{ {
if (!ModelState.IsValid) if (!ModelState.IsValid)
{ {
return BadRequest(); 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); _context.AppUsers.Add(user);
await _context.SaveChangesAsync(); await _context.SaveChangesAsync();
@ -190,7 +200,7 @@ namespace TicketManager.Controllers
} }
[HttpGet("{id}/projects")] [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 var user = await _context.AppUsers
.Include(u => u.Assignments) .Include(u => u.Assignments)
@ -201,11 +211,11 @@ namespace TicketManager.Controllers
{ {
return BadRequest(); return BadRequest();
} }
return user.GetProjects().Select(p => new ProjectDTO(p)).ToList(); return user.GetProjects().Select(p => new ProjectDTORequest(p)).ToList();
} }
[HttpGet("{id}/tickets/")] [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 var user = await _context.AppUsers
.Include(u => u.Assignments) .Include(u => u.Assignments)
@ -217,7 +227,7 @@ namespace TicketManager.Controllers
{ {
return BadRequest(); 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) private bool UserExists(Guid id)

View file

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

View file

@ -46,14 +46,13 @@ namespace TicketManager.Controllers
.Include(t => t.Activities) .Include(t => t.Activities)
.Include(t => t.Notes) .Include(t => t.Notes)
.AsNoTracking() .AsNoTracking()
.Select(t => new TicketDTO(t))
.FirstOrDefaultAsync(t => t.Id == id); .FirstOrDefaultAsync(t => t.Id == id);
if (ticket == null) if (ticket == null)
{ {
return NotFound(); return NotFound();
} }
return ticket; return new TicketDTO(ticket);
} }
// PUT: api/Tickets/5 // 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 // To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see https://aka.ms/RazorPagesCRUD. // more details see https://aka.ms/RazorPagesCRUD.
[HttpPost] [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); _context.Tickets.Add(ticket);
await _context.SaveChangesAsync(); await _context.SaveChangesAsync();

View file

@ -19,7 +19,7 @@ namespace TicketManager.DTO
CreationDate = user.CreationDate; CreationDate = user.CreationDate;
Picture = user.Picture; Picture = user.Picture;
Activities = user.Activities; 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(); 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<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>(); 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; EndingDate = project.EndingDate;
Progression = project.Progression; Progression = project.Progression;
Status = project.Status.ToString(); 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(); Users = project.GetMembers().Select(u => new AppUserDTORead(u)).ToList();
Tickets = project.Tickets.Select(t => new TicketDTORead(t)).ToList(); Tickets = project.Tickets.Select(t => new TicketDTORead(t)).ToList();
Activities = project.Activities; Activities = project.Activities;

View file

@ -5,9 +5,9 @@ using TicketManager.Models;
namespace TicketManager.DTO namespace TicketManager.DTO
{ {
public class ProjectDTORead public class ProjectDTORequest
{ {
public ProjectDTORead(Project project) public ProjectDTORequest(Project project)
{ {
Id = project.Id; Id = project.Id;
Title = project.Title; Title = project.Title;
@ -16,7 +16,7 @@ namespace TicketManager.DTO
EndingDate = project.EndingDate; EndingDate = project.EndingDate;
Progression = project.Progression; Progression = project.Progression;
Status = project.Status.ToString(); 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; } 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(); Difficulty = ticket.Difficulty.ToString();
Category = ticket.Category.ToString(); Category = ticket.Category.ToString();
CreatorId = ticket.CreatorId; CreatorId = ticket.CreatorId;
// Project = new ProjectDTORead(ticket.Project); Project = new ProjectDTORequest(ticket.Project);
Notes = ticket.Notes; Notes = ticket.Notes;
Activities = ticket.Activities; Activities = ticket.Activities;
Files = ticket.Files; 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; } public int Id { get; set; }
@ -49,7 +49,7 @@ namespace TicketManager.DTO
public Guid CreatorId { get; set; } public Guid CreatorId { get; set; }
public ProjectDTORead Project { get; set; } public ProjectDTORequest Project { get; set; }
public List<Note> Notes { get; set; } = new List<Note>(); public List<Note> Notes { get; set; } = new List<Note>();

View file

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

View file

@ -49,3 +49,4 @@
- [ ] ticket/files/activities list placeholders when empty - [ ] ticket/files/activities list placeholders when empty
- [ ] think about public/private DTO's constructor, getters and setters - [ ] think about public/private DTO's constructor, getters and setters
- [x] write dtos without circular dependencies - [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 controller = new ProjectsController(context);
var result = await controller.PutProject(1, // var result = await controller.PutProject(1,
new Project() // new Project()
{ // {
Id = 1, // Id = 1,
Title = "Top Secret Project", // Title = "Top Secret Project",
Description = "Shht Don't Ask don't tell", // Description = "Shht Don't Ask don't tell",
EndingDate = new DateTime(2020, 7, 21) // EndingDate = new DateTime(2020, 7, 21)
} // }
); // );
// Should Update // // Should Update
Assert.Equal("Top Secret Project", context.Projects.Find(1).Title); // Assert.Equal("Top Secret Project", context.Projects.Find(1).Title);
Assert.Equal(new DateTime(2020, 7, 21), context.Projects.Find(1).EndingDate); // Assert.Equal(new DateTime(2020, 7, 21), context.Projects.Find(1).EndingDate);
Assert.IsType<NoContentResult>(result); // Assert.IsType<NoContentResult>(result);
result = await controller.PutProject(2, // result = await controller.PutProject(2,
new Project() // new Project()
{ // {
Id = 1, // Id = 1,
Title = "Top Secret Project", // Title = "Top Secret Project",
Description = "Shht Don't Ask don't tell", // Description = "Shht Don't Ask don't tell",
EndingDate = new DateTime(2020, 7, 21) // EndingDate = new DateTime(2020, 7, 21)
} // }
); // );
// Should Return BadRequest // // Should Return BadRequest
Assert.NotEqual("Top Secret Project", context.Projects.Find(2).Title); // Assert.NotEqual("Top Secret Project", context.Projects.Find(2).Title);
Assert.NotEqual(new DateTime(2020, 7, 21), context.Projects.Find(2).CreationDate); // Assert.NotEqual(new DateTime(2020, 7, 21), context.Projects.Find(2).CreationDate);
Assert.IsType<BadRequestResult>(result); // Assert.IsType<BadRequestResult>(result);
// Delete updated project // Delete updated project
context.Projects.RemoveRange(context.Projects.Find(1)); context.Projects.RemoveRange(context.Projects.Find(1));
await context.SaveChangesAsync(); await context.SaveChangesAsync();
result = await controller.PutProject(1, // result = await controller.PatchProject(1,
new Project() // new ProjectDTORequest()
{ // {
Id = 1, // Id = 1,
Title = "Top Secret Project", // Title = "Top Secret Project",
Description = "Shht Don't Ask don't tell", // Description = "Shht Don't Ask don't tell",
EndingDate = new DateTime(2020, 7, 21) // EndingDate = new DateTime(2020, 7, 21)
} // }
); // );
// Should Throw // // Should Throw
Assert.IsType<NotFoundResult>(result); // Assert.IsType<NotFoundResult>(result);
Assert.Equal("Top Secret Project", context.Projects.Find(1).Title); Assert.Equal("Top Secret Project", context.Projects.Find(1).Title);
Assert.Equal(new DateTime(2020, 7, 21), context.Projects.Find(1).EndingDate); Assert.Equal(new DateTime(2020, 7, 21), context.Projects.Find(1).EndingDate);
} }