feat: persist current workspace in user sessions

This commit is contained in:
a.tolmachev
2026-03-31 15:17:07 +03:00
parent 84f4437ce0
commit 86b61523bd
15 changed files with 331 additions and 57 deletions
+4 -2
View File
@@ -76,15 +76,17 @@
- `GET /api/auth/session`
- `GET /api/auth/profile`
- `PATCH /api/auth/profile`
- `POST /api/auth/current-workspace`
- `POST /api/auth/password`
Контракт:
- `POST /login` принимает `email` и `password`;
- при успешном логине backend выставляет `HttpOnly` session cookie;
- `GET /session` возвращает текущего пользователя и memberships;
- `GET /profile` возвращает текущего пользователя и memberships для settings UI;
- `GET /session` возвращает текущего пользователя, memberships и `current_workspace_id`;
- `GET /profile` возвращает текущего пользователя, memberships и `current_workspace_id` для settings UI;
- `PATCH /profile` обновляет `display_name` и `email` текущего пользователя;
- `POST /current-workspace` переключает текущий workspace внутри текущей authenticated session;
- `POST /password` меняет пароль текущего пользователя после проверки `current_password`;
- `POST /logout` инвалидирует текущую session.
+8 -11
View File
@@ -115,7 +115,6 @@ UI-файлы:
Что еще не хватает:
- server-side current workspace model вместо client-side `localStorage`;
- дальнейший UX polish вокруг gRPC discovery, потому что server reflection сознательно заменен на descriptor-driven live flow;
- возможные smoke tests для `wizard`, чтобы закрепить уже подключенный live contract.
@@ -128,6 +127,7 @@ UI-файлы:
Простой итог:
- wizard почти готов для реального backend;
- текущий workspace для wizard уже приходит из auth session, а не только из client-side `localStorage`;
- это основной экран второй очереди после catalog;
- базовый create/edit draft flow уже можно посадить на live `create/get version/update` endpoints;
- следующий разрыв здесь - test/publish/import/export wiring и полноценный gRPC descriptor-set lifecycle.
@@ -312,13 +312,10 @@ UI-файлы:
Что еще не хватает:
- `switch current workspace` все еще живет на клиенте, а не в session/backend;
- session-aware current workspace model;
- finer-grained permission matrix beyond current `owner/admin` management rules.
Отдельный конфликт:
- current workspace по-прежнему client-side;
- memberships, role-management и invitations уже live;
- `settings` page не должна дублировать этот flow, пока у нее нет своего backend-контракта
@@ -326,7 +323,7 @@ UI-файлы:
- `workspace-setup` уже подключен к live backend;
- create/edit workspace, memberships, invitations, export и delete работают;
- текущий workspace все еще остается client-side моделью.
- текущий workspace уже синхронизируется через auth session и используется всеми live страницами.
### 4.8. Settings
@@ -347,6 +344,7 @@ UI-файлы:
- `GET /api/auth/session`
- `GET /api/auth/profile`
- `PATCH /api/auth/profile`
- `POST /api/auth/current-workspace`
- `POST /api/auth/password`
- workspace block через `GET /api/admin/workspaces/{workspace_id}`
- `PATCH /api/admin/workspaces/{workspace_id}`
@@ -354,8 +352,7 @@ UI-файлы:
Что еще не хватает:
- preferences endpoint;
- полноценный advanced security model (`2FA`, passkeys, session inventory);
- session-aware current workspace model вместо client-side `localStorage`.
- полноценный advanced security model (`2FA`, passkeys, session inventory).
Отдельный конфликт:
@@ -437,13 +434,13 @@ UI вводит scope `deploy`, backend пока не отражает полн
### 5.4. Workspace switching
UI хранит current workspace в `localStorage`.
UI хранит current workspace в auth session и использует `localStorage` только как cache/fallback.
Решение:
- на ближайшем этапе оставить client-side current workspace;
- данные workspace брать с backend;
- позже заменить на session-aware current workspace model.
- backend хранит `current_workspace_id` в user session;
- `POST /api/auth/current-workspace` переключает активный workspace;
- клиент использует `localStorage` только как cache/fallback для shell state.
## 6. Порядок интеграции