Сегменты
См. также: Слои и архитектура для детального описания каждого слоя.
| Сегмент | Назначение | Пример |
|---|---|---|
ui | UI-компоненты и стили | article-card.tsx |
model | Состояние, бизнес-логика, типы | article.types.ts, use-article.ts |
api | Сложные API-операции с доменной логикой | atomic-update.ts, batch-operations.ts |
lib | Утилиты конкретного слайса | slugify.ts, format-date.ts |
Как выбрать правильный сегмент?
Используйте эту схему при добавлении нового кода в слайс:
Важное правило для сегмента api
MUST: CRUD операции (get, create, update, delete) размещаются в shared/api/endpoints/
FORBIDDEN: Размещать CRUD операции в entities/*/api/ или features/*/api/
MAY: Сегмент api в entities/features используется для сложных API-операций с доменной логикой:
- Атомарные обновления с rollback
- Batch-операции с транзакциями
- Сложная оркестрация нескольких API-вызовов с бизнес-правилами
Примеры:
// ✅ ПРАВИЛЬНО: CRUD в shared/api/endpoints/
// shared/api/endpoints/article.api.ts
export async function getArticle(slug: string): Promise<ArticleDTO> {
const { data } = await apiClient.get<{ article: ArticleDTO }>(`/articles/${slug}`);
return data.article;
}
// ✅ ПРАВИЛЬНО: Сложная доменная операция в entities/api/
// entities/order/api/atomic-update.ts
export async function updateOrderWithRollback(orderId: string, updates: OrderUpdate) {
// Сложная логика с rollback, валидацией инвариантов, etc.
}
// ❌ НЕПРАВИЛЬНО: Дублирование CRUD в entities
// entities/article/api/get-article.ts
export async function getArticle(slug: string) { // НЕ ДЕЛАЙТЕ ТАК!
return apiClient.get(`/articles/${slug}`);
}
📌 Ключевые моменты:
ui/- UI-компоненты и стилиmodel/- Состояние, бизнес-логика, типыapi/- Только сложные доменные операции (НЕ CRUD!)lib/- Утилиты конкретного слайса- MUST: CRUD операции всегда размещаются в
shared/api/endpoints/- FORBIDDEN: Дублирование CRUD операций в слайсах