Files

54 lines
2.1 KiB
Python

"""Роуты управления загрузками: создание, список, удаление."""
from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException, status
from app.api.deps import get_events, get_queue, get_storage
from app.core.events import EventBus
from app.core.queue import DownloadQueue
from app.core.storage import Storage
from app.models import CreateDownloads, Download, DownloadEvent
router = APIRouter(prefix="/api/downloads", tags=["downloads"])
@router.post("", status_code=status.HTTP_201_CREATED, response_model=list[Download])
async def create_downloads(
payload: CreateDownloads,
storage: Storage = Depends(get_storage),
queue: DownloadQueue = Depends(get_queue),
events: EventBus = Depends(get_events),
) -> list[Download]:
"""Принять ссылки (по одной на строку), создать задачи и поставить в очередь."""
urls = [u.strip() for u in payload.urls if u.strip()]
if not urls:
raise HTTPException(status.HTTP_400_BAD_REQUEST, "Список ссылок пуст")
created: list[Download] = []
for url in urls:
download = Download(url=url)
await storage.create(download)
await queue.add(download.id)
await events.publish(DownloadEvent(type="created", download=download))
created.append(download)
return created
@router.get("", response_model=list[Download])
async def list_downloads(storage: Storage = Depends(get_storage)) -> list[Download]:
"""Список всех загрузок — для гидрации UI при загрузке страницы."""
return await storage.list()
@router.delete("/{download_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_download(
download_id: str,
storage: Storage = Depends(get_storage),
events: EventBus = Depends(get_events),
) -> None:
deleted = await storage.delete(download_id)
if not deleted:
raise HTTPException(status.HTTP_404_NOT_FOUND, "Загрузка не найдена")
await events.publish(DownloadEvent(type="deleted", id=download_id))