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 UnitOfWork _context; /// /// Returns all existing projects. /// /// /// Sample request: /// /// GET: api/Projects /// /// /// Returns all existing projects [HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] public async Task> GetProjects() { return await _context.Projects.List(); } /// /// 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 _context.Projects.Get(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.Update(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); // if (project == null) // { // return NotFound(); // } // 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(); // // } } }