4.6 KiB
Перенос домена auth
Проверочный пример Level 3. Он показывает направление изменений, а не обязательный каркас.
Исходная проблема
В более ранней форме SLM контракт бизнес-логики домена auth и его техническая сборка могли находиться в разных местах:
business/auth/
├── auth.factory.ts
├── errors/
├── hooks/
├── services/
├── types/
└── index.ts
compositions/business/auth/
├── adapters/
├── create-auth-business.ts
└── index.ts
Такое устройство отделяет бизнес-логику от конкретной среды, но разносит одну предметную область по разным архитектурным местам. Level 3 размещает эти части внутри одного домена, сохраняя границы между их ролями.
Целевая форма
domains/auth/
├── business/
│ ├── auth.factory.ts
│ ├── errors/
│ ├── lib/
│ ├── ports/
│ ├── services/
│ ├── types/
│ └── index.ts
├── presets/
│ ├── application/
│ │ ├── adapters/
│ │ └── index.ts
│ └── request/
│ └── index.ts
└── react/
├── hooks/
├── providers/
└── index.ts
Разделение обязанностей
| Исходная часть | Назначение в Level 3 |
|---|---|
auth.factory.ts, сценарии, проверки и ошибки домена |
domains/auth/business |
| SDK, хранилище и конкретная система управления состоянием | Закрытые адаптеры выбранной сборки |
| Повторяемая сборка для браузерного приложения | domains/auth/presets/application |
| Файлы cookie, заголовки и клиент одного запроса | domains/auth/presets/request |
| React-хуки, провайдер и интерфейс домена | domains/auth/react |
| Текст страницы, перенаправление и устройство экрана | Модуль-потребитель в compositions |
Проверка границ
authFactory не импортирует useAuth, 'use client', SDK или хранилище. React-хук строится поверх готового AuthApi, например через независимые от фреймворка методы getSnapshot и subscribe.
Нормализация номера телефона может быть публичной чистой функцией бизнес-логики:
import {
normalizeAuthPhone,
validateAuthPhone,
} from '@/domains/auth/business'
Интерфейс использует её для ранней подсказки, но requestPhoneOtp повторно проверяет значение внутри предметного сценария.
Контракт ошибок
AuthBusinessError остаётся закрытой реализацией. Потребитель получает только устойчивый контракт:
import {
AUTH_ERROR_CODES,
isAuthError,
} from '@/domains/auth/business'
Так композиция React может выбрать сообщение или поведение повторной попытки по code, не зная класс ошибки SDK, статус HTTP или закрытый конструктор.
Порядок перехода
- Выделить точку входа
businessи убедиться, что её полный граф импортов не зависит от среды. - Перенести конкретные технические реализации в адаптеры выбранной сборки.
- Оформить повторяемую сборку как
presets/application. - Перенести хуки и провайдер в
react, передавая им готовый API. - Сохранить интерфейс конкретной страницы и владение общим графом в
compositions. - Добавить тесты фабрики, адаптеров, сборки и границы React до удаления старого пути.