using System.Linq;
using System.Net;
using System.Web.Http;
using TaskTracker.Models;
namespace TaskTracker.Controllers
{
public class ProjectsController : ApiController
{
[HttpGet]
public IHttpActionResult GetProjects()
{
return Ok(AppData.Projects);
}
[HttpGet]
public IHttpActionResult GetProject(int id)
{
var project = AppData.Projects.FirstOrDefault(p => p.Id == id);
if (project == null)
return NotFound();
return Ok(project);
}
[HttpPost]
public IHttpActionResult CreateProject(Project project)
{
if (project == null)
return BadRequest("Данные проекта не переданы");
if (string.IsNullOrWhiteSpace(project.Name))
return BadRequest("Название проекта не может быть пустым");
if (string.IsNullOrWhiteSpace(project.Owner))
return BadRequest("Владелец проекта не может быть пустым");
bool exists = AppData.Projects.Any(p =>
p.Name.Equals(project.Name, System.StringComparison.OrdinalIgnoreCase));
if (exists)
return Content(
HttpStatusCode.Conflict,
"Проект с таким названием уже существует");
int newId = AppData.Projects.Count == 0
? 1
: AppData.Projects.Max(p => p.Id) + 1;
project.Id = newId;
project.IsArchived = false;
AppData.Projects.Add(project);
return Content(HttpStatusCode.Created, project);
}
[HttpPut]
public IHttpActionResult ArchiveProject(int id)
{
var project = AppData.Projects.FirstOrDefault(p => p.Id == id);
if (project == null)
return NotFound();
if (project.IsArchived)
return Content(
HttpStatusCode.Conflict,
"Проект уже архивирован");
project.IsArchived = true;
return StatusCode(HttpStatusCode.NoContent);
}
[HttpGet]
public IHttpActionResult GetStats(int id)
{
var project = AppData.Projects.FirstOrDefault(p => p.Id == id);
if (project == null)
return NotFound();
var tasks = AppData.Tasks
.Where(t => t.ProjectId == id)
.ToList();
var result = new
{
projectId = project.Id,
projectName = project.Name,
totalTasks = tasks.Count,
newTasks = tasks.Count(t => t.Status == "New"),
inProgressTasks = tasks.Count(t => t.Status == "InProgress"),
doneTasks = tasks.Count(t => t.Status == "Done"),
cancelledTasks = tasks.Count(t => t.Status == "Cancelled"),
overdueTasks = tasks.Count(t =>
t.DueDate.HasValue &&
t.DueDate.Value.Date < System.DateTime.Today &&
t.Status != "Done" &&
t.Status != "Cancelled")
};
return Ok(result);
}
}
}