Files
slm-design/DRAFT/level-3/domains/auth-example.md

97 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Перенос домена `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 до удаления старого пути.