P1: Редактирование профиля пользователя (PUT /v1/user/me) #48
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
Клиентский SPA (EventHubFront) уже умеет переключать язык UI (RU/EN) по аналогии с Admin, но у пользователя есть только
GET /v1/user/me— API обновления собственного профиля отсутствует.Сейчас локаль клиента хранится в
localStorageи при логине/checkAuth опционально подтягивается изuser.language. В Admin язык сохраняется черезPUT /v1/admin/me. Без user update API клиент не может персистить язык и другие поля профиля на бэкенде. ВEventHubFrontSpecявно зафиксировано: редактирование профиля не реализуется, пока нет user update API.Влияние
Ожидаемый результат
Добавить эндпоинт обновления профиля текущего аутентифицированного пользователя, по аналогии с
PUT /v1/admin/me.Эндпоинт
PUT /v1/user/me(предпочтительно — единообразие с admin; допустимPATCH, если явно обосновано)handler_utils:auth_user/1); без токена —401200+ актуальный профиль в том же формате, чтоGET /v1/user/me(handler_utils:user_to_json/1)Разрешённые поля тела запроса
Частичное обновление (передаются только изменяемые поля). Разрешить поля, уже присутствующие в модели
#user{}/ ответе GET и в admin profile update:languageru/enили согласованный enum)nicknametimezonephoneavatar_urlpreferencessocial_linksЗапретить изменение через этот эндпоинт:
email,password/password_hash,role,status,reason,id, системные timestamps. Неизвестные поля — игнорировать или400(выбрать один подход и задокументировать; у admin неизвестные ключи частично проходят через convert — лучше валидировать whitelist).Валидация
400logic_user:validate_user_update/1(+avatar_url, при необходимостиsocial_links)language: допустимые значения согласовать с клиентом/Admin (как минимумru,en)/me)active— если так уже принято)Реализация (ориентир)
handler_user_me.erl: сейчас только GET → добавить PUT по образцуadmin_handler_me.erlcore_user:update/2иset_fieldдля нужных полей; при необходимости — тонкийlogic_user:update_me/2с whitelist (не путать сupdate_user_admin/2, где можно менять role/status)handler_user_me:trails/0→client-swagger.jsonEventHubBackSpec(и при необходимости отметить в FrontSpec, что API появился — follow-up на фронт отдельно)Тесты
API-тесты на
PUT /v1/user/me: успех (language и прочие поля),401,400, запрет смены email/role/status, ответ совпадает со схемой GET.Критерии приёмки
PUT /v1/user/me(или согласованный эквивалент) для аутентифицированного пользователяlanguage; такжеnickname,timezone,phone,avatar_url,preferences(и при решении —social_links)401; невалидное тело —400200возвращает полный профиль как GETEventHubBackSpec)Контекст / follow-up
PUT /v1/admin/meвadmin_handler_me.erl.Файлы (подсказка)
src/handlers/handler_user_me.erl— сейчас только GETsrc/handlers/admin/admin_handler_me.erl— образец PUTsrc/core/core_user.erl—update/2,set_field/3src/logic/logic_user.erl— валидация полей (admin path)src/swagger/client-swagger.jsonEventHubSpec/EventHubBackSpec.mdПриоритет
P1
Беру в работу. Сначала предложу варианты реализации.
Реализован вариант 3: PATCH /v1/user/me.
Редактируемые: language (ru|en), nickname, timezone, phone, avatar_url, preferences.
Смена пароля: current_password + password (вместе; неверный текущий → 403).
Неизвестные/запрещённые поля → 400.
Тест: user_test_user_me — passed (OTP 28). Спека EventHubBackSpec обновлена.
Запушено: Back
0934e2c, Spece5ab464. PATCH /v1/user/me + unit/API-тесты. Закрываю.