using Microsoft.AspNetCore.Mvc; using TodoList.Api.Models; using TodoTask = TodoList.Core.Entities.Task; using TodoList.Core.Entities; using TodoList.Core.Interfaces; namespace TodoList.Api.Controllers; /// /// 任务控制器,提供任务的 RESTful API 接口 /// [ApiController] [Route("api/[controller]")] public class TasksController : ControllerBase { private readonly ITaskService _taskService; /// /// 构造函数,注入任务服务 /// /// 任务服务接口 public TasksController(ITaskService taskService) { _taskService = taskService; } /// /// 获取任务列表 /// /// 可选参数,true 获取已完成任务,false 获取未完成任务,不传则获取所有任务 /// 任务列表响应 [HttpGet] public async Task>>> GetTasks([FromQuery] bool? completed = null) { try { List tasks; if (completed.HasValue) { tasks = completed.Value ? await _taskService.GetCompletedTasksAsync() : await _taskService.GetActiveTasksAsync(); } else { tasks = await _taskService.GetAllTasksAsync(); } var taskDtos = tasks.Select(MapToDto).ToList(); return Ok(new ApiResponse> { Success = true, Data = taskDtos, Message = "获取任务列表成功" }); } catch (Exception ex) { return StatusCode(500, new ApiResponse> { Success = false, Message = "获取任务列表失败", Errors = new List { ex.Message } }); } } /// /// 根据ID获取指定任务 /// /// 任务ID /// 任务详情响应 [HttpGet("{id}")] public async Task>> GetTask(int id) { try { var task = await _taskService.GetTaskByIdAsync(id); if (task == null) { return NotFound(new ApiResponse { Success = false, Message = $"未找到ID为 {id} 的任务" }); } return Ok(new ApiResponse { Success = true, Data = MapToDto(task), Message = "获取任务成功" }); } catch (Exception ex) { return StatusCode(500, new ApiResponse { Success = false, Message = "获取任务失败", Errors = new List { ex.Message } }); } } /// /// 创建新任务 /// /// 创建任务的数据传输对象 /// 创建的任务响应 [HttpPost] public async Task>> CreateTask([FromBody] CreateTaskDto dto) { try { if (string.IsNullOrWhiteSpace(dto.Title)) { return BadRequest(new ApiResponse { Success = false, Message = "任务标题不能为空", Errors = new List { "Title is required" } }); } var task = await _taskService.CreateTaskAsync(dto.Title, dto.Priority, dto.ParentTaskId); return CreatedAtAction(nameof(GetTask), new { id = task.Id }, new ApiResponse { Success = true, Data = MapToDto(task), Message = "创建任务成功" }); } catch (Exception ex) { return StatusCode(500, new ApiResponse { Success = false, Message = "创建任务失败", Errors = new List { ex.Message } }); } } /// /// 更新任务 /// /// 任务ID /// 更新任务的数据传输对象 /// 更新后的任务响应 [HttpPut("{id}")] public async Task>> UpdateTask(int id, [FromBody] UpdateTaskDto dto) { try { var task = await _taskService.UpdateTaskAsync(id, dto.Title, dto.Priority); return Ok(new ApiResponse { Success = true, Data = MapToDto(task), Message = "更新任务成功" }); } catch (KeyNotFoundException) { return NotFound(new ApiResponse { Success = false, Message = $"未找到ID为 {id} 的任务" }); } catch (Exception ex) { return StatusCode(500, new ApiResponse { Success = false, Message = "更新任务失败", Errors = new List { ex.Message } }); } } /// /// 切换任务的完成状态 /// /// 任务ID /// 更新后的任务响应 [HttpPatch("{id}/complete")] public async Task>> ToggleComplete(int id) { try { var task = await _taskService.ToggleCompleteAsync(id); return Ok(new ApiResponse { Success = true, Data = MapToDto(task), Message = task.IsCompleted ? "任务已完成" : "任务已取消完成" }); } catch (KeyNotFoundException) { return NotFound(new ApiResponse { Success = false, Message = $"未找到ID为 {id} 的任务" }); } catch (Exception ex) { return StatusCode(500, new ApiResponse { Success = false, Message = "更新任务状态失败", Errors = new List { ex.Message } }); } } /// /// 删除任务 /// /// 任务ID /// 删除结果响应 [HttpDelete("{id}")] public async Task>> DeleteTask(int id) { try { await _taskService.DeleteTaskAsync(id); return Ok(new ApiResponse { Success = true, Message = "删除任务成功" }); } catch (KeyNotFoundException) { return NotFound(new ApiResponse { Success = false, Message = $"未找到ID为 {id} 的任务" }); } catch (Exception ex) { return StatusCode(500, new ApiResponse { Success = false, Message = "删除任务失败", Errors = new List { ex.Message } }); } } /// /// 将任务实体映射为数据传输对象 /// /// 任务实体 /// 任务数据传输对象 private static TaskDto MapToDto(TodoTask task) { return new TaskDto { Id = task.Id, Title = task.Title, Priority = task.Priority, IsCompleted = task.IsCompleted, CreatedAt = task.CreatedAt, UpdatedAt = task.UpdatedAt, ParentTaskId = task.ParentTaskId, SubTasks = task.SubTasks?.Select(st => new TaskDto { Id = st.Id, Title = st.Title, Priority = st.Priority, IsCompleted = st.IsCompleted, CreatedAt = st.CreatedAt, UpdatedAt = st.UpdatedAt, ParentTaskId = st.ParentTaskId, SubTasks = new List() }).ToList() ?? new List() }; } }