--- name: roadmap description: Статус слоя БД (MariaDB/Mongo/Elasticsearch) в Bicycle — что реализовано, что ждёт внешней инфраструктуры metadata: type: project --- Реализовано (2026-08-07) — три независимых сервиса, каждый со своей фабрикой в духе `Services\Auth`, без общего интерфейса поверх всех трёх (SQL/документы/поиск — слишком разные модели, чтобы прятать за одной абстракцией). Подробности использования — CLAUDE.md → разделы DataBase/Elasticsearch/Mongo. - **Реляционная БД (MariaDB, полностью рабочая и протестированная)** — `Services\Database` (фабрика), `Services\DataBase\Classes\PdoDriver` (failover по хостам, транзакции с вложенными SAVEPOINT), `Services\DataBase\Classes\Statement` (`showQuery()`/`sq()`), `Services\DataBase\Classes\Profiler`/`ProfilerPDO` (тайминги), `Services\DataBase\Model` (лёгкий носитель атрибутов). `System\Classes\Repository` — abstract CRUD; конкретные репозитории — в `App/Repositories/*` (например `App\Repositories\BudgetRepository`), не в `Services\DataBase` — так решил пользователь явно. - **Elasticsearch** — `Services\Elasticsearch` + `Services\Elasticsearch\Client`, тонкая REST-обёртка на уже существующем `System\Classes\HTTP\Client\Curl` (без тяжёлой composer-зависимости `elasticsearch/elasticsearch` — см. `feedback_educational_project.md`). - **Mongo** — `Services\Mongo` + `Services\Mongo\MongoDriver`, обёртка над `MongoDB\Client` (композер-пакет `mongodb/mongodb` уже поставлен через `composer.phar require --ignore-platform-req=ext-mongodb`, плюс `"platform": {"ext-mongodb": "2.3"}` в `composer.json`, чтобы дальнейшие `composer install` не требовали флага). **Что ждёт внешней инфраструктуры (не моя зона — пользователь занимается сам):** - `ext-mongodb` не установлен в `docker/php-apache/8.2.8/Dockerfile` (общий для нескольких проектов на хосте — мне трогать нельзя). Пользователь добавит сам. Код написан безопасно без расширения — падает только на реальном `new MongoDB\Client()` внутри `MongoDriver::__construct()`, не раньше. - Контейнеров `mongo` и `elasticsearch` в `docker-dev/docker-compose.yml` нет — пользователь поднимет сам (there уже есть закомментированный черновик блока `elasticsearch` в файле). - БД `bicycle` на общем MariaDB (контейнер `db`) ещё не создана, `App/config/config.local.php` пустой (0 байт) — реальный пароль/пользователь для MariaDB, а также для Mongo/ES (если с авторизацией) — пользователь впишет сам. **Тесты**: `PdoDriverTest`/`StatementTest`/`RepositoryTest` бьют по реальной MariaDB (не мокают) — пока БД не настроена, гейтятся через `markTestSkipped()` в `setUp()` при неудачном подключении. `ElasticsearchClientTest` — то же самое через `Client::ping()`. `MongoDriverTest` — через `extension_loaded('mongodb')`. Все они оживут сами, без правки кода, как только пользователь настроит соответствующую инфраструктуру — сейчас (2026-08-07) 26 тестов из 229 пропущены именно поэтому. **How to apply:** При запросах, касающихся БД/моделей/репозиториев — этот слой уже есть, не писать заново с нуля, расширять существующие классы. Новый конкретный репозиторий — в `App/Repositories/* extends System\Classes\Repository`, не в `Services\DataBase`. См. также `idea_cli_entrypoint.md` — CLI-точка входа отложена именно до появления этого слоя (первый реальный потребитель — миграции; теперь, когда слой БД есть, эта идея стала актуальнее).