# Перенос домена `auth` > Проверочный пример Level 3. Он показывает направление изменений, а не обязательный каркас. ## Исходная проблема В более ранней форме SLM контракт бизнес-логики домена `auth` и его техническая сборка могли находиться в разных местах: ```text business/auth/ ├── auth.factory.ts ├── errors/ ├── hooks/ ├── services/ ├── types/ └── index.ts compositions/business/auth/ ├── adapters/ ├── create-auth-business.ts └── index.ts ``` Такое устройство отделяет бизнес-логику от конкретной среды, но разносит одну предметную область по разным архитектурным местам. Level 3 размещает эти части внутри одного домена, сохраняя границы между их ролями. ## Целевая форма ```text 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`. Нормализация номера телефона может быть публичной чистой функцией бизнес-логики: ```ts import { normalizeAuthPhone, validateAuthPhone, } from '@/domains/auth/business' ``` Интерфейс использует её для ранней подсказки, но `requestPhoneOtp` повторно проверяет значение внутри предметного сценария. ## Контракт ошибок `AuthBusinessError` остаётся закрытой реализацией. Потребитель получает только устойчивый контракт: ```ts import { AUTH_ERROR_CODES, isAuthError, } from '@/domains/auth/business' ``` Так композиция React может выбрать сообщение или поведение повторной попытки по `code`, не зная класс ошибки SDK, статус HTTP или закрытый конструктор. ## Порядок перехода 1. Выделить точку входа `business` и убедиться, что её полный граф импортов не зависит от среды. 2. Перенести конкретные технические реализации в адаптеры выбранной сборки. 3. Оформить повторяемую сборку как `presets/application`. 4. Перенести хуки и провайдер в `react`, передавая им готовый API. 5. Сохранить интерфейс конкретной страницы и владение общим графом в `compositions`. 6. Добавить тесты фабрики, адаптеров, сборки и границы React до удаления старого пути.