From 8c0b74cbf86b936d64af8c03434af3b9c8386bfe Mon Sep 17 00:00:00 2001 From: "Zimin A.N." Date: Mon, 25 May 2026 18:34:20 +0300 Subject: [PATCH] =?UTF-8?q?fix(admin-ui):=20=D0=BD=D0=B5=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=D0=BE=D0=BB=D0=B2=D0=B8=D1=82=D1=8C=20=C2=ABanonymous?= =?UTF-8?q?=C2=BB=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20/admin/users/{sub}/di?= =?UTF-8?q?splay?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backend currentUserId() возвращает литерал "anonymous" когда JWT отсутствует (ORDINIS_AUTH_REQUIRED=false fallback). Audit / draft entries сохраняют этот sub в БД. Frontend UserCell дёргал /admin/users/anonymous/display → 404 → catch → display "—". Логически ок, но в консоли DevTools мусорный 404 на каждом рендере таблицы. Skip endpoint когда uuid === "anonymous": - useResolveUserDisplay: enabled = uuid && uuid !== 'anonymous' - useUserDisplay: short-circuit ветка возвращает display: 'anonymous' UX без изменений (раньше показывал «—» с full UUID в tooltip; теперь показывает «anonymous» без 404 в консоли). --- ordinis-admin-ui/src/lib/useUserDisplay.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ordinis-admin-ui/src/lib/useUserDisplay.tsx b/ordinis-admin-ui/src/lib/useUserDisplay.tsx index 4e3b81f..4115416 100644 --- a/ordinis-admin-ui/src/lib/useUserDisplay.tsx +++ b/ordinis-admin-ui/src/lib/useUserDisplay.tsx @@ -24,7 +24,11 @@ type UserDisplayInfo = { const useResolveUserDisplay = (uuid: string | null | undefined) => useQuery({ queryKey: ['user-display', uuid] as const, - enabled: Boolean(uuid), + // Не дёргаем endpoint для литерала "anonymous" — это не UUID, а маркер + // отсутствия JWT subject (см. backend currentUserId fallback когда + // ORDINIS_AUTH_REQUIRED=false). Резолв даёт 404, в консоли мусор. + // Вместо запроса фронт сам подменит на «anonymous» в useUserDisplay ниже. + enabled: Boolean(uuid) && uuid !== 'anonymous', staleTime: 5 * 60 * 1000, retry: false, queryFn: async (): Promise => { @@ -86,6 +90,12 @@ export function useUserDisplay(uuid: string | null | undefined): { if (!fullId) { return { display: 'anonymous', isMe: false, fullId: '' } } + // "anonymous" — литерал из backend currentUserId() когда нет JWT + // (ORDINIS_AUTH_REQUIRED=false и токен не дошёл). Не UUID, не резолвим + // через /admin/users/{sub}/display — там будет 404, шум в консоли. + if (fullId === 'anonymous') { + return { display: 'anonymous', isMe: false, fullId } + } const currentSub = auth.user?.profile?.sub const isMe = Boolean(currentSub) && currentSub === fullId if (isMe) {