Files
disknext/routers/api/v1/admin/task/__init__.py
于小丘 d2c914cff8 Refactor and enhance OAuth2.0 implementation; update models and routes
- Refactored AdminSummaryData and AdminSummaryResponse classes for better clarity.
- Added OAUTH type to SettingsType enum.
- Cleaned up imports in webdav.py.
- Updated admin router to improve summary data retrieval and response handling.
- Enhanced file management routes with better condition handling and user storage updates.
- Improved group management routes by optimizing data retrieval.
- Refined task management routes for better condition handling.
- Updated user management routes to streamline access token retrieval.
- Implemented a new captcha verification structure with abstract base class.
- Removed deprecated env.md file and replaced with a new structured version.
- Introduced a unified OAuth2.0 client base class for GitHub and QQ integrations.
- Enhanced password management with improved hashing strategies.
- Added detailed comments and documentation throughout the codebase for clarity.
2026-01-12 18:07:44 +08:00

123 lines
3.3 KiB
Python

from uuid import UUID
from fastapi import APIRouter, Depends, HTTPException
from loguru import logger as l
from middleware.auth import admin_required
from middleware.dependencies import SessionDep, TableViewRequestDep
from models import (
ResponseBase, ListResponse,
Task, TaskSummary,
)
admin_task_router = APIRouter(
prefix='/task',
tags=['admin', 'admin_task']
)
@admin_task_router.get(
path='/list',
summary='获取任务列表',
description='Get task list',
dependencies=[Depends(admin_required)]
)
async def router_admin_get_task_list(
session: SessionDep,
table_view: TableViewRequestDep,
user_id: UUID | None = None,
status: str | None = None,
) -> ListResponse[TaskSummary]:
"""
获取任务列表。
:param session: 数据库会话
:param table_view: 分页排序参数依赖
:param user_id: 按用户筛选
:param status: 按状态筛选
:return: 分页任务列表
"""
conditions = []
if user_id:
conditions.append(Task.user_id == user_id)
if status:
conditions.append(Task.status == status)
if conditions:
condition = conditions[0]
for c in conditions[1:]:
condition = condition & c
else:
condition = None
result = await Task.get_with_count(session, condition, table_view=table_view, load=Task.user)
items: list[TaskSummary] = []
for t in result.items:
user = await t.awaitable_attrs.user
items.append(TaskSummary.from_task(t, user))
return ListResponse(items=items, count=result.count)
@admin_task_router.get(
path='/{task_id}',
summary='获取任务详情',
description='Get task detail by ID',
dependencies=[Depends(admin_required)]
)
async def router_admin_get_task(
session: SessionDep,
task_id: int,
) -> ResponseBase:
"""
获取任务详情。
:param session: 数据库会话
:param task_id: 任务ID
:return: 任务详情
"""
task = await Task.get(session, Task.id == task_id, load=Task.props)
if not task:
raise HTTPException(status_code=404, detail="任务不存在")
user = await task.awaitable_attrs.user
props = await task.awaitable_attrs.props
return ResponseBase(data={
"id": task.id,
"status": task.status,
"type": task.type,
"progress": task.progress,
"error": task.error,
"user_id": str(task.user_id),
"username": user.username if user else None,
"props": props.model_dump() if props else None,
"created_at": task.created_at.isoformat(),
"updated_at": task.updated_at.isoformat(),
})
@admin_task_router.delete(
path='/{task_id}',
summary='删除任务',
description='Delete task by ID',
dependencies=[Depends(admin_required)]
)
async def router_admin_delete_task(
session: SessionDep,
task_id: int,
) -> ResponseBase:
"""
删除任务。
:param session: 数据库会话
:param task_id: 任务ID
:return: 删除结果
"""
task = await Task.get(session, Task.id == task_id)
if not task:
raise HTTPException(status_code=404, detail="任务不存在")
await Task.delete(session, task)
l.info(f"管理员删除了任务: {task_id}")
return ResponseBase(data={"deleted": True})