fix: preserve custom cookie input order
This commit is contained in:
@@ -6,7 +6,7 @@ from datetime import datetime, timezone
|
||||
import requests
|
||||
from fastapi import APIRouter, Depends, HTTPException, Query
|
||||
from fastapi.responses import StreamingResponse
|
||||
from sqlalchemy import or_
|
||||
from sqlalchemy import case, or_
|
||||
from sqlalchemy.orm import Session, defer, joinedload
|
||||
import io
|
||||
import csv
|
||||
@@ -41,6 +41,19 @@ def _parse_account_names(raw_names: str) -> list[str]:
|
||||
seen.add(name)
|
||||
return names
|
||||
|
||||
|
||||
def _order_cookie_tasks(query, selected_names: list[str]):
|
||||
"""按自定义账号名的输入顺序排序,未指定时保持默认的最新优先。"""
|
||||
if selected_names:
|
||||
input_order = case(
|
||||
{name: index for index, name in enumerate(selected_names)},
|
||||
value=Account.username,
|
||||
else_=len(selected_names),
|
||||
)
|
||||
return query.order_by(input_order, LoginTask.finished_at.desc(), LoginTask.id.desc())
|
||||
return query.order_by(LoginTask.finished_at.desc(), LoginTask.id.desc())
|
||||
|
||||
|
||||
# 斗鱼 Cookie 有效性检测接口(抓包参考:钱包中心鱼丸余额 + 用户等级详情)
|
||||
CHECK_UA = (
|
||||
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
|
||||
@@ -157,16 +170,18 @@ def list_cookies(
|
||||
)
|
||||
search_text = (search or "").strip()
|
||||
selected_names = _parse_account_names(account_names)
|
||||
can_view_all = user_has_permission(current, "login:view_all")
|
||||
account_joined = not can_view_all
|
||||
if selected_names:
|
||||
query = query.filter(
|
||||
LoginTask.account_id.in_(
|
||||
db.query(Account.id).filter(Account.username.in_(selected_names))
|
||||
)
|
||||
)
|
||||
if not account_joined:
|
||||
query = query.join(Account, LoginTask.account_id == Account.id)
|
||||
account_joined = True
|
||||
query = query.filter(Account.username.in_(selected_names))
|
||||
if search_text:
|
||||
pattern = f"%{search_text}%"
|
||||
if user_has_permission(current, "login:view_all"):
|
||||
if not account_joined:
|
||||
query = query.join(Account, LoginTask.account_id == Account.id)
|
||||
account_joined = True
|
||||
query = query.outerjoin(User, Account.assigned_to == User.id).filter(or_(
|
||||
Account.username.ilike(pattern),
|
||||
User.username.ilike(pattern),
|
||||
@@ -175,7 +190,7 @@ def list_cookies(
|
||||
total = None
|
||||
if page is not None:
|
||||
total = query.order_by(None).count()
|
||||
query = query.order_by(LoginTask.finished_at.desc())
|
||||
query = _order_cookie_tasks(query, selected_names)
|
||||
if page is not None:
|
||||
query = query.offset((page - 1) * page_size).limit(page_size)
|
||||
|
||||
@@ -331,12 +346,10 @@ def export_cookies(
|
||||
query = _visible_cookie_tasks_query(db, current)
|
||||
selected_names = _parse_account_names(account_names)
|
||||
if selected_names:
|
||||
query = query.filter(
|
||||
LoginTask.account_id.in_(
|
||||
db.query(Account.id).filter(Account.username.in_(selected_names))
|
||||
)
|
||||
)
|
||||
tasks = query.order_by(LoginTask.finished_at.desc()).all()
|
||||
if user_has_permission(current, "login:view_all"):
|
||||
query = query.join(Account, LoginTask.account_id == Account.id)
|
||||
query = query.filter(Account.username.in_(selected_names))
|
||||
tasks = _order_cookie_tasks(query, selected_names).all()
|
||||
|
||||
# 批量查账号,避免 N+1
|
||||
account_ids = [t.account_id for t in tasks]
|
||||
|
||||
Reference in New Issue
Block a user