72 lines
2.4 KiB
Python
72 lines
2.4 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
Worker 查询 API(需要登录)。
|
||
"""
|
||
from rest_framework import status
|
||
from rest_framework.decorators import api_view, permission_classes
|
||
from rest_framework.permissions import AllowAny
|
||
|
||
from server.core.response import api_success, api_error
|
||
from server.core.worker_manager import worker_manager
|
||
|
||
|
||
@api_view(["GET"])
|
||
@permission_classes([AllowAny])
|
||
def health_check(request):
|
||
"""健康检查。"""
|
||
online = len([w for w in worker_manager.get_all_workers() if w.online])
|
||
return api_success({"status": "ok", "workers_online": online})
|
||
|
||
|
||
def _worker_to_dict(w) -> dict:
|
||
return {
|
||
"worker_id": w.worker_id,
|
||
"worker_name": w.worker_name,
|
||
"browsers": [b.model_dump() for b in w.browsers],
|
||
"online": w.online,
|
||
"current_task_id": w.current_task_id,
|
||
}
|
||
|
||
|
||
@api_view(["GET"])
|
||
def worker_list(request):
|
||
"""获取所有已注册的 Worker(含在线状态与浏览器列表)。"""
|
||
workers = worker_manager.get_all_workers()
|
||
return api_success([_worker_to_dict(w) for w in workers])
|
||
|
||
|
||
@api_view(["GET"])
|
||
def worker_detail(request, worker_id):
|
||
"""获取指定 Worker 的详情。"""
|
||
w = worker_manager.get_worker(worker_id)
|
||
if not w:
|
||
return api_error(status.HTTP_404_NOT_FOUND, f"Worker {worker_id} 不存在")
|
||
return api_success(_worker_to_dict(w))
|
||
|
||
|
||
def _worker_browsers_response(worker_id: str):
|
||
"""根据 worker_id 返回比特浏览器环境列表。"""
|
||
w = worker_manager.get_worker(worker_id)
|
||
if not w:
|
||
return api_error(status.HTTP_404_NOT_FOUND, f"Worker {worker_id} 不存在", data=None)
|
||
browsers = [
|
||
{"id": b.id, "name": b.name or "", "remark": b.remark or ""}
|
||
for b in w.browsers
|
||
]
|
||
return api_success(data=browsers, msg="获取成功")
|
||
|
||
|
||
@api_view(["POST"])
|
||
def worker_browsers(request):
|
||
"""获取指定电脑(Worker)中比特浏览器的环境名称列表。worker_id 从 form-data 传入。"""
|
||
worker_id = request.data.get("worker_id") or request.POST.get("worker_id")
|
||
if not worker_id:
|
||
return api_error(status.HTTP_400_BAD_REQUEST, "请提供 worker_id 参数", data=None)
|
||
return _worker_browsers_response(str(worker_id))
|
||
|
||
|
||
@api_view(["GET"])
|
||
def worker_browsers_by_path(request, worker_id):
|
||
"""获取指定电脑(Worker)中比特浏览器的环境名称列表。worker_id 在路径中。"""
|
||
return _worker_browsers_response(worker_id)
|