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

4.6 KiB
Raw Blame History

Перенос домена 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 или закрытый конструктор.

Порядок перехода

  1. Выделить точку входа business и убедиться, что её полный граф импортов не зависит от среды.
  2. Перенести конкретные технические реализации в адаптеры выбранной сборки.
  3. Оформить повторяемую сборку как presets/application.
  4. Перенести хуки и провайдер в react, передавая им готовый API.
  5. Сохранить интерфейс конкретной страницы и владение общим графом в compositions.
  6. Добавить тесты фабрики, адаптеров, сборки и границы React до удаления старого пути.