refactor: extract admin business logic to services, introduce job queue, add derived index helpers

- Move DB operations from routes/admin.py to services/admin.py (get_logs_context, query_summary_statuses, retry_failed, delete/reset operations)
- Add services/jobs.py with Job/JobEvent-based async job queue (create_job, run_job, enqueue_job)
- Add services/derived.py with FTS5 reindex and paper index deletion helpers
- Refactor scheduler to use job queue instead of direct pipeline calls
- Add heartbeat_at/expires_at to TaskLock for lock health tracking
- Remove DESIGN_REVIEW.md
- Update tests: remove redundant integration tests, add unit tests for new services
This commit is contained in:
2026-06-13 18:31:43 +08:00
parent 21f16e6756
commit 743d69efd0
20 changed files with 1391 additions and 1063 deletions
+10 -4
View File
@@ -11,8 +11,7 @@ from zoneinfo import ZoneInfo
from app.config import settings
from app.database import SessionLocal
from app.services.pipeline import run_pipeline
from app.services.crawler import refresh_upvotes
from app.services.jobs import create_job, run_job
from app.utils import today_str
logger = logging.getLogger(__name__)
@@ -112,7 +111,13 @@ async def _daily_pipeline() -> None:
db: Session = SessionLocal()
try:
await run_pipeline(db, today, owner="daily_pipeline")
job = create_job(
db,
"pipeline_daily",
owner="daily_pipeline",
payload={"target_date": today},
)
await run_job(db, job.id)
except RuntimeError:
logger.warning("Daily pipeline already running for %s, skipping", today)
except Exception:
@@ -125,7 +130,8 @@ async def _upvote_refresh() -> None:
"""刷新最近 N 天论文的 upvotes。"""
db: Session = SessionLocal()
try:
result = await refresh_upvotes(db)
job = create_job(db, "refresh_upvotes", owner="upvote_refresh", payload={})
result = await run_job(db, job.id)
logger.info(
"Upvote refresh completed: status=%s updated=%d",
result.get("status"),