fix(ws): emit PAGE_MOVED only when the row actually changed (RT-26) #64

Closed
opened 2026-06-21 01:56:55 +03:00 by Ghost · 0 comments

Источник: red-team-аудит, RT-26 (docs/red-team-report.md).

Что происходит

movePage (apps/server/src/core/page/page.service.ts:969-1012) эмитит PAGE_MOVED из устаревшего pre-read снапшота даже если строка не изменилась/была удалена параллельно → «призрачный» move рассылается всем клиентам.

Фикс

updatePages уже возвращает numUpdatedRows — эмитить только при реально изменённой строке:

// page.service.ts (movePage) — only broadcast when the row actually changed.
const res = await this.pageRepo.updatePage({ /* position, parentPageId */ }, dto.pageId);
if (!res || res.numUpdatedRows === 0n) return; // concurrent delete/move -> no phantom event

Цена / приоритет

~2 строки.

**Источник:** red-team-аудит, RT-26 (`docs/red-team-report.md`). ### Что происходит `movePage` (`apps/server/src/core/page/page.service.ts:969-1012`) эмитит `PAGE_MOVED` из устаревшего pre-read снапшота даже если строка не изменилась/была удалена параллельно → «призрачный» move рассылается всем клиентам. ### Фикс `updatePages` уже возвращает `numUpdatedRows` — эмитить только при реально изменённой строке: ```ts // page.service.ts (movePage) — only broadcast when the row actually changed. const res = await this.pageRepo.updatePage({ /* position, parentPageId */ }, dto.pageId); if (!res || res.numUpdatedRows === 0n) return; // concurrent delete/move -> no phantom event ``` ### Цена / приоритет ~2 строки.
Ghost added the bug label 2026-06-21 02:27:20 +03:00
Ghost closed this issue 2026-06-21 14:10:29 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#64