[page-templates] Refresh эмбеда не обновляет контент (lag коллаб-персиста) + нужна матрица веб-тестов #40

Closed
opened 2026-06-20 20:49:59 +03:00 by Ghost · 0 comments

Кнопка Refresh на узле page-embed работает криво: после редактирования исходной страницы эмбед не обновляется даже после нажатия кнопки.

Что выяснено при проверке

  • Серверная часть POST /api/pages/template/lookup отдаёт актуальный контент, если он сохранён в БД. Проверено: меняю pages.content исходной страницы через REST → следующий lookup сразу возвращает новый контент. То есть сервер читает живой pages.content.
  • Клиентский refresh-путь по коду корректен: refresh() (page-embed-lookup-context.tsx:110) чистит resultCacheRef + inFlightRef, ставит waiter и enqueue; flush() (строка 41) перезапрашивает и пушит результат подписчикам (set(r)).

Главная гипотеза причины

Реальный сценарий — правка источника в живом редакторе (collab/Yjs), а не через REST. Правки уходят в Yjs-документ и попадают в pages.content только после debounced-персиста коллаба. template/lookup читает столбец pages.content, поэтому:

  • эмбед показывает старый контент, пока коллаб не сбросил изменения в БД;
  • Refresh не помогает, потому что у самого сервера ещё нет нового контента.

Итог для пользователя: «жму Refresh — не меняется».

Направление фикса (обсуждаемо):

  • либо lookup для источника берёт живой Yjs-стейт (через коллаб-сервис), а не только персистнутый pages.content;
  • либо Refresh принудительно триггерит flush/persist исходной страницы перед перечитыванием;
  • как минимум — явно отразить задержку (индикатор «обновляется…», «последняя синхронизация …») и не создавать впечатление, что кнопка не работает.

Дополнительно проверить клиент: точно ли узел контента (page-embed-content.tsx) ре-рендерится на НОВЫЙ контент, а не мемоизируется по sourcePageId (если контент тот же объект/ключ — обновление не отрисуется).

Нужно много и вдумчиво тестировать в вебе

Этот узел завязан на коллаб, кэш, кэш-бастинг, вложенность и права — нужен прогон матрицы сценариев вручную в браузере:

  1. Правка источника в живом редакторе → Refresh на эмбеде (с/без сохранения, сразу/через паузу).
  2. Правка источника через REST/другую вкладку → Refresh.
  3. Несколько эмбедов одного источника на одной странице — обновляются ли все.
  4. Эмбед в эмбеде (вложенность) + лимит глубины PAGE_EMBED_MAX_DEPTH.
  5. Цикл (страница встраивает себя/предка) — guard isCycle не должен зацикливать.
  6. Снять флаг template с источника — что с уже вставленными эмбедами.
  7. Удалить/в корзину исходную страницу — состояние эмбеда (ошибка, плейсхолдер).
  8. Нет прав на источник у читателя — эмбед не должен утекать контент.
  9. Публичная шара со страницей, содержащей эмбед — что отдаётся анонимусу.
  10. Два пользователя одновременно: один правит источник, другой смотрит эмбед.
  11. Read-only режим — Refresh скрыт, контент корректен.
  12. Большой контент / медиа / вложенные узлы внутри шаблона.

Файлы

  • apps/client/src/features/editor/components/page-embed/page-embed-lookup-context.tsx (кэш/refresh/flush)
  • apps/client/src/features/editor/components/page-embed/page-embed-view.tsx (handleRefresh)
  • apps/client/src/features/editor/components/page-embed/page-embed-content.tsx (ре-рендер контента)
  • сервер: apps/server/src/core/page/transclusion/ (page-template.controller.ts, transclusion.service.ts) — источник контента для lookup, связь с коллабом

Замечено при ручной проверке ветки feat/page-templates (PR #17). Связано с #38, #39.

Кнопка Refresh на узле page-embed работает криво: после редактирования исходной страницы эмбед **не обновляется даже после нажатия кнопки**. ## Что выяснено при проверке - **Серверная часть `POST /api/pages/template/lookup` отдаёт актуальный контент, если он сохранён в БД.** Проверено: меняю `pages.content` исходной страницы через REST → следующий lookup сразу возвращает новый контент. То есть сервер читает живой `pages.content`. - **Клиентский refresh-путь по коду корректен**: `refresh()` (`page-embed-lookup-context.tsx:110`) чистит `resultCacheRef` + `inFlightRef`, ставит waiter и `enqueue`; `flush()` (строка 41) перезапрашивает и пушит результат подписчикам (`set(r)`). ## Главная гипотеза причины Реальный сценарий — правка источника в **живом редакторе (collab/Yjs)**, а не через REST. Правки уходят в Yjs-документ и попадают в `pages.content` только после **debounced-персиста коллаба**. `template/lookup` читает столбец `pages.content`, поэтому: - эмбед показывает старый контент, пока коллаб не сбросил изменения в БД; - Refresh не помогает, потому что у самого сервера ещё нет нового контента. Итог для пользователя: «жму Refresh — не меняется». **Направление фикса (обсуждаемо):** - либо lookup для источника берёт живой Yjs-стейт (через коллаб-сервис), а не только персистнутый `pages.content`; - либо Refresh принудительно триггерит flush/persist исходной страницы перед перечитыванием; - как минимум — явно отразить задержку (индикатор «обновляется…», «последняя синхронизация …») и не создавать впечатление, что кнопка не работает. Дополнительно проверить клиент: точно ли узел контента (`page-embed-content.tsx`) ре-рендерится на НОВЫЙ контент, а не мемоизируется по `sourcePageId` (если контент тот же объект/ключ — обновление не отрисуется). ## Нужно много и вдумчиво тестировать в вебе Этот узел завязан на коллаб, кэш, кэш-бастинг, вложенность и права — нужен прогон матрицы сценариев вручную в браузере: 1. Правка источника в живом редакторе → Refresh на эмбеде (с/без сохранения, сразу/через паузу). 2. Правка источника через REST/другую вкладку → Refresh. 3. Несколько эмбедов одного источника на одной странице — обновляются ли все. 4. Эмбед в эмбеде (вложенность) + лимит глубины `PAGE_EMBED_MAX_DEPTH`. 5. Цикл (страница встраивает себя/предка) — guard `isCycle` не должен зацикливать. 6. Снять флаг template с источника — что с уже вставленными эмбедами. 7. Удалить/в корзину исходную страницу — состояние эмбеда (ошибка, плейсхолдер). 8. Нет прав на источник у читателя — эмбед не должен утекать контент. 9. Публичная шара со страницей, содержащей эмбед — что отдаётся анонимусу. 10. Два пользователя одновременно: один правит источник, другой смотрит эмбед. 11. Read-only режим — Refresh скрыт, контент корректен. 12. Большой контент / медиа / вложенные узлы внутри шаблона. ## Файлы - `apps/client/src/features/editor/components/page-embed/page-embed-lookup-context.tsx` (кэш/refresh/flush) - `apps/client/src/features/editor/components/page-embed/page-embed-view.tsx` (`handleRefresh`) - `apps/client/src/features/editor/components/page-embed/page-embed-content.tsx` (ре-рендер контента) - сервер: `apps/server/src/core/page/transclusion/` (`page-template.controller.ts`, `transclusion.service.ts`) — источник контента для lookup, связь с коллабом > Замечено при ручной проверке ветки `feat/page-templates` (PR #17). Связано с #38, #39.
Ghost closed this issue 2026-06-21 02:05:25 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#40