From 202236a45bcb3ab50f7331cc02312c9d8e3ed44b Mon Sep 17 00:00:00 2001 From: Mika Kuns Date: Tue, 21 Apr 2026 17:26:01 +0200 Subject: [PATCH] feat(data): add TaskRepository.ResetToManualAsync --- .../Repositories/TaskRepository.cs | 11 +++++++ .../Repositories/TaskRepositoryTests.cs | 29 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/ClaudeDo.Data/Repositories/TaskRepository.cs b/src/ClaudeDo.Data/Repositories/TaskRepository.cs index 429d8b9..e9465bc 100644 --- a/src/ClaudeDo.Data/Repositories/TaskRepository.cs +++ b/src/ClaudeDo.Data/Repositories/TaskRepository.cs @@ -98,6 +98,17 @@ public sealed class TaskRepository .SetProperty(t => t.Result, resultText), ct); } + public async Task ResetToManualAsync(string taskId, CancellationToken ct = default) + { + await _context.Tasks + .Where(t => t.Id == taskId) + .ExecuteUpdateAsync(s => s + .SetProperty(t => t.Status, TaskStatus.Manual) + .SetProperty(t => t.StartedAt, (DateTime?)null) + .SetProperty(t => t.FinishedAt, (DateTime?)null) + .SetProperty(t => t.Result, (string?)null), ct); + } + #endregion #region Tags diff --git a/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryTests.cs b/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryTests.cs index 1495213..d8261dd 100644 --- a/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryTests.cs +++ b/tests/ClaudeDo.Worker.Tests/Repositories/TaskRepositoryTests.cs @@ -198,6 +198,35 @@ public sealed class TaskRepositoryTests : IDisposable Assert.Equal(TaskStatus.Done, d!.Status); } + [Fact] + public async Task ResetToManualAsync_ClearsResultFields_AndSetsStatusManual() + { + var listId = await CreateListAsync(); + var task = new TaskEntity + { + Id = Guid.NewGuid().ToString(), + ListId = listId, + Title = "T", + CreatedAt = DateTime.UtcNow, + Status = TaskStatus.Failed, + StartedAt = DateTime.UtcNow.AddMinutes(-5), + FinishedAt = DateTime.UtcNow, + Result = "boom", + CommitType = "feat", + }; + await _tasks.AddAsync(task); + + await _tasks.ResetToManualAsync(task.Id); + + using var readCtx = _db.CreateContext(); + var after = await new TaskRepository(readCtx).GetByIdAsync(task.Id); + Assert.NotNull(after); + Assert.Equal(TaskStatus.Manual, after!.Status); + Assert.Null(after.StartedAt); + Assert.Null(after.FinishedAt); + Assert.Null(after.Result); + } + [Fact] public async Task GetEffectiveTagsAsync_Returns_Union_Of_ListTags_And_TaskTags() {