# Proposal ## Why Управление аккаунтом сейчас ограничено регистрацией и входом: пользователь не может изменить имя или пароль, а `PATCH /auth/me/preferences` умеет только настройки отображения. Вход возможен только по email, хотя мобильный сценарий естественно подразумевает номер телефона. Нужен явный профиль и вход по любому из двух идентификаторов. ## What Changes - Профиль пользователя: изменение имени; смена пароля с подтверждением текущего пароля и отзывом **всех** refresh-токенов (все сессии, включая текущую). - `phone` добавляется в аккаунт как второй идентификатор входа, хранится в строгом формате E.164, уникален, без подтверждения (SMS/OTP вне объёма). - `email` перестаёт быть обязательным: обязателен **хотя бы один** из `email`/`phone`. Оба — логины: заданный идентификатор нельзя изменить или удалить, но недостающий можно добавить один раз (add-only). - Вход по единому полю: `identifier` — email или E.164-телефон; определение по наличию `@`. - **BREAKING** (API): `POST /auth/login` принимает `identifier` вместо `email`; `POST /auth/register` принимает `phone` и допускает отсутствие `email`. - Новые инструменты профиля на всех поверхностях: страница `/profile` в вебе и отдельный экран в Android; поля входа/регистрации обновляются на обеих поверхностях. - Удаление аккаунта со всем содержимым: по подтверждению текущего пароля, немедленно и необратимо. Каскадно удаляются альбомы пользователя (включая доступ других участников), фото, комментарии, лайки, метки, уведомления, share-ссылки и приглашения; блобы добираются фоновым `reconcile`. - Вне объёма: подтверждение телефона (SMS/OTP), смена/удаление заданных логинов, изменение avatar, «корзина»/отложенное удаление аккаунта, экспорт данных перед удалением. ## Capabilities ### New Capabilities - `user-profile`: управление аккаунтом пользователя на всех поверхностях — чтение профиля, изменение имени, смена пароля с отзывом сессий, добавление недостающего идентификатора и удаление аккаунта со всем содержимым; телефон виден только владельцу (email, как и прежде, виден участникам альбома). ### Modified Capabilities - `auth`: вход по email **или** телефону через единый `identifier`; регистрация с требованием «хотя бы одного» из email/phone; хранение телефона в E.164. ## Impact - Backend: `backend/internal/auth/{service.go,handlers.go,store.go,sqlite_store.go,repository.go}`, `backend/internal/models/models.go`, `backend/internal/app/app.go` (маршруты). - Миграции: PostgreSQL `000013_user_phone.*`, SQLite `000005_user_phone.*` (в SQLite — rebuild `users` для снятия `NOT NULL` с email). - Frontend: `routes/(public)/login/+page.svelte`, новая `routes/(app)/profile/+page.svelte`, `lib/components/AppShell.svelte`, `lib/api.ts`, `lib/types.ts`, `lib/stores/auth.svelte.ts`. - Android: `data/network/dto/Dtos.kt`, `data/network/GaloApi.kt`, `data/network/ErrorMapper.kt`, `ui/auth/*`, новый `ui/profile/*`, `ui/GaloNavHost.kt`. - Данные/скрипты: `scripts/seed.py` (передача phone), существующие аккаунты остаются email-only и получают `phone = NULL`. - Удаление: каскад FK в PostgreSQL/SQLite; очистка блобов существующим `reconcile` (eventual, не в транзакции удаления). - Приватность: `phone` не попадает в `PublicUser` (участники, загрузчики, комментарии).