using System; using System.Collections.Generic; using System.Linq; using System.Net.Mime; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using TicketManager.Data; using TicketManager.Models; namespace TicketManager.Controllers { [Produces("application/json")] [Route("api/v1/[controller]")] [ApiController] public class ProjectsController : ControllerBase { private readonly IProjectRepository _projectRepo; public ProjectsController(IProjectRepository projectRepo) { _projectRepo = projectRepo; } /// /// Returns all existing projects. /// /// /// Sample request: /// /// GET: api/Projects /// /// /// Returns all existing projects [HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> GetProjects() { return await _projectRepo.ListAsync(); // GetAllProjectsAsync(); } /// /// Returns a specific project. /// /// /// Sample request: /// /// GET: api/Projects/2 /// /// /// Returns a specific project /// If the required project is null [HttpGet("{id}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetProject(int id) { Project project = await _projectRepo.GetByIdAsync(id); if (project == null) { return NotFound(); } return project; } /// /// Updates a specific project. /// /// /// Sample request: /// /// PUT: api/Projects/3 /// { /// "id": "357727fd-5262-4522-b8a3-38271d43de84", /// "firstName": "Thomas", /// "lastName": "Price", /// "presentation": "New Team?!", /// "email": "tp@mail.com", /// "phone": "0198237645" /// } /// /// /// Returns the modified project /// Request was succesful but no content is changed /// If the required project is null [HttpPut("{id}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task PutProject(int id, Project project) { if (id != project.Id) { return BadRequest(); } try { await _projectRepo.UpdateAsync(project); } catch (DbUpdateConcurrencyException) { if (!_projectRepo.Exists(id)) { return NotFound(); } else { throw; } } return NoContent(); } /// /// Creates a project. /// /// /// Sample request: /// /// POST: api/Projects/ /// { /// "firstName": "Thomas", /// "lastName": "Price", /// "presentation": "New Team?!", /// "email": "tp@mail.com", /// "phone": "0198237645" /// } /// /// /// Returns the created project [HttpPost] [ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> PostProject(Project project) { if (!ModelState.IsValid) { return BadRequest(); } await _projectRepo.AddAsync(project); return CreatedAtAction("GetProject", new { id = project.Id }, project); } /// /// Deletes a project. /// /// /// Sample request: /// /// DELETE: api/Projects/5 /// /// /// Returns the deleted project [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [HttpDelete("{id}")] public async Task> DeleteProject(int id) { var project = await _projectRepo.GetByIdAsync(id); if (project == null) { return NotFound(); } await _projectRepo.DeleteAsync(id); return project; } /// /// Gets a project members. /// /// /// Sample request: /// /// GET: api/Projects/5/Members /// /// /// Returns the project members [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [HttpGet("{id}/members")] public async Task>> GetProjectMembers(int id) { Project project = await _projectRepo.GetByIdAsync(id); if (project == null) { return NotFound(); } return project.GetMembers(); } /// /// Updates a project members. /// /// /// Sample request: /// /// PUT: api/Projects/5/Members /// { /// "id": "357727fd-5262-4522-b8a3-38271d43de84", /// "firstName": "Thomas", /// "lastName": "Price", /// "presentation": "New Team?!", /// "email": "tp@mail.com", /// "phone": "0198237645" /// } /// /// No content [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] [HttpPut("{id}/members")] public async Task> SetProjectMembers(int id, List projectMembers) { Project project = await _projectRepo.GetByIdAsync(id); project.SetMembers(projectMembers); try { await _projectRepo.UpdateAsync(project); } 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 NoContent(); } // /// // /// Assign a user to a project. // /// // /// // /// Sample request: // /// // /// POST: api/Projects/addmembers // /// [{ // /// "id": "357727fd-5262-4522-b8a3-38271d43de84", // /// "firstName": "Thomas", // /// "lastName": "Price", // /// "presentation": "New Team?!", // /// "email": "tp@mail.com", // /// "phone": "0198237645" // /// }] // /// // /// // /// Returns the created project // [ProducesResponseType(StatusCodes.Status204NoContent)] // [ProducesResponseType(StatusCodes.Status404NotFound)] // [HttpPut("{id}/addMembers")] // public async Task> AddMembersToProject(int id, List usersToAdd) // { // if (usersToAdd == null) // { // return BadRequest(); // } // Project project = await GetProjectByIdAsync(id); // project.AddMembers(usersToAdd); // 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 NoContent(); // } // /// // /// Remove a user to a project. // /// // /// // /// Sample request: // /// // /// PUT: api/Projects/removemembers // /// [{ // /// "id": "357727fd-5262-4522-b8a3-38271d43de84", // /// "firstName": "Thomas", // /// "lastName": "Price", // /// "presentation": "New Team?!", // /// "email": "tp@mail.com", // /// "phone": "0198237645" // /// }] // /// // /// // /// Returns the created project // [ProducesResponseType(StatusCodes.Status204NoContent)] // [ProducesResponseType(StatusCodes.Status404NotFound)] // [HttpPut("{id}/removeMembers")] // public async Task> RemoveMembersFromProject(int id, List usersToRemove) // { // Project project = await GetProjectByIdAsync(id); // project.RemoveMembers(usersToRemove); // 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 NoContent(); // } } }