88 lines
3.1 KiB
Python
88 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
BOSS 账号 API(需要登录):
|
||
- POST /api/accounts -> 添加账号(绑定环境名称到电脑)
|
||
- GET /api/accounts -> 查询所有账号(含电脑名称、在线、任务状态)
|
||
- GET /api/accounts/{id} -> 查询单个账号详情
|
||
- DELETE /api/accounts/{id} -> 删除账号
|
||
|
||
检测登录等操作统一通过 POST /api/tasks 提交,task_type 传 check_login 即可。
|
||
"""
|
||
from rest_framework import status
|
||
from rest_framework.decorators import api_view
|
||
|
||
from server.core.response import api_success, api_error
|
||
from server.models import BossAccount
|
||
from server.serializers import BossAccountSerializer, AccountBindSerializer
|
||
from server.core.worker_manager import worker_manager
|
||
|
||
|
||
# ────────────────────────── 内部工具 ──────────────────────────
|
||
|
||
def _enrich(account: BossAccount) -> dict:
|
||
"""为账号实例补充电脑名称和电脑在线状态。"""
|
||
data = BossAccountSerializer(account).data
|
||
w = worker_manager.get_worker(account.worker_id)
|
||
data["worker_name"] = w.worker_name if w else ""
|
||
data["worker_online"] = w.online if w else False
|
||
return data
|
||
|
||
|
||
# ────────────────────────── 接口 ──────────────────────────
|
||
|
||
@api_view(["GET", "POST"])
|
||
def account_list(request):
|
||
"""
|
||
GET -> 查询账号列表(可选 ?worker_id= 过滤)
|
||
POST -> 添加账号(绑定环境名称到电脑)
|
||
"""
|
||
if request.method == "GET":
|
||
worker_id = request.query_params.get("worker_id")
|
||
qs = BossAccount.objects.all().order_by("-updated_at")
|
||
if worker_id:
|
||
qs = qs.filter(worker_id=worker_id)
|
||
return api_success([_enrich(a) for a in qs])
|
||
|
||
# POST: 添加账号
|
||
ser = AccountBindSerializer(data=request.data)
|
||
ser.is_valid(raise_exception=True)
|
||
wid = ser.validated_data["worker_id"]
|
||
bname = ser.validated_data["browser_name"]
|
||
|
||
account, _ = BossAccount.objects.get_or_create(
|
||
worker_id=wid,
|
||
browser_name=bname,
|
||
defaults={
|
||
"browser_id": f"name:{bname}",
|
||
"boss_username": "",
|
||
"is_logged_in": False,
|
||
},
|
||
)
|
||
return api_success(_enrich(account), http_status=status.HTTP_201_CREATED)
|
||
|
||
|
||
@api_view(["GET"])
|
||
def account_list_by_worker(request, worker_id):
|
||
"""按 worker_id 查询账号列表,兼容 /api/accounts/worker-1 形式。"""
|
||
qs = BossAccount.objects.filter(worker_id=worker_id).order_by("-updated_at")
|
||
return api_success([_enrich(a) for a in qs])
|
||
|
||
|
||
@api_view(["GET", "DELETE"])
|
||
def account_detail(request, account_id):
|
||
"""
|
||
GET -> 查询单个账号详情
|
||
DELETE -> 删除账号
|
||
"""
|
||
try:
|
||
account = BossAccount.objects.get(pk=account_id)
|
||
except BossAccount.DoesNotExist:
|
||
return api_error(status.HTTP_404_NOT_FOUND, "账号不存在")
|
||
|
||
if request.method == "GET":
|
||
return api_success(_enrich(account))
|
||
|
||
# DELETE
|
||
account.delete()
|
||
return api_success(msg="账号已删除")
|