Files
slm-design/docs2/specification/layers/domains/business.md

6.2 KiB
Raw Blame History

title, status, normative
title status normative
Business domain draft true

Business

business является framework-neutral зоной domain и единственным владельцем его продуктовой semantics.

Структура

domains/{group...}/{domain}/business/
├── {domain}.factory.ts
├── index.ts
├── types/
├── ports/
├── services/
├── errors/
├── mappers/
├── selectors/
├── validators/
└── lib/

Конкретный набор внутренних segments определяется размером domain. Обязательны роль factory и public boundary, но не каждая папка из примера.

Factory boundary

SLM-BUS-001 - ОБЯЗАН. Business должен создавать public runtime API через factory {domain}Factory.

SLM-BUS-002 - ОБЯЗАН. Factory должна принимать все runtime capabilities через business-owned dependency contracts.

SLM-BUS-003 - ОБЯЗАН. Factory должна возвращать framework-neutral DomainRuntime или logic API domain.

SLM-BUS-004 - ЗАПРЕЩЕНО. Factory не может возвращать React hooks, components, Providers, layouts, route guards или framework boundaries.

SLM-BUS-005 - ЗАПРЕЩЕНО. Factory constructor не может выполнять I/O, открывать socket, регистрировать subscription, запускать timer или читать hidden environment.

Public API

SLM-BUS-006 - ОБЯЗАН. business/index.ts должен экспортировать единственное runtime value: factory.

SLM-BUS-007 - МОЖЕТ. business/index.ts может экспортировать business-owned types через export type.

export { authFactory } from './auth.factory'

export type {
  AuthDeps,
  AuthFactory,
  AuthRuntime,
  AuthState,
} from './types'

SLM-BUS-008 - ЗАПРЕЩЕНО. Error classes, error guards, error code constants, selectors, validators, formatters, services, mappers и port implementations не экспортируются как отдельные runtime values.

Если внешнему consumer нужна такая capability, она должна быть осмысленной частью factory runtime API, а не обходным direct export.

Runtime API

DomainRuntime может предоставлять:

  • commands;
  • imperative queries;
  • snapshots;
  • subscriptions;
  • selectors через стабильные methods;
  • validation operations;
  • typed outcomes;
  • explicit lifecycle operations.

SLM-BUS-009 - ОБЯЗАН. Runtime API должен говорить на языке domain и не повторять endpoint names, SDK tree или storage schema.

SLM-BUS-010 - ЗАПРЕЩЕНО. Public contract не может раскрывать generated DTO, SDK client, query-library result, concrete store API, raw Context или adapter.

Dependencies и ports

SLM-BUS-011 - ОБЯЗАН. Business-owned dependency описывает минимальную внешнюю возможность на языке domain.

export type AuthPhonePort = {
  requestCode: (phone: string) => Promise<unknown>
  verifyCode: (input: VerifyPhoneCodeInput) => Promise<unknown>
}

SLM-BUS-012 - ОБЯЗАН. Ненадёжный внешний результат должен приниматься как unknown, если business обязан проверить его runtime-форму.

SLM-BUS-013 - ЗАПРЕЩЕНО. Business dependency не может быть generated DTO, полный SDK client, StoreApi, QueryClient или framework hook.

SLM-BUS-014 - ОБЯЗАН. Subscription port должен предоставлять cleanup contract.

Imports

Business может runtime-импортировать:

  • собственные файлы;
  • детерминированный shared;
  • pure libraries без I/O, hidden state и public type leakage.

Business может type-only импортировать стабильный public contract другого domain, если dependency невозможно корректно описать локальным port. Локальный consumer-owned port является предпочтительным вариантом.

SLM-BUS-015 - ЗАПРЕЩЕНО. Business не импортирует React, query runtime, state manager, SDK, generated operation, HTTP client, storage implementation, browser API, infra, composition или assembly.

Cross-domain imports дополнительно регулируются SLM-XDOM-001 и SLM-XDOM-005 - SLM-XDOM-008.

Normalization и errors

SLM-BUS-017 - ОБЯЗАН. External result должен быть нормализован в business-owned model до выхода из DomainRuntime.

SLM-BUS-018 - ОБЯЗАН. Malformed successful response должен считаться нарушением runtime contract, а не валидным отсутствием данных.

SLM-BUS-019 - ОБЯЗАН. Expected domain outcome и technical failure должны быть различимы в public contract.

SLM-BUS-020 - ЗАПРЕЩЕНО. Source error, HTTP status, SDK error class, raw response и transport message не могут быть consumer contract.

Business может выражать ожидаемые outcomes через typed result или domain error. Эта draft-версия не предписывает единственную форму обработки ожидаемых ошибок, но требует business-owned semantics и стабильных discriminants.

State

SLM-BUS-021 - ОБЯЗАН. Business владеет domain state model, допустимыми transitions и semantics commands/selectors.

SLM-BUS-022 - ЗАПРЕЩЕНО. Business не импортирует concrete store implementation.

Framework-neutral state runtime может быть создан самой factory или предоставлен через business-owned port. Выбор не должен раскрывать concrete implementation в public API.