Регистрация нового пользователя — 4 шага подряд. OTP в dev смотрите в консоли NestJS.
1. Телефон OTP
2. Email OTP
3. Подтвердить email
4. Профиль + пароль
POST /api/auth/request-code
Запросить OTP-код на телефон или email
POST /api/auth/verify-phone
Подтвердить OTP по телефону (вход или регистрация)
POST /api/auth/register/request-email-code
Шаг 2 регистрации: запросить OTP на email (только для новых пользователей)
POST /api/auth/register/verify-email
Шаг 3 регистрации: подтвердить OTP с email
Вход в аккаунт — OTP (без пароля) или логин + пароль (если задавали при регистрации).
Вход по OTP (телефон)
POST /api/auth/request-code
Только type=phone для входа существующего пользователя
POST /api/auth/verify-phone
Вход по паролю
Сброс пароля — без JWT. Ответ «код отправлен» всегда нейтральный (не раскрывает наличие аккаунта).
1. request-code
2. reset + новый пароль
POST /api/auth/password/reset
После сброса все сессии инвалидируются — войдите заново
GET /api/users/me
Полный профиль и настройки уведомлений (lazy init preferences)
Данные профиля
Результат GET /users/me
Войдите и нажмите «Загрузить»
PATCH /api/users/me
firstName, lastName, city — хотя бы одно поле
PATCH /api/users/me/notifications
Отправляет все 13 булевых полей. Транзакционные группы требуют хотя бы один включённый канал.
PATCH /api/users/me (негатив)
Отправляет запрещённое поле в сыром теле → ожидается 400 FORBIDDEN_FIELD
GET /api/users/:id
Публичный профиль (или расширенный для MODERATOR/ADMIN/SUPER_ADMIN). Опциональный JWT через чекбокс.
POST /api/users/me/avatar/presigned-url
Шаг 1: presigned URL, затем PUT в S3, затем confirm. Нужны S3_* в .env.
POST /api/users/me/avatar/confirm
Шаг 2: s3Key из шага 1
DELETE /api/users/me/avatar
POST /api/users/me/phone/request-change
OTP на новый номер (см. консоль сервера в dev). После смены — разлогин и новый вход.
POST /api/users/me/phone/confirm-change
Код из SMS на новый номер (номер берётся с сервера из Redis)
POST /api/users/me/delete-request
Запрос на удаление (30 дней). Может вернуть 400 при активных бронях / холдах и т.д.
DELETE /api/users/me/delete-request
Отменить запрос (два эквивалентных маршрута из ТЗ)
GET /api/auth/sessions
Активные сессии (экран «Мои устройства»)
DELETE /api/auth/sessions/:sessionId
Завершить конкретную сессию по ID
POST /api/auth/logout
Завершить текущую сессию
POST /api/auth/logout-all
Завершить все сессии пользователя
POST /api/auth/verify-email
Подтвердить email OTP (привязка с JWT или вход без JWT)
POST /api/auth/refresh
Обновить пару токенов (ротация refresh token через cookie)
Справка: все эндпоинты
Auth (15) + User (11) — покрыты вкладками панели
Auth: request-code, verify-phone, register/request-email-code, register/verify-email, complete-registration, login, password/request-code, password/reset, verify-email, refresh, logout, logout-all, sessions, DELETE sessions/:id
User: GET/PATCH me, PATCH me/notifications, avatar presigned/confirm/delete, phone request/confirm-change, delete-request + cancel (2 URL), GET :id
Текущее состояние
Access Token и данные пользователя в памяти
Ручной запрос
Отправить произвольный запрос к API