feat: implement update task status in new module
- also implement for api storage
This commit is contained in:
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user