Карточка списка на главной теперь даёт краткий обзор «от загрузки до
решения об удалении»: метка «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>
3.6 KiB
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в TZEurope/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 (второй чекпоинт)