refactor(admin): extract _check_token into shared AdminTokenAuth dep #133

Merged
lekss361 merged 1 commit from refactor/admin-token-dependency-128 into main 2026-05-14 20:45:45 +00:00
lekss361 commented 2026-05-14 20:40:01 +00:00 (Migrated from github.com)

Summary

Per audit batch #127 P2 hygiene: identical `_check_token` в 3 admin файлах. Extract в shared FastAPI dependency.

Change

New: `backend/app/core/deps.py`

```python
def verify_admin_token(x_admin_token: Annotated[str | None, Header(...)] = None) -> None:
# 503 if env missing, 401 if mismatch
...

AdminTokenAuth = Annotated[None, Depends(verify_admin_token)]
```

Replaced in 27 endpoints

  • admin_scrape.py: 18 endpoints
  • admin_leads.py: 6 endpoints
  • admin_jobs.py: 3 endpoints

Removed local `_check_token` defs + cleaned unused imports.

Semantics preserved

Все 3 original — identical (503 + 401, same header, same env). Only change: unified 503 detail text (cosmetic — клиент не парсит detail).

Checks

  • ruff clean
  • 64/64 admin tests passing

Vault

`code/patterns/Pattern_Admin_Token_Dependency_May14.md`

Closes #128
Refs: #127

## Summary Per audit batch #127 P2 hygiene: identical \`_check_token\` в 3 admin файлах. Extract в shared FastAPI dependency. ## Change ### New: \`backend/app/core/deps.py\` \`\`\`python def verify_admin_token(x_admin_token: Annotated[str | None, Header(...)] = None) -> None: # 503 if env missing, 401 if mismatch ... AdminTokenAuth = Annotated[None, Depends(verify_admin_token)] \`\`\` ### Replaced in 27 endpoints - admin_scrape.py: 18 endpoints - admin_leads.py: 6 endpoints - admin_jobs.py: 3 endpoints Removed local \`_check_token\` defs + cleaned unused imports. ## Semantics preserved Все 3 original — identical (503 + 401, same header, same env). Only change: unified 503 detail text (cosmetic — клиент не парсит detail). ## Checks - ruff clean - 64/64 admin tests passing ## Vault \`code/patterns/Pattern_Admin_Token_Dependency_May14.md\` Closes #128 Refs: #127
lekss361 commented 2026-05-14 20:45:27 +00:00 (Migrated from github.com)

Bot review (SHA f8023a1, CI )

Чистый refactor: identical _check_token в 3 файлах → shared FastAPI dependency. Анализ:

Pattern Annotated[None, Depends(...)] — идиоматический FastAPI 0.95+; типовой alias AdminTokenAuth удобно переиспользуется в 27 endpoints
Сохранены 503/401 семантика + header alias X-Admin-Token — клиенты не сломаются
Удалены локальные _check_token + cleaned unused imports (Header убран где больше не нужен, HTTPException оставлен где используется для других целей)
Pre-existing HTTPException для objective_api_key в admin_scrape.py:543 — оставлен, не связан с token check
64/64 admin tests passing per PR body; CI green

Минор (НЕ блокер — fix в follow-up или ignore)

Грамматическая опечатка в docstring trigger_objective_sync_our (admin_scrape.py):

-    Полезно когда нужно расширить покрытие за пределы Антоновского ЕКБ
+    Полезно когда нужно расширить покрытие за пределов Антоновского ЕКБ

После «расширить за» правильный падеж — пределы (винительный), не пределов (родительный). Косметика, видимо случайно затронуто во время refactor'а. Cosmetic-only, не влияет на runtime.

approve merge

## Bot review (SHA `f8023a1`, CI ✅) Чистый refactor: identical `_check_token` в 3 файлах → shared FastAPI dependency. Анализ: ✅ **Pattern `Annotated[None, Depends(...)]`** — идиоматический FastAPI 0.95+; типовой alias `AdminTokenAuth` удобно переиспользуется в 27 endpoints ✅ **Сохранены 503/401 семантика + header alias `X-Admin-Token`** — клиенты не сломаются ✅ **Удалены локальные `_check_token`** + cleaned unused imports (`Header` убран где больше не нужен, `HTTPException` оставлен где используется для других целей) ✅ Pre-existing `HTTPException` для `objective_api_key` в `admin_scrape.py:543` — оставлен, не связан с token check ✅ 64/64 admin tests passing per PR body; CI green ### Минор (НЕ блокер — fix в follow-up или ignore) Грамматическая опечатка в docstring `trigger_objective_sync_our` (`admin_scrape.py`): ```diff - Полезно когда нужно расширить покрытие за пределы Антоновского ЕКБ + Полезно когда нужно расширить покрытие за пределов Антоновского ЕКБ ``` После «расширить за» правильный падеж — *пределы* (винительный), не *пределов* (родительный). Косметика, видимо случайно затронуто во время refactor'а. Cosmetic-only, не влияет на runtime. approve merge
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#133
No description provided.