arch/html-embed: вынести повторяющийся admin-gate strip (7 call-site) в один тестируемый хелпер #90

Closed
opened 2026-06-21 02:33:14 +03:00 by Ghost · 0 comments

Найдено в multi-aspect code review (грань: architecture, forward-looking, не блокирует мерж).

Область: Серверный admin-gate htmlEmbed: collaboration.handler.ts, persistence.extension.ts, page.service.ts ×2, share.service.ts, import.service.ts, file-import-task.service.ts, transclusion.service.ts

Наблюдение
Security-критичная фича обеспечивается одним четырёхшаговым ритуалом (резолв роли актора → isHtmlEmbedFeatureEnabled((await workspaceRepo.findById(workspaceId))?.settings)htmlEmbedAllowed AND → stripHtmlEmbedNodes), реплицированным по 7 call-site. Тесты пинят это хрупкими regex по тексту исходника.

Значимость
Forward-looking, не блокирует мерж: все 7 путей применяют гейт корректно. Риск — регрессия-по-упущению при добавлении нового write-пути.

Опции

  • Option 1 (small): хелпер stripHtmlEmbedIfNotAllowed(json, {featureEnabled, role, onStrip?}) (has-check + AND + strip + опц. лог-callback); каждый call-site сохраняет собственный резолв настроек/роли. Pros: убирает самый ошибкоопасный повтор, заменяет хрупкие regex реальной юнит-тестируемой функцией. Cons: call-site всё ещё дублируют резолв роли/настроек.
  • Option 2 (medium): полноценный HtmlEmbedGate-сервис, читающий настройки внутри. Pros: единая точка. Cons: прячет легитимно различающийся резолв роли (share=null vs write=actor role).
  • Option 3 (small): статус-кво.

Рекомендация
Option 1 — соразмерно изменению; заменяет хрупкий source-pin реальной функцией, не загоняя различия резолва роли в общий код.

Связанные: #27

Найдено в multi-aspect code review (грань: architecture, forward-looking, не блокирует мерж). **Область:** Серверный admin-gate htmlEmbed: collaboration.handler.ts, persistence.extension.ts, page.service.ts ×2, share.service.ts, import.service.ts, file-import-task.service.ts, transclusion.service.ts **Наблюдение** Security-критичная фича обеспечивается одним четырёхшаговым ритуалом (резолв роли актора → `isHtmlEmbedFeatureEnabled((await workspaceRepo.findById(workspaceId))?.settings)` → `htmlEmbedAllowed` AND → `stripHtmlEmbedNodes`), реплицированным по 7 call-site. Тесты пинят это хрупкими regex по тексту исходника. **Значимость** Forward-looking, не блокирует мерж: все 7 путей применяют гейт корректно. Риск — регрессия-по-упущению при добавлении нового write-пути. **Опции** - *Option 1 (small)*: хелпер `stripHtmlEmbedIfNotAllowed(json, {featureEnabled, role, onStrip?})` (has-check + AND + strip + опц. лог-callback); каждый call-site сохраняет собственный резолв настроек/роли. Pros: убирает самый ошибкоопасный повтор, заменяет хрупкие regex реальной юнит-тестируемой функцией. Cons: call-site всё ещё дублируют резолв роли/настроек. - *Option 2 (medium)*: полноценный HtmlEmbedGate-сервис, читающий настройки внутри. Pros: единая точка. Cons: прячет легитимно различающийся резолв роли (share=null vs write=actor role). - *Option 3 (small)*: статус-кво. **Рекомендация** Option 1 — соразмерно изменению; заменяет хрупкий source-pin реальной функцией, не загоняя различия резолва роли в общий код. **Связанные:** #27
Ghost closed this issue 2026-06-21 14:10:36 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#90