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