"""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