feat: implement update task status in new module

- also implement for api storage
This commit is contained in:
Ralph Khreish
2025-09-17 14:35:52 +02:00
parent 137ef36278
commit 3657e798e8
4 changed files with 405 additions and 0 deletions

View File

@@ -360,4 +360,103 @@ export class TaskService {
async setActiveTag(tag: string): Promise<void> {
await this.configManager.setActiveTag(tag);
}
/**
* Update task status
*/
async updateTaskStatus(
taskId: string | number,
newStatus: TaskStatus,
tag?: string
): Promise<{
success: boolean;
oldStatus: TaskStatus;
newStatus: TaskStatus;
taskId: string;
}> {
// Ensure we have storage
if (!this.storage) {
throw new TaskMasterError(
'Storage not initialized',
ERROR_CODES.STORAGE_ERROR
);
}
// Use provided tag or get active tag
const activeTag = tag || this.getActiveTag();
// Get all tasks to find the one to update
const result = await this.getTaskList({
tag: activeTag,
includeSubtasks: true
});
// Handle both regular tasks (e.g., "5") and subtasks (e.g., "5.2")
const taskIdStr = String(taskId);
let taskToUpdate: Task | undefined;
let oldStatus: TaskStatus;
if (taskIdStr.includes('.')) {
// Handle subtask
const [parentIdStr, subtaskIdStr] = taskIdStr.split('.');
const parentId = parseInt(parentIdStr, 10);
const subtaskId = parseInt(subtaskIdStr, 10);
const parentTask = result.tasks.find((t) => t.id === String(parentId));
if (!parentTask || !parentTask.subtasks) {
throw new TaskMasterError(
`Parent task ${parentId} not found or has no subtasks`,
ERROR_CODES.TASK_NOT_FOUND
);
}
const subtask = parentTask.subtasks.find(
(st) => String(st.id) === String(subtaskId)
);
if (!subtask) {
throw new TaskMasterError(
`Subtask ${taskIdStr} not found`,
ERROR_CODES.TASK_NOT_FOUND
);
}
oldStatus = subtask.status;
// Update the subtask status
subtask.status = newStatus;
// Update the parent task with the modified subtask
await this.storage.updateTask(parentTask.id, parentTask, activeTag);
taskToUpdate = parentTask;
} else {
// Handle regular task
const taskIdNum = parseInt(taskIdStr, 10);
taskToUpdate = result.tasks.find(
(t) => String(t.id) === String(taskIdNum)
);
if (!taskToUpdate) {
throw new TaskMasterError(
`Task ${taskIdStr} not found`,
ERROR_CODES.TASK_NOT_FOUND
);
}
oldStatus = taskToUpdate.status;
// Update the task status
taskToUpdate.status = newStatus;
// Save the updated task
await this.storage.updateTask(taskToUpdate.id, taskToUpdate, activeTag);
}
return {
success: true,
oldStatus,
newStatus,
taskId: taskIdStr
};
}
}

View File

@@ -175,6 +175,22 @@ export class TaskMasterCore {
await this.configManager.setActiveTag(tag);
}
/**
* Update task status
*/
async updateTaskStatus(
taskId: string | number,
newStatus: TaskStatus,
tag?: string
): Promise<{
success: boolean;
oldStatus: TaskStatus;
newStatus: TaskStatus;
taskId: string;
}> {
return this.taskService.updateTaskStatus(taskId, newStatus, tag);
}
/**
* Close and cleanup resources
*/