docs(spec): sessions API, device fields, profile sessions UI. Refs EventHub/EventHubBack#74
This commit is contained in:
+12
-6
@@ -21,15 +21,19 @@ Deep-link на календарь, владельцем которого явл
|
||||
Эндпоинты:
|
||||
- `POST /v1/register` — регистрация (`email`, `password`); статус пользователя `pending` до верификации.
|
||||
- `POST /v1/verify` — подтверждение email `{ token }`; после успеха у пользователя есть дефолтный personal-календарь.
|
||||
- `POST /v1/login` — вход; ответ `{ token, refresh_token, user }`. Сессия `auth_session` с `client_type=web`.
|
||||
- `POST /v1/refresh` — ротация пары токенов по `{ refresh_token }`.
|
||||
- `POST /v1/login` — вход; тело: `email`, `password`, `client_type=web`, `device_name`
|
||||
(метка браузера/ОС). Ответ `{ token, refresh_token, session_id, user }`.
|
||||
- `POST /v1/refresh` — ротация по `{ refresh_token }`; ответ включает `session_id`.
|
||||
- `POST /v1/logout` — `{ refresh_token }` до очистки storage.
|
||||
- `GET /v1/sessions`, `DELETE /v1/sessions/:id`, `POST /v1/sessions/revoke-others` —
|
||||
активные сессии в профиле (устройство, «текущая», отзыв / выйти на других).
|
||||
- `GET /v1/user/me` — профиль текущего пользователя.
|
||||
|
||||
Реализация:
|
||||
- JWT в `localStorage` под ключами, отличными от Admin UI (избежать коллизии при общем origin).
|
||||
- JWT + `session_id` в `localStorage` (ключи, отличные от Admin UI).
|
||||
- Axios: `Authorization: Bearer <access>`; при 401 — single-flight refresh; при неудаче — редирект на `/login`.
|
||||
- При старте приложения — `GET /v1/user/me` при наличии токена.
|
||||
- Logout — только клиентский (очистка storage); серверного revoke нет.
|
||||
- Logout — `POST /v1/logout`, затем clear storage.
|
||||
- WebSocket: `ws://…:8081/ws?token=<access_jwt>`; subscribe/unsubscribe по `calendar_id`.
|
||||
|
||||
## 3. Технологический стек
|
||||
@@ -376,7 +380,9 @@ E2E: `e2e/TESTIDS.md`. Моки (`npm run test:e2e`, `project=mock`) — тол
|
||||
legal stubs; позиция по подписке **владельца**; DNS/SPF без покупки домена без явного ок.
|
||||
|
||||
**Продукт (фаза 2):**
|
||||
- серверный logout / revoke session (`POST /v1/logout` + `{ refresh_token }`; клиент зовёт до clear storage)
|
||||
- серверный logout / revoke session (`POST /v1/logout` + `{ refresh_token }`; клиент зовёт до clear storage) — сделано
|
||||
- список/отзыв сессий в профиле (Back#74 / Front#72): устройство (`device_name`/UA),
|
||||
revoke одной и revoke-others
|
||||
- загрузка файлов: avatar `POST /v1/user/me/avatar`, cover
|
||||
`POST /v1/calendars/:id/cover` (Back#71); UI — Front#69; вложения — позже
|
||||
- полноценный push / reminders (email-reminder: Back#70; Web Push + prefs:
|
||||
@@ -386,7 +392,7 @@ legal stubs; позиция по подписке **владельца**; DNS/SP
|
||||
карточке события при полном слоте — Front#70
|
||||
- шаринг календаря с правами (`calendar_share`) — Back#73 API + Front list/invites/mirror;
|
||||
не путать со specialist_invite / Following
|
||||
- явный `client_type=mobile` — хвост (фаза 3 бэка / нативный клиент)
|
||||
- нативный `client_type=mobile` клиент — хвост (API уже принимает `mobile`)
|
||||
|
||||
**Вне горизонта (не фаза 2):** оплата услуги клиентом (B2C).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user