[bug][share] Кастомный адрес (/l/:alias) не обновляется при редактировании: Save создаёт дубликат вместо переименования #226
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Симптом
В модалке шаринга, блок «Custom address» (кастомный адрес
/l/:alias): если у страницы уже есть адрес и его редактируют (например, меняют слагte→ted) и жмут Save, отображаемая ссылка не обновляется — продолжает показывать старый адрес.Воспроизведение
te, нажать Save.ted, нажать Save.…/l/te(старая). Ожидалось…/l/ted.Причина
Алиас — строка в таблице
share_aliasesс уникальностью только по паре(workspace_id, alias). Уникального ограничения наpage_idнет (см. миграциюapps/server/src/database/migrations/20260626T130000-share-aliases.ts), поэтому у одной страницы может накопиться несколько строк-алиасов.В
apps/server/src/core/share/share-alias.service.tsметодsetAlias()ищет строку по имени нового слага (findByAliasAndWorkspace). Если имя свободно — просто делаетINSERTновой строки. При редактированииte→tedстарая строка не заменяется, а добавляется вторая. У страницы оказывается две строки:teиted.Отображаемая в модалке ссылка берётся из
getAliasForPage()→ShareAliasRepo.findByPageId(), гдеexecuteTakeFirst()идёт безORDER BY— Postgres возвращает произвольную (на практике — самую старую) строку, т.е. старыйte. Отсюда «ссылка не обновляется».Фронтенд здесь ни при чём:
useSetShareAliasMutationкорректно инвалидирует и перезапрашиваетshare-alias-for-page, но сервер отдаёт старый алиас.Побочный эффект: каждое редактирование плодит «осиротевшие» строки-алиасы, которые навсегда остаются рабочими ссылками
/l/<старое>(никогда не удаляются).Ожидаемое поведение
Инвариант: у страницы ровно один кастомный адрес.
setAlias()должен оставлять страницу с единственной строкой-алиасом, имя которой равно запрошенному:INSERT(как сейчас);ALIAS_REASSIGN_REQUIRED+ retarget по подтверждению (как сейчас);Затронутые файлы
apps/server/src/core/share/share-alias.service.ts—setAlias()(корневая логика).apps/server/src/database/repos/share-alias/share-alias.repo.ts— нет метода переименования строки и очистки дублей;findByPageId()недетерминирован (нетORDER BY).apps/server/src/core/share/share-alias.service.spec.ts,apps/server/src/database/repos/share-alias/share-alias.repo.spec.ts.Связано
Регрессия фичи #205 (кастомные адреса
/l/:alias).Ghost referenced this issue2026-06-28 04:23:39 +03:00