# user-profile Specification ## Purpose Управление аккаунтом пользователя: просмотр и изменение профиля, смена пароля с отзывом сессий, добавление второго идентификатора входа и удаление аккаунта со всем содержимым — единообразно в веб-интерфейсе и Android-клиенте. ## Requirements ### Requirement: Просмотр собственного профиля Пользователь SHALL получать свой профиль с именем, email, телефоном и аватаром. Телефон SHALL быть виден только владельцу и SHALL NOT попадать в публичные представления пользователя (участники альбома, загрузчики, комментарии). #### Scenario: Получение профиля - **WHEN** аутентифицированный пользователь запрашивает свой профиль - **THEN** ответ содержит его имя, email (если задан), телефон (если задан) и аватар #### Scenario: Телефон не утекает - **WHEN** пользователь просматривает участников альбома - **THEN** представления других пользователей не содержат телефон ### Requirement: Изменение имени Пользователь SHALL изменять своё имя. Пустое имя SHALL отклоняться. Смена имени SHALL применяться немедленно и отражаться при следующем чтении профиля. #### Scenario: Успешное изменение - **WHEN** пользователь отправляет непустое имя - **THEN** система сохраняет его и возвращает обновлённый профиль #### Scenario: Пустое имя - **WHEN** пользователь отправляет пустое имя - **THEN** система отклоняет запрос и не меняет профиль ### Requirement: Смена пароля с отзывом сессий Пользователь SHALL менять пароль, подтвердив текущий пароль. Система SHALL отклонять неверный текущий пароль и новый пароль короче 8 символов. Успешная смена SHALL отзывать все refresh-токены пользователя на всех устройствах. #### Scenario: Успешная смена - **WHEN** пользователь вводит верный текущий пароль и новый пароль допустимой длины - **THEN** система сохраняет новый хэш и отзывает все refresh-токены пользователя #### Scenario: Неверный текущий пароль - **WHEN** пользователь вводит неверный текущий пароль - **THEN** система возвращает ошибку и не меняет пароль #### Scenario: Слабый новый пароль - **WHEN** новый пароль короче 8 символов - **THEN** система отклоняет запрос и сохраняет старый пароль ### Requirement: Добавление недостающего идентификатора Пользователь с одним заданным идентификатором (email или телефон) SHALL добавить недостающий один раз после проверки уникальности. Система SHALL отклонять добавление, когда оба идентификатора уже заданы, а также изменение или удаление заданного. После добавления оба идентификатора SHALL работать для входа. #### Scenario: Добавление телефона - **WHEN** пользователь без телефона добавляет свободный номер в формате E.164 - **THEN** система сохраняет номер, и вход по нему становится возможен #### Scenario: Занятый идентификатор - **WHEN** добавляемый email или телефон уже принадлежит другому пользователю - **THEN** система возвращает ошибку конфликта и не меняет профиль #### Scenario: Оба уже заданы - **WHEN** у пользователя уже заданы и email, и телефон, и он пытается добавить третий - **THEN** система отклоняет запрос ### Requirement: Удаление аккаунта со всем содержимым Пользователь SHALL удалять свой аккаунт, подтвердив текущий пароль. Неверный пароль SHALL отклоняться. Успешное удаление SHALL быть немедленным и необратимым: SHALL каскадно удаляться альбомы пользователя (вместе с доступом других участников), его фото, комментарии, лайки, метки, уведомления, share-ссылки и приглашения. Блобы SHALL освобождаться фоновой сверкой хранилища, а не в транзакции удаления. #### Scenario: Успешное удаление - **WHEN** пользователь подтверждает удаление верным текущим паролем - **THEN** учётная запись и связанное содержимое удаляются, и вход больше невозможен #### Scenario: Общие альбомы - **WHEN** удаляемый пользователь владеет альбомом, в котором есть другие участники - **THEN** альбом удаляется вместе с ними #### Scenario: Неверный пароль - **WHEN** пользователь подтверждает удаление неверным паролем - **THEN** система возвращает ошибку и не удаляет аккаунт ### Requirement: Страница профиля в веб-интерфейсе Веб-приложение SHALL предоставлять отдельную страницу профиля, доступную из шапки, с показом идентификаторов и формами изменения имени, смены пароля и удаления аккаунта. #### Scenario: Открытие страницы - **WHEN** аутентифицированный пользователь открывает профиль из шапки - **THEN** отображаются его идентификаторы и формы редактирования #### Scenario: Выход после смены пароля - **WHEN** смена пароля завершилась успешно - **THEN** клиент очищает токены и перенаправляет на страницу входа #### Scenario: Выход после удаления - **WHEN** удаление аккаунта завершилось успешно - **THEN** клиент очищает токены и перенаправляет на страницу входа ### Requirement: Экран профиля в Android-клиенте Android-приложение SHALL предоставлять отдельный экран профиля, доступный из списка альбомов, с теми же возможностями, что и веб-страница. #### Scenario: Открытие экрана - **WHEN** пользователь открывает профиль из списка альбомов - **THEN** отображаются идентификаторы и формы редактирования #### Scenario: Возврат после смены пароля - **WHEN** смена пароля завершилась успешно - **THEN** приложение очищает токены и возвращает на экран входа #### Scenario: Возврат после удаления - **WHEN** удаление аккаунта завершилось успешно - **THEN** приложение очищает токены и возвращает на экран входа