Large albums opened slowly and flickered; the default album cover was also lost in the media-objects refactor. Large-album loading: - quantize signed object URLs within a window and send Cache-Control so previews are reused instead of re-fetched - publish photo.updated (not photo.created) when variants are ready, so clients update in place without reordering the grid - worker concurrency + newest-first variant priority; raise default batch Album cover: - first uploaded photo becomes the cover when none is set - clear the cover when the cover photo is trashed or moved out - "set as album cover" in the photo context menu and actions panel OpenSpec changes: fix-large-album-load, fix-album-cover
3.9 KiB
3.9 KiB
Tasks
1. Стабильные подписанные URL и кэширование объектов
- 1.1 Добавить параметр окна подписи (
OBJECT_URL_SIGN_WINDOW, по умолчанию 10m) вinternal/config/config.goи квантовать срок вSigner.URL(exp = now.Truncate(window) + ttl); проверитьcd backend && go test ./internal/storage/— новый тест подтверждает, что URL совпадает в пределах окна и меняется за его границей - 1.2 Выставить
Cache-Controlдля ответов объектов вinternal/app/app.go(serveObject), используя параметр срока свежести; проверитьcd backend && go test ./internal/app/— тест утверждает наличие заголовка в ответе - 1.3 Задокументировать новые переменные окружения в
.env.exampleи проверить, что описанные значения совпадают с дефолтами вconfig.go
2. Семантика событий готовности вариантов
- 2.1 Переключить уведомление worker'а на
photo.updatedвinternal/photos/worker.go(notify), оставивphoto.createdтолько для реального появления фото; проверить тестом с подпиской на hub, что после генерации вариантов публикуетсяphoto.updated - 2.2 Добавить
photo.updatedвknownEventsвfrontend/src/lib/sse.ts; проверитьcd frontend && npm run check - 2.3 В
frontend/src/routes/(app)/albums/[id]/+page.svelteсделатьphoto.updatedзаменой только уже присутствующих фото, аphoto.created— по-прежнему добавлением; проверитьnpm run checkи наблюдаемым поведением: событие обновления для отсутствующего фото не добавляет его в сетку
3. Пропускная способность и приоритет очереди вариантов
- 3.1 Добавить
WORKER_CONCURRENCYвinternal/config/config.goи пул параллельной обработки вinternal/photos/worker.go; проверитьcd backend && go test ./internal/photos/— тест подтверждает обработку не менее N заданий за проход при concurrency > 1 - 3.2 Изменить порядок в
ClaimVariantJobs(internal/photos/sqlite_objects.go): свежие задания — по свежести фото (created_at DESC), задания с ошибками (attempts > 0) — поnext_attempt_at, сохраняя backoff; проверить тестом на порядок выдачи - 3.3 Задокументировать
WORKER_CONCURRENCYи пороги очереди в.env.example; проверить соответствие дефолтовconfig.go
4. Интеграционная проверка
- 4.1 Собрать (
make build), запустить и открыть существующий большой альбом (seed-1791714157-0 #2): первый экран заполняется превью первыми, сетка не перетасовывается при доготовке вариантов; подтвердить повторным открытием без перекачки неизменившихся превью (Network) - 4.2 Прогнать полный набор:
cd backend && go test ./...иcd frontend && npm run check— оба зелёные; замерить рост пропускной способности по убываниюvariant_jobs