refactor(routes): delete 5 dead endpoints the frontend never calls (E3 S3, B-core-8)
None are referenced by the SPA or tests; the Scheduler dashboard's "run now"
covers every manual trigger. Removed: POST /api/sync/{rss,backfill,enrich}
(+ the now-dead _user_channels helper and three sync.runner imports),
POST /api/tags/recompute (+ its admin_user / run_autotag_all imports), and
GET /auth/me (a lesser duplicate of the canonical /api/me in routes/me.py).
This also retires a latent bug: POST /api/sync/backfill reset backfill_done /
backfill_cursor on already-fully-backfilled channels (tipping them back to
"needs full history") for up to 25 channels per curl. Full lane 365 pass.
This commit is contained in:
@@ -972,17 +972,6 @@ async def upgrade(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@router.get("/me")
|
|
||||||
async def me(user: User = Depends(current_user)) -> dict:
|
|
||||||
return {
|
|
||||||
"id": user.id,
|
|
||||||
"email": user.email,
|
|
||||||
"display_name": user.display_name,
|
|
||||||
"avatar_url": user.avatar_url,
|
|
||||||
"role": user.role,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/config")
|
@router.get("/config")
|
||||||
def auth_config(db: Session = Depends(get_db)) -> dict:
|
def auth_config(db: Session = Depends(get_db)) -> dict:
|
||||||
"""Public: which sign-in options this instance offers, so the login page can hide what's off
|
"""Public: which sign-in options this instance offers, so the login page can hide what's off
|
||||||
|
|||||||
@@ -7,30 +7,13 @@ from app.audit import AuditAction
|
|||||||
from app.auth import admin_user, current_user, has_read_scope, require_human
|
from app.auth import admin_user, current_user, has_read_scope, require_human
|
||||||
from app.db import get_db
|
from app.db import get_db
|
||||||
from app.models import Channel, Subscription, User, Video
|
from app.models import Channel, Subscription, User, Video
|
||||||
from app.sync.runner import (
|
from app.sync.runner import estimate_deep_backfill
|
||||||
estimate_deep_backfill,
|
|
||||||
run_enrich,
|
|
||||||
run_recent_backfill,
|
|
||||||
run_rss_poll,
|
|
||||||
)
|
|
||||||
from app.sync.subscriptions import import_subscriptions
|
from app.sync.subscriptions import import_subscriptions
|
||||||
from app.scheduler import running_job_ids
|
from app.scheduler import running_job_ids
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/sync", tags=["sync"])
|
router = APIRouter(prefix="/api/sync", tags=["sync"])
|
||||||
|
|
||||||
|
|
||||||
def _user_channels(db: Session, user: User) -> list[Channel]:
|
|
||||||
return (
|
|
||||||
db.execute(
|
|
||||||
select(Channel)
|
|
||||||
.join(Subscription, Subscription.channel_id == Channel.id)
|
|
||||||
.where(Subscription.user_id == user.id)
|
|
||||||
)
|
|
||||||
.scalars()
|
|
||||||
.all()
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@router.post("/subscriptions")
|
@router.post("/subscriptions")
|
||||||
def sync_subscriptions(
|
def sync_subscriptions(
|
||||||
user: User = Depends(require_human), db: Session = Depends(get_db)
|
user: User = Depends(require_human), db: Session = Depends(get_db)
|
||||||
@@ -48,38 +31,6 @@ def sync_subscriptions(
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
@router.post("/rss")
|
|
||||||
def sync_rss(
|
|
||||||
user: User = Depends(require_human), db: Session = Depends(get_db)
|
|
||||||
) -> dict:
|
|
||||||
# A partial failure comes back in `failed_feeds` so a manual poll reports it instead of an
|
|
||||||
# innocent-looking "0 new"; a TOTAL outage raises out of run_rss_poll and surfaces as a 500,
|
|
||||||
# which is the honest answer for a poll that reached nothing.
|
|
||||||
result = run_rss_poll(db, _user_channels(db, user))
|
|
||||||
return {"new_videos": result["new"], "failed_feeds": result["failed"]}
|
|
||||||
|
|
||||||
|
|
||||||
@router.post("/backfill")
|
|
||||||
def sync_backfill(
|
|
||||||
user: User = Depends(require_human),
|
|
||||||
db: Session = Depends(get_db),
|
|
||||||
max_channels: int = 25,
|
|
||||||
) -> dict:
|
|
||||||
with quota.measured(db, user.id, quota.QuotaAction.VIDEOS_BACKFILL_RECENT) as m:
|
|
||||||
result = run_recent_backfill(db, _user_channels(db, user), max_channels=max_channels)
|
|
||||||
result["quota_used_estimate"] = m.used
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
@router.post("/enrich")
|
|
||||||
def sync_enrich(
|
|
||||||
user: User = Depends(require_human), db: Session = Depends(get_db)
|
|
||||||
) -> dict:
|
|
||||||
with quota.measured(db, user.id, quota.QuotaAction.VIDEOS_ENRICH) as m:
|
|
||||||
enriched = run_enrich(db)
|
|
||||||
return {"enriched": enriched, "quota_used_estimate": m.used}
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/status")
|
@router.get("/status")
|
||||||
def sync_status(
|
def sync_status(
|
||||||
user: User = Depends(current_user), db: Session = Depends(get_db)
|
user: User = Depends(current_user), db: Session = Depends(get_db)
|
||||||
|
|||||||
@@ -4,11 +4,10 @@ from sqlalchemy import func, or_, select
|
|||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
|
|
||||||
from app.auth import admin_user, current_user
|
from app.auth import current_user
|
||||||
from app.db import get_db
|
from app.db import get_db
|
||||||
from app.models import ChannelTag, Tag, User
|
from app.models import ChannelTag, Tag, User
|
||||||
from app.routes._common import owned_or_404
|
from app.routes._common import owned_or_404
|
||||||
from app.sync.autotag import run_autotag_all
|
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/tags", tags=["tags"])
|
router = APIRouter(prefix="/api/tags", tags=["tags"])
|
||||||
|
|
||||||
@@ -113,12 +112,3 @@ def delete_tag(
|
|||||||
db.delete(tag) # ChannelTag rows cascade on tag delete.
|
db.delete(tag) # ChannelTag rows cascade on tag delete.
|
||||||
db.commit()
|
db.commit()
|
||||||
return {"deleted": tag_id}
|
return {"deleted": tag_id}
|
||||||
|
|
||||||
|
|
||||||
@router.post("/recompute")
|
|
||||||
def recompute(
|
|
||||||
_: User = Depends(admin_user),
|
|
||||||
db: Session = Depends(get_db),
|
|
||||||
only_missing: bool = False,
|
|
||||||
) -> dict:
|
|
||||||
return run_autotag_all(db, only_missing=only_missing)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user