mirror of
https://github.com/rjNemo/ticket_manager
synced 2026-06-12 03:36:39 +00:00
added NewModelDTOs edit controllers
This commit is contained in:
parent
6ac62d7176
commit
481832fdbc
12 changed files with 146 additions and 58 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
25
DTOs/AppUser/NewAppUserDTO.cs
Normal file
25
DTOs/AppUser/NewAppUserDTO.cs
Normal 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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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; }
|
||||||
27
DTOs/Tickets/NewTicketDTO.cs
Normal file
27
DTOs/Tickets/NewTicketDTO.cs
Normal 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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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>();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue