- proposal/design/tasks и delta-спеки photos, realtime - серверный признак edit_pending, бесшовная подмена предпросмотра, мгновенный сброс
4.7 KiB
4.7 KiB
Tasks
1. Бэкенд: признак edit_pending в модели и запросах
- 1.1 Добавить
EditPending boolвmodels.Photo(JSON-тегedit_pending, поле присутствует всегда) иEXISTS (SELECT 1 FROM edit_jobs ej WHERE ej.photo_id = p.id)в общие списки колонок фото для Postgres (photoColumns) и SQLite (sqlitePhotoColumns); обновить сканирование поля в функциях чтения фото и корзины. Проверка:cd backend && go build -tags nodynamic ./...иgo test ./internal/photos/проходят. - 1.2 Покрыть контрактными тестами оба диалекта: после
EnqueueEditJobфото изGetByIDиListимеетEditPending=true, послеCompleteEditJobиDeleteEditJob—false. Проверка:cd backend && go test ./internal/repo/ -v; сTEST_DATABASE_URLтот же набор проходит и на Postgres. - 1.3 Добавить e2e-проверку жизненного цикла:
EditPhotoвозвращаетedit_pending=true(в том числе при повторной правке, когда старый рендер ещё привязан),Worker.ProcessOnce—falseвместе с URL отредактированных вариантов,ResetEdit—falseбез URL. Проверка:cd backend && go test ./internal/e2e/ -run 'Edit' -v.
2. Фронтенд: выбор источника изображения по состоянию
- 2.1 Добавить
edit_pending?: booleanв типPhoto(frontend/src/lib/types.ts). Проверка:cd frontend && npm run check. - 2.2 Вынести выбор источника в чистый модуль (
frontend/src/lib/viewer-source.ts): вход — локальные и сохранённые параметры,edit_pending, режим зума, URL вариантов; выход — показывать базовую или серверную версию, нужен ли canvas, какой URL грузить. Покрыть сценариями спеки: локальные правки, пустые локальные правки (сброс),edit_pending=trueпри старом рендере, готовый рендер, отсутствие поля (старый бэкенд =false). Проверка:cd frontend && npm run test -- viewer-source. - 2.3 Подключить модуль в
Viewer.svelte: canvas держится до предзагрузки иdecode()нового изображения (устаревшие предзагрузки отменяются), показ строится от актуальногоcurrent, аfreshстановится фолбэком с защитой от устаревших ответов. Проверка:cd frontend && npm run check && npm run test. - 2.4 Перевести индикатор «Рендерим правки на сервере…» в
PhotoEditPanel.svelteнаphoto.edit_pendingвместоhasEdits && !photo.edit_preview_url. Проверка:cd frontend && npm run check.
3. Интеграционная проверка
- 3.1 Сквозной сценарий на собранном приложении (
make build): правка с зумом не показывает оригинал между предпросмотром и серверной версией; сброс возвратом ползунков в значения по умолчанию сразу показывает исходный вид, не дожидаясь 10 секунд. Проверка: автопрогон в chromium 156 (headless + CDP) на собранном бинарнике: 189 замеров состояния — 0 нарушений инварианта «без canvas только серверная версия», 34 кадра подмены — оригинала нет ни на одном, после сброса через 80 мс показан оригинал (canvas снят, temp=0), серверный сброс доехал после debounce. Результат зафиксирован в отчёте об изменении. - 3.2 Полный набор проверок:
make test,cd frontend && npm run test && npm run check,openspec validate fix-edit-preview-handoff --strict. Проверка: все команды завершаются успешно.
Workflow follow-up
- Заархивировать изменение после проверки и обновления основного отчёта об изменениях.