diff --git a/CLAUDE.md b/CLAUDE.md index eb0c11b..52b6ce8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,9 +8,8 @@ сами создают конфиги, админ управляет серверами и пользователями. Есть **Telegram-бот** (ссылка на сайт, просмотр конфигов, passwordless-вход). Бэкенд оркестрирует панели **3x-ui** через [`ThreeXui.Net`](https://github.com/mrleo1nid/ThreeXui.Net), CQRS — через собственную библиотеку -[`LiteCqrs.Net`](https://github.com/mrleo1nid/LiteCqrs.Net) (на время разработки подключена как -`ProjectReference` из соседнего репозитория `D:\Github\LiteCqrs.Net`, ещё не опубликована в -NuGet/GitHub), и хранит проекцию домена в PostgreSQL. +[`LiteCqrs.Net`](https://github.com/mrleo1nid/LiteCqrs.Net) (NuGet-пакет), и хранит проекцию домена +в PostgreSQL. Живые обновления — SignalR. Поставка — **единый Docker-образ** (фронт+бек+бот) + PostgreSQL в compose. > Собрано и покрыто тестами, единый образ и compose-стек проверены живьём. Есть опциональный биллинг diff --git a/docs/architecture.md b/docs/architecture.md index a69fb17..15a9c07 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -134,9 +134,9 @@ PnvPanel — backend на **ASP.NET Core (.NET 10)** по принципам **C - **Команды** меняют состояние, возвращают `Result` / `Result`; выполняются в транзакции (UnitOfWorkBehavior). - **Запросы** только читают; могут ходить в БД проекциями (`Select` в DTO) без загрузки сущностей целиком. - Диспетчер — `ISender` из [`LiteCqrs.Net`](https://github.com/mrleo1nid/LiteCqrs.Net) (собственная - лёгкая CQRS-библиотека, альтернатива MediatR с явным разделением Command/Query — сосед-репозиторий - в `D:\Github`, пока подключён `ProjectReference`'ом, не через NuGet): резолвит хендлер - команды/запроса из DI (dynamic-free кэшированный диспетчер) и прогоняет через pipeline behaviors. + лёгкая CQRS-библиотека, альтернатива MediatR с явным разделением Command/Query — NuGet-пакет, + версия закреплена в `Directory.Packages.props`): резолвит хендлер команды/запроса из DI + (dynamic-free кэшированный диспетчер) и прогоняет через pipeline behaviors. Абстракции — `ICommand`, `IQuery`, `ICommandHandler<,>`, `IQueryHandler<,>`, `IPipelineBehavior<,>` — все из `LiteCqrs`; PnvPanel-специфичные behaviors (`ValidationBehavior`, `RequireActivationBehavior`, `UnitOfWorkBehavior`) и маркер `IRequiresActivation` остаются в diff --git a/docs/backend-conventions.md b/docs/backend-conventions.md index d7f96c2..20e515b 100644 --- a/docs/backend-conventions.md +++ b/docs/backend-conventions.md @@ -99,7 +99,7 @@ backend/ - **Rich domain model**: инварианты в сущностях (приватные сеттеры, фабричные методы `Node.Register(...)`, поведенческие методы `config.Revoke()`), а не анемичные DTO-сущности. - **CQRS через [LiteCqrs.Net](https://github.com/mrleo1nid/LiteCqrs.Net)** (собственная лёгкая - CQRS-библиотека, не MediatR — сосед-репозиторий, пока подключён `ProjectReference`'ом): хендлеры + CQRS-библиотека, не MediatR — NuGet-пакет): хендлеры реализуют `ICommandHandler` / `IQueryHandler<,>`; `ISender` резолвит их из DI и прогоняет через `IPipelineBehavior<,>` (`LoggingBehavior` → `ValidationBehavior` → `RequireActivationBehavior` → `UnitOfWorkBehavior`, порядок задан в `AddLiteCqrs(...)`). Без diff --git a/docs/tech-stack.md b/docs/tech-stack.md index 980ca56..1065072 100644 --- a/docs/tech-stack.md +++ b/docs/tech-stack.md @@ -5,8 +5,9 @@ - **Платформа**: .NET 10, ASP.NET Core Web API (Minimal API). - **Архитектура**: Clean Architecture, 4 проекта — `Domain / Application / Infrastructure / Api`. - **CQRS**: через [`LiteCqrs.Net`](https://github.com/mrleo1nid/LiteCqrs.Net) — собственную лёгкую - CQRS-библиотеку (сосед-репозиторий, на время разработки подключён `ProjectReference`'ом; ещё не - опубликован в NuGet), альтернативу MediatR с явным разделением Command/Query. `ISender.Send()` + CQRS-библиотеку (NuGet-пакет, версия закреплена в `Directory.Packages.props`; исходники — + отдельный репозиторий `D:\Github\LiteCqrs.Net`), альтернативу MediatR с явным разделением + Command/Query. `ISender.Send()` резолвит `ICommandHandler<,>`/`IQueryHandler<,>` из DI (dynamic-free кэшированный диспетчер) и прогоняет через `IPipelineBehavior<,>`: `LoggingBehavior` (готовый, из `LiteCqrs.Behaviors`), `ValidationBehavior` (FluentValidation, свой), `RequireActivationBehavior` (свой),