4.9 KiB
4.9 KiB
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.*, SQLite000005_user_phone.*(в SQLite — rebuildusersдля снятия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(участники, загрузчики, комментарии).