using Microsoft.EntityFrameworkCore; using Hua.Todo.Core.Entities; using Hua.Todo.Core.Interfaces; namespace Hua.Todo.Application.Repositories; /// /// 任务仓储实现(EF Core)。 /// public class TaskRepository : ITaskRepository { private readonly TodoDbContext _context; /// /// 创建 。 /// /// 数据库上下文。 public TaskRepository(TodoDbContext context) { _context = context; } /// /// 获取所有任务。 /// /// 包含所有任务实体的列表。 public async Task> GetAllAsync() { return await _context.Tasks .Include(t => t.SubTasks!) .ToListAsync(); } /// /// 根据 ID 获取任务。 /// /// 任务 ID。 /// 匹配的任务实体;如果不存在则返回 null。 public async Task GetByIdAsync(Guid id) { return await _context.Tasks .Include(t => t.SubTasks!) .FirstOrDefaultAsync(t => t.Id == id); } /// /// 获取未完成任务列表。 /// /// 未完成的任务实体列表。 public async Task> GetActiveTasksAsync() { return await _context.Tasks .Where(t => !t.IsCompleted) .OrderByDescending(t => t.CreationTime) .ToListAsync(); } /// /// 获取已完成任务列表。 /// /// 已完成的任务实体列表。 public async Task> GetCompletedTasksAsync() { return await _context.Tasks .Where(t => t.IsCompleted) .OrderByDescending(t => t.LastModificationTime) .ToListAsync(); } /// /// 新增一个任务。 /// /// 要添加的任务实体。 /// 已持久化的任务实体(包含生成的 ID)。 public async Task AddAsync(TaskEntity taskEntity) { _context.Tasks.Add(taskEntity); await _context.SaveChangesAsync(); return taskEntity; } /// /// 更新现有任务信息。 /// /// 要更新的任务实体。 /// 更新后的任务实体。 public async Task UpdateAsync(TaskEntity taskEntity) { taskEntity.LastModificationTime = DateTime.UtcNow; _context.Tasks.Update(taskEntity); await _context.SaveChangesAsync(); return taskEntity; } /// /// 根据 ID 删除任务。 /// /// 要删除的任务 ID。 /// 表示删除操作的任务。 public async Task DeleteAsync(Guid id) { var task = await _context.Tasks.FindAsync(id); if (task != null) { _context.Tasks.Remove(task); await _context.SaveChangesAsync(); } } /// /// 获取指定父任务的子任务列表。 /// /// 父任务 ID。 /// 子任务实体的列表。 public async Task> GetSubTasksAsync(Guid parentTaskId) { return await _context.Tasks .Where(t => t.ParentTaskId == parentTaskId) .OrderByDescending(t => t.CreationTime) .ToListAsync(); } /// /// 获取指定用户的任务中最大的数字型 Code。 /// /// 用户 ID。 /// 最大数字 Code;若无任务或无可解析 Code 则返回 0。 public async Task GetMaxCodeAsync(Guid userId) { var codes = await _context.Tasks .AsNoTracking() .Where(t => t.UserId == userId) .Select(t => t.Code) .ToListAsync(); int max = 0; foreach (var code in codes) { if (int.TryParse(code, out var value) && value > max) { max = value; } } return max; } }