Files
avandClaude Opus 4.8 bb245a90a3 Веб-UI: обзор жизненного цикла в карточке загрузки
Карточка списка на главной теперь даёт краткий обзор «от загрузки до
решения об удалении»: метка «ID:» перед идентификатором, дата добавления
(абсолютная + относительная, всегда), размер раздачи и рейтинг отдачи.
Спойлер контекста убран — контекст смотрят на /download/{id}.

Данные:
- рейтинг и общий размер — из живого снимка воркера (qbt total_size →
  worker.Live.TotalSize); размер доступен для любой раздачи в снимке;
- размер-фолбэк, когда торрента нет в qBittorrent (orphaned) — сумма
  размеров разложенных файлов: новая колонка file_link.size, layouter
  пишет размер при линковке, ридер LayoutSizeByDownload суммирует по
  странице одним запросом (дедуп по dst_path);
- дата — source_added_at → фолбэк created_at, показ в TZ сервера.

handleIndex читает снимок для всех карточек (map-lookup), рейтинг/размер
статичны на рендере (без поллинга). Миграция 0007, ER-схема обновлена.
Change download-card-lifecycle-overview влит в спеки и заархивирован.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 10:34:45 +03:00

3.6 KiB

1. Живой размер раздачи (снимок)

  • 1.1 internal/qbt: добавить поле TotalSize int64 \json:"total_size"`вTorrent`
  • 1.2 internal/worker: добавить TotalSize int64 в Live, пробросить в liveFrom
  • 1.3 internal/worker/live_test.go: покрыть проброс TotalSize в снимок

2. Размер разложенных файлов (БД)

  • 2.1 Goose-миграция internal/store/migrations: ALTER TABLE file_link ADD COLUMN size INTEGER NOT NULL DEFAULT 0 (+ down)
  • 2.2 internal/store: писать size при вставке file_link (layouter передаёт размер файла, известный на момент линковки)
  • 2.3 internal/store: метод чтения суммарного размера разложенных файлов по id загрузок (батч по странице, как attachInfohashes)
  • 2.4 internal/layout (или вызывающий раскладку): передать размер файла (os.Stat/qbt.File.Size) в запись file_link
  • 2.5 Тест: запись file_link.size при линковке и copy-fallback; SUM(size) по загрузке
  • 2.6 Обновить ER-схему docs/specs/database.md (колонка file_link.size)

3. View-model и форматтеры (httpapi)

  • 3.1 downloadView: добавить поля Added, AddedAgo, Size, Ratio (строки для шаблона); убрать зависимость карточки от Context
  • 3.2 Форматтер даты добавления: абсолют 2006-01-02 в TZ Europe/Moscow, базис source_added_at → фолбэк created_at
  • 3.3 Форматтер относительной давности («N дней/часов назад») от now в TZ сервера
  • 3.4 toView/сборка карточки: размер (снимок TotalSize → фолбэк SUM(file_link.size) → «—»), рейтинг (fmtRatio из снимка → «—»), переиспользовать fmtBytes
  • 3.5 handleIndex: читать liveFor(d) для всех карточек страницы, а не только downloading; прокинуть суммарные размеры файлов в сборку карточек
  • 3.6 Тесты httpapi: дата (с фолбэком на created_at), размер (снимок и фолбэк по файлам, и «—»), рейтинг («—» без снимка)

4. Шаблон карточки

  • 4.1 web/templates/index.html: удалить спойлер контекста из карточки
  • 4.2 web/templates/index.html: метка ID: перед идентификатором (кнопка копирования копирует download.id)
  • 4.3 web/templates/index.html: мета-строка карточки (дата · размер · рейтинг), при необходимости вынести в партиал
  • 4.4 Проверить деградацию: значения «—» когда данных нет, вёрстка не ломается

5. Проверка

  • 5.1 task lint и task test зелёные
  • 5.2 Ручная проверка карточек в разных состояниях (downloading / done+сидирование / orphaned) — дата, размер, рейтинг отображаются корректно
  • 5.3 openspec validate download-card-lifecycle-overview --strict
  • 5.4 Ревью кода перед archive (второй чекпоинт)