Загрузка данных


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);
        }
    }
}