# Create Data Layer

> Use when пользователь просит собрать или расширить составной поток данных фичи между Ktor, Room, мапперами, use case, realtime или WorkManager — например "wire up API and Room", "add a data layer", "reload persisted data from a socket event" или "sync in background". Выбирает минимальный поток и маршрутизирует работу к специализированным skills. Не используй для одного уже определённого endpoint, DAO/entity, mapper, use case, worker или realtime-канала; используй соответствующий атомарный skill напрямую. Не используй для Screen/ViewModel.

- Skill: `michaelbel/create-data-layer` (Agent Skill)
- Install (CLI): `npx skillmds@latest add michaelbel/create-data-layer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/michaelbel/create-data-layer/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: michaelbel (https://skillmd.com/u/michaelbel)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/michaelbel/create-data-layer

---


# Составной поток данных

Собери только те части data/domain-потока, которые нужны пользовательскому сценарию. Этот skill
координирует специализированные skills и не дублирует их шаблоны.

## Сначала определи границы

1. Изучи аналогичные потоки и существующие типы в целевом проекте.
2. Зафиксируй источник истины: ответ текущей операции, Room или другой уже существующий store.
3. Определи, что запускает обновление: UI, realtime-событие или WorkManager.
4. Отметь уже реализованные части и не пересоздавай их.
5. Выбери минимальный поток из таблицы ниже. Если сценарий гибридный, объедини только необходимые
   строки.

| Сценарий                     | Подключаемые skills                                                                                                                                | Результат                                                                                                    |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Ktor-only                    | `create-ktor-endpoint`, затем обязательный `create-usecase`                                                                                        | Ответ используется конкретной domain-операцией без искусственного Room-кэша                                  |
| Room-only                    | `create-room-storage`, затем `create-usecase`; `create-domain-mapper` только при реальной границе моделей                                          | Чтение/запись локального источника без сетевого слоя                                                         |
| Ktor → mapper → Room         | `create-ktor-endpoint`, `create-domain-mapper`, `create-room-storage`, `create-usecase`                                                            | Load-use case получает API-модель, маппит и атомарно обновляет Room; UI наблюдает Room отдельным FlowUseCase |
| realtime → reload            | `create-signalr-channel`, затем `create-usecase`; добавь Ktor/mapper/Room skills только для отсутствующих частей reload-потока                     | Realtime-событие служит сигналом обновления, а не вторым источником состояния                                |
| WorkManager → network → Room | `create-workmanager-task`, `create-ktor-endpoint`, `create-domain-mapper`, `create-room-storage`, `create-usecase` только для отсутствующих частей | Worker вызывает переиспользуемую business-операцию; network/Room-логику не дублирует                         |

Перед реализацией загрузи каждый выбранный skill и следуй его границам. Порядок в таблице описывает
зависимости, но не требует пересоздавать уже готовые нижние слои.

## Инварианты композиции

- Не добавляй Repository или Interactor, если целевой проект связывает конкретные зависимости через
  `UseCase` / `FlowUseCase`.
- Не создавай Room, mapper, request/response или фоновую задачу «для полноты». У каждого слоя должен
  быть вызывающий сценарий.
- При Room как источнике истины разделяй обновление и наблюдение: одноразовый load use case пишет в
  Room, отдельный `FlowUseCase` возвращает DAO Flow.
- Realtime handler и Worker инициируют use case. Они не копируют HTTP-вызовы, маппинг и SQL-запись
  внутрь инфраструктурного класса.
- Композиционный use case разворачивает результат другого use case через `.getOrThrow()`.
- Используй транзакцию Room для согласованного набора связанных изменений, а не для одиночного
  вызова DAO.
- Следуй структуре, именованию и уже выбранным библиотекам целевого проекта. Reference-проект
  показывает поведение, но не является шаблоном для механической замены package name.

## Завершение

Проверь, что созданные части образуют один вызываемый вертикальный поток, зарегистрированы в
существующих database/network/realtime/worker точках расширения и не оставили неиспользуемых
моделей. Запусти релевантные тесты и сборку затронутых модулей. Экран подключай отдельно через
`create-feature-scaffold-screen`.

