Files
ds-galo/openspec/changes/fix-edit-preview-handoff/tasks.md
T
iu 1c29f5d961 docs(openspec): изменение fix-edit-preview-handoff
- proposal/design/tasks и delta-спеки photos, realtime
- серверный признак edit_pending, бесшовная подмена предпросмотра, мгновенный сброс
2026-10-25 10:02:04 +03:00

4.7 KiB
Raw Blame History

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

  • Заархивировать изменение после проверки и обновления основного отчёта об изменениях.