web-ui: добавлена страница группового удаления загрузок

- выбор → поимённое подтверждение → отчёт: пачка до 20 загрузок, гарды входа
  на обеих границах, потолок времени и остановка после трёх подряд отказов
  внешнего сервиса
- допуск полного удаления сведён в единую точку store.State.CanDelete() —
  worker, страница загрузки и Telegram больше не держат своих перечней
This commit is contained in:
av
2026-08-10 17:43:36 +03:00
parent a7c1efd8eb
commit 288be8ec34
35 changed files with 3185 additions and 31 deletions
+17 -1
View File
@@ -20,21 +20,37 @@ type stubReader struct {
sizes map[string]int64 // размеры разложенных файлов по download_id (фолбэк)
getErr error // отказ чтения задачи (не ErrNotFound)
sizesErr error // отказ чтения размеров раскладки
// Для страницы группового удаления: список разрешённых к удалению и
// поштучное чтение по id (страница подтверждения называет каждую поимённо).
deletable []store.Download
deletableErr error
byID map[string]store.Download
}
func (s stubReader) ListDownloads(context.Context) ([]store.Download, error) { return s.list, nil }
func (s stubReader) ListDownloadsPage(context.Context, store.ListFilter) ([]store.Download, int, error) {
return s.list, len(s.list), nil
}
func (s stubReader) GetDownload(context.Context, string) (*store.Download, error) {
func (s stubReader) GetDownload(_ context.Context, id string) (*store.Download, error) {
if s.getErr != nil {
return nil, s.getErr
}
if s.byID != nil {
d, ok := s.byID[id]
if !ok {
return nil, store.ErrNotFound
}
return &d, nil
}
if s.one == nil {
return nil, store.ErrNotFound
}
return s.one, nil
}
func (s stubReader) ListDeletableDownloads(context.Context) ([]store.Download, error) {
return s.deletable, s.deletableErr
}
func (s stubReader) LayoutSizeByDownload(context.Context, []string) (map[string]int64, error) {
if s.sizesErr != nil {
return nil, s.sizesErr