gendesign/backend/app/api/v1/admin_jobs.py
lekss361 82217b7edd refactor(security): убрать X-Admin-Token из 5 admin файлов (43 endpoints)
Caddy basic_auth (PR #426) даёт network-level защиту для всего /admin/*.
Двойная auth избыточна для pilot — app-level AdminTokenAuth dep удалён.

Что изменено:
- admin_scrape.py (24 endpoints), admin_cadastre.py (5), admin_jobs.py (3),
  admin_leads.py (6), admin_weight_profiles.py (5): удалён import AdminTokenAuth
  и параметр `_: AdminTokenAuth,` из каждой функции-handler'а
- backend/.env.example: SCRAPE_ADMIN_TOKEN помечен DEPRECATED с инструкцией rollback

Что НЕ менялось:
- core/deps.py: verify_admin_token + AdminTokenAuth остаются (dead code, rollback safety)
- frontend: заголовок X-Admin-Token продолжает слаться, backend игнорирует
- .env.runtime / settings: SCRAPE_ADMIN_TOKEN env var сохранён
2026-05-23 13:29:58 +03:00

73 lines
2.4 KiB
Python

"""Admin API для централизованных настроек Celery-job'ов.
GET /api/v1/admin/jobs/settings — список всех job_settings
GET /api/v1/admin/jobs/settings/{type} — одна строка по job_type
PUT /api/v1/admin/jobs/settings/{type} — PATCH-style update
Auth: gendsgn.ru-wide Caddy basic_auth gate (PR #426). App-level X-Admin-Token
header removed 2026-05-23 — двойная auth избыточна для pilot.
"""
from __future__ import annotations
from typing import Annotated, Any
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from app.core.db import get_db
from app.schemas.job_settings import JobSettingRead, JobSettingUpdate
router = APIRouter()
@router.get("/settings", response_model=list[JobSettingRead])
def list_job_settings(
db: Annotated[Session, Depends(get_db)],
) -> Any:
"""Список всех job_settings (все job_type)."""
from app.services.job_settings import get_all
return get_all(db)
@router.get("/settings/{job_type}", response_model=JobSettingRead)
def get_job_setting(
job_type: str,
db: Annotated[Session, Depends(get_db)],
) -> Any:
"""Настройки одного job_type. Возвращает fallback defaults если строки нет в БД."""
from app.services.job_settings import get_one
return get_one(job_type, db)
@router.put("/settings/{job_type}", response_model=JobSettingRead)
def update_job_setting(
job_type: str,
payload: JobSettingUpdate,
db: Annotated[Session, Depends(get_db)],
) -> Any:
"""PATCH-style update: передавать только изменяемые поля.
После изменения cron_schedule нужен restart beat-контейнера.
Остальные поля (rate_ms, extra_config, enabled) применяются динамически.
cron_schedule='' устанавливает NULL (manual-only режим).
rate_ms=0 устанавливает NULL (no throttle).
"""
from app.services.job_settings import update
result = update(
job_type,
db,
enabled=payload.enabled,
queue_name=payload.queue_name,
cron_schedule=payload.cron_schedule,
rate_ms=payload.rate_ms,
max_retries=payload.max_retries,
max_concurrency=payload.max_concurrency,
extra_config=payload.extra_config,
updated_by="admin-ui",
)
return result