124 lines
4 KiB
Python
124 lines
4 KiB
Python
|
|
"""Debug CLI — task management commands."""
|
||
|
|
import click
|
||
|
|
import httpx
|
||
|
|
|
||
|
|
from cli._context import CliContext, get_http_headers, output, error_output
|
||
|
|
from services import task_service
|
||
|
|
|
||
|
|
|
||
|
|
@click.group("tasks")
|
||
|
|
def tasks_group() -> None:
|
||
|
|
"""Background task management commands."""
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
@tasks_group.command("status")
|
||
|
|
@click.argument("task_id")
|
||
|
|
@click.pass_context
|
||
|
|
def task_status(ctx: click.Context, task_id: str) -> None:
|
||
|
|
"""Get the status of a background task."""
|
||
|
|
cli_ctx: CliContext = ctx.obj["cli_ctx"]
|
||
|
|
|
||
|
|
try:
|
||
|
|
if cli_ctx.use_http:
|
||
|
|
resp = httpx.get(
|
||
|
|
f"{cli_ctx.api_base_url}/api/task_status",
|
||
|
|
headers=get_http_headers(cli_ctx.user_email),
|
||
|
|
params={"task_id": task_id},
|
||
|
|
)
|
||
|
|
resp.raise_for_status()
|
||
|
|
data = resp.json()
|
||
|
|
else:
|
||
|
|
status = task_service.get_task_status(task_id)
|
||
|
|
data = {
|
||
|
|
"task_id": status.task_id,
|
||
|
|
"status": status.status,
|
||
|
|
"progress": status.progress,
|
||
|
|
"processed": status.processed,
|
||
|
|
"total": status.total,
|
||
|
|
"message": status.message,
|
||
|
|
"error": status.error,
|
||
|
|
}
|
||
|
|
|
||
|
|
output(data, cli_ctx.json_output)
|
||
|
|
except httpx.HTTPStatusError as e:
|
||
|
|
error_output(f"HTTP {e.response.status_code}: {e.response.text}", cli_ctx.json_output)
|
||
|
|
except Exception as e:
|
||
|
|
error_output(str(e), cli_ctx.json_output)
|
||
|
|
|
||
|
|
|
||
|
|
@tasks_group.command("list")
|
||
|
|
@click.pass_context
|
||
|
|
def list_tasks(ctx: click.Context) -> None:
|
||
|
|
"""List all task IDs for the user."""
|
||
|
|
cli_ctx: CliContext = ctx.obj["cli_ctx"]
|
||
|
|
|
||
|
|
try:
|
||
|
|
if cli_ctx.use_http:
|
||
|
|
resp = httpx.get(
|
||
|
|
f"{cli_ctx.api_base_url}/api/tasks_for_user",
|
||
|
|
headers=get_http_headers(cli_ctx.user_email),
|
||
|
|
)
|
||
|
|
resp.raise_for_status()
|
||
|
|
data = resp.json()
|
||
|
|
else:
|
||
|
|
data = task_service.get_user_tasks(cli_ctx.user_email)
|
||
|
|
|
||
|
|
output(data, cli_ctx.json_output)
|
||
|
|
except httpx.HTTPStatusError as e:
|
||
|
|
error_output(f"HTTP {e.response.status_code}: {e.response.text}", cli_ctx.json_output)
|
||
|
|
except Exception as e:
|
||
|
|
error_output(str(e), cli_ctx.json_output)
|
||
|
|
|
||
|
|
|
||
|
|
@tasks_group.command("cancel")
|
||
|
|
@click.argument("task_id")
|
||
|
|
@click.pass_context
|
||
|
|
def cancel_task(ctx: click.Context, task_id: str) -> None:
|
||
|
|
"""Cancel a running task."""
|
||
|
|
cli_ctx: CliContext = ctx.obj["cli_ctx"]
|
||
|
|
|
||
|
|
try:
|
||
|
|
if cli_ctx.use_http:
|
||
|
|
resp = httpx.post(
|
||
|
|
f"{cli_ctx.api_base_url}/api/cancel_task",
|
||
|
|
headers=get_http_headers(cli_ctx.user_email),
|
||
|
|
params={"task_id": task_id},
|
||
|
|
)
|
||
|
|
resp.raise_for_status()
|
||
|
|
data = resp.json()
|
||
|
|
else:
|
||
|
|
task_service.cancel_task(task_id, user_email=cli_ctx.user_email)
|
||
|
|
data = {"success": True, "message": "Task cancelled"}
|
||
|
|
|
||
|
|
output(data, cli_ctx.json_output)
|
||
|
|
except httpx.HTTPStatusError as e:
|
||
|
|
error_output(f"HTTP {e.response.status_code}: {e.response.text}", cli_ctx.json_output)
|
||
|
|
except Exception as e:
|
||
|
|
error_output(str(e), cli_ctx.json_output)
|
||
|
|
|
||
|
|
|
||
|
|
@tasks_group.command("clear")
|
||
|
|
@click.pass_context
|
||
|
|
def clear_tasks(ctx: click.Context) -> None:
|
||
|
|
"""Clear all tasks for the user."""
|
||
|
|
cli_ctx: CliContext = ctx.obj["cli_ctx"]
|
||
|
|
|
||
|
|
try:
|
||
|
|
if cli_ctx.use_http:
|
||
|
|
resp = httpx.post(
|
||
|
|
f"{cli_ctx.api_base_url}/api/clear_all_tasks",
|
||
|
|
headers=get_http_headers(cli_ctx.user_email),
|
||
|
|
)
|
||
|
|
resp.raise_for_status()
|
||
|
|
data = resp.json()
|
||
|
|
else:
|
||
|
|
count = task_service.clear_all_tasks(cli_ctx.user_email)
|
||
|
|
data = {"success": True, "count": count, "message": f"Cleared {count} tasks"}
|
||
|
|
|
||
|
|
output(data, cli_ctx.json_output)
|
||
|
|
except httpx.HTTPStatusError as e:
|
||
|
|
error_output(f"HTTP {e.response.status_code}: {e.response.text}", cli_ctx.json_output)
|
||
|
|
except Exception as e:
|
||
|
|
error_output(str(e), cli_ctx.json_output)
|