feat: planning sessions foundation (Plan A) #4
@@ -293,6 +293,16 @@ public sealed class TaskRepository
|
|||||||
.SetProperty(t => t.PlanningSessionId, sessionId), ct);
|
.SetProperty(t => t.PlanningSessionId, sessionId), ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<TaskEntity?> FindByPlanningTokenAsync(
|
||||||
|
string token,
|
||||||
|
CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(token)) return null;
|
||||||
|
return await _context.Tasks
|
||||||
|
.AsNoTracking()
|
||||||
|
.FirstOrDefaultAsync(t => t.PlanningSessionToken == token, ct);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Queue selection
|
#region Queue selection
|
||||||
|
|||||||
@@ -166,4 +166,25 @@ public sealed class TaskRepositoryPlanningTests : IDisposable
|
|||||||
var loaded = await _tasks.GetByIdAsync(task.Id);
|
var loaded = await _tasks.GetByIdAsync(task.Id);
|
||||||
Assert.Equal("claude-session-42", loaded!.PlanningSessionId);
|
Assert.Equal("claude-session-42", loaded!.PlanningSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task FindByPlanningTokenAsync_ReturnsTask_WhenTokenMatches()
|
||||||
|
{
|
||||||
|
var listId = await CreateListAsync();
|
||||||
|
var task = MakeTask(listId, TaskStatus.Manual);
|
||||||
|
await _tasks.AddAsync(task);
|
||||||
|
await _tasks.SetPlanningStartedAsync(task.Id, "unique-token-123");
|
||||||
|
|
||||||
|
var found = await _tasks.FindByPlanningTokenAsync("unique-token-123");
|
||||||
|
|
||||||
|
Assert.NotNull(found);
|
||||||
|
Assert.Equal(task.Id, found!.Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task FindByPlanningTokenAsync_ReturnsNull_WhenTokenUnknown()
|
||||||
|
{
|
||||||
|
var found = await _tasks.FindByPlanningTokenAsync("no-such-token");
|
||||||
|
Assert.Null(found);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user