5.2 KiB
5.2 KiB
Tasks
1. Модель данных и миграции
- 1.1 Добавить
Phoneвmodels.User(но НЕ вPublicUser) — unit-тест: JSONPublicUserне содержит телефон - 1.2 Миграция PostgreSQL
000013_user_phone(снятьNOT NULLс email, добавитьphone+ unique, down-миграция) — проверитьmake migrateи откат на чистой БД - 1.3 Миграция SQLite
000005_user_phoneчерез rebuildusers— проверить на копииgalo.db, что данные сохранены, email nullable,phoneприсутствует - 1.4 Расширить миграционный тест
internal/e2e— проверка схемыusers(nullable email, колонкаphone, уникальность)
2. Backend: вход и регистрация по идентификатору
- 2.1 Нормализация E.164 и определение типа идентификатора (
@→ email) — unit-тест на валидные/невалидные номера - 2.2 Хранилища:
COALESCE(email,'')в выборках,GetUserByPhoneвstore.goиsqlite_store.go— тесты обоих хранилищ - 2.3
Service.Registerпринимает email и/или телефон, требует «хотя бы один», ловит конфликтыemail_taken/phone_taken— тесты - 2.4
Service.Loginпо единому идентификатору — тесты: вход по email, по телефону, несуществующий, неверный пароль (ответ неразличим) - 2.5 Хендлеры
login(identifier) иregister(phoneнеобязателен) — тесты хендлеров
3. Backend: профиль (имя, пароль, добавление идентификатора)
- 3.1
PATCH /auth/meдля изменения имени (пустое отклоняется) — тесты сервиса и хендлера - 3.2
POST /auth/me/password: проверка текущего пароля, минимум 8 символов,RevokeAllUserTokensпри успехе — тесты - 3.3
POST /auth/me/identifiers(add-only): добавление недостающего email/phone, конфликты, отказ когда оба заданы — тесты - 3.4
/auth/meотдаёт телефон только владельцу — тест: ответMeсодержит phone, публичные представления — нет
4. Backend: удаление аккаунта
- 4.1
DELETE /auth/meс подтверждением пароля иDeleteUserв обоих хранилищах — тесты: неверный пароль, успешное удаление - 4.2 Интеграционный тест: удаление владельца с общим альбомом убирает альбом у другого участника
5. Web-интерфейс
- 5.1 Login/register: единое поле «Email или телефон», необязательные email/phone с проверкой «хотя бы одно»; обновить
api.ts,types.ts— проверитьnpm run checkи ручной вход - 5.2 Новая страница
(app)/profile(имя, пароль, добавление идентификатора, удаление) и ссылка из шапкиAppShell— проверитьnpm run checkи ручной сценарий - 5.3 Очистка токенов и редирект на вход после смены пароля и удаления — ручная проверка в браузере
6. Android-клиент
- 6.1 DTO/API: login по
identifier,phoneпри регистрации, эндпоинты профиля; обновитьErrorMapper— unit-тест маппинга ошибок - 6.2
AuthScreen: единое поле идентификатора, необязательные email/phone — Robolectric-тест - 6.3
ProfileScreen+ProfileViewModel+ запись вGaloNavHost, вход из списка альбомов — Robolectric-тест - 6.4 Очистка
TokenStoreи возврат на экран auth после смены пароля/удаления — Robolectric-тест
7. Интеграция и документация
- 7.1 E2E против запущенного сервера: регистрация только по телефону, вход, добавление email, смена пароля (сессии отозваны), удаление аккаунта
- 7.2
scripts/seed.py: поддержать необязательныйphone; обновить README (новые эндпоинты профиля) — проверить запускmake testdataи чтение README - 7.3 Полный прогон:
make test,cd frontend && npm run check,cd android && ./gradlew test
Workflow follow-up
- Архивировать изменение после прохождения ревью и синхронизировать основные спеки.