0aaae9cb2b
Симптом: пользователь видел ~30+ POST на Keycloak /token endpoint с 400 Bad Request, страница залипала. Корень. MR !267 добавил useEffect в TokenSync который на auth.user?.expired === true делал signinSilent → catch → signinRedirect. MR !268 добавил interceptor триггер на 403 + !accessToken. Цикл: 1. token expires, refresh_token тоже (Keycloak SSO Session Idle прошёл) 2. useEffect видит expired=true → signinSilent → POST /token с refresh 3. Keycloak возвращает 400 invalid_grant (refresh expired) 4. catch → signinRedirect, но oidc-client-ts automaticSilentRenew=true параллельно тоже пытается → ещё POST /token → ещё 400 5. signinRedirect не успевает редиректнуть до следующего render'а 6. reauthing.current=false → useEffect fire'ит снова → новый signinSilent 7. → ещё 400, и так в loop ~30 раз пока что-то не разрулит Откатываю обе ветки. Возвращаемся к v2.42.3 поведению: silent renew автоматически пробует один раз, на failure пользователь видит 403 (или stale data из cache) и делает relogin вручную. Не идеально, но не спамит Keycloak и не залипает на endlessly. Backend ScopeContext admin → RESTRICTED (MR !267 backend часть) остаётся — это безвредная правка, помогает юзерам с admin ролью без явного INTERNAL.
Ordinis Admin UI
React 19 + Vite 7 + TanStack Router + TanStack Query + Tailwind v4 + i18next.
Локально
cd ordinis-admin-ui
pnpm install
# .env.local: VITE_API_PROXY=http://localhost:8081 (port-forward read-api)
pnpm dev
Контракт API
GET /api/v1/dictionaries(read-api) — список справочниковGET /api/v1/{dictionaryName}/records(read-api) — записи с локализациейPOST /api/v1/dictionaries(writer) — создание справочника (TODO в UI)POST /api/v1/dictionaries/{name}/records(writer) — создание записи (TODO в UI)
Сборка / Docker
docker build -t repo.nstart.cloud/terravault/ordinis-admin-ui:dev .
docker run --rm -p 8088:80 repo.nstart.cloud/terravault/ordinis-admin-ui:dev
# → http://localhost:8088
В кластере nginx проксирует /api/v1/* в ordinis-read-api (GET) и
ordinis-app (POST/PUT/PATCH/DELETE).