Refactor environment configuration and update documentation for MVP status
- Removed deprecated Telegram user ID configuration from `.env.example` and added a new setting for admin Telegram user IDs. - Updated `CLAUDE.md` to reflect the current MVP status, detailing completed features and testing coverage. - Enhanced `README.md` with quick start instructions for Docker setup and clarified project status. - Revised API design documentation to include updated error handling and request/response structures. - Improved frontend documentation to outline the project structure and technologies used.
This commit is contained in:
@@ -11,8 +11,10 @@
|
||||
хранит свою проекцию домена в PostgreSQL. Живые обновления — по SignalR. Приложение (фронт + бек +
|
||||
бот) поставляется **единым Docker-образом**; PostgreSQL — отдельным контейнером в compose.
|
||||
|
||||
> **Статус: проектирование.** Код ещё не написан. Актуальны только документация и этот файл.
|
||||
> При старте реализации следуй [`docs/roadmap.md`](docs/roadmap.md) (этапы M0…M6).
|
||||
> **Статус: MVP реализован и работает.** Бэкенд (M0–M8) и фронтенд полностью собраны, покрыты
|
||||
> тестами (134 бэкенд-теста), единый Docker-образ и docker-compose стек проверены живьём. История
|
||||
> этапов — [`docs/roadmap.md`](docs/roadmap.md); там же — раздел Backlog с тем, что осознанно
|
||||
> оставлено за рамками MVP (тарифы, лимиты трафика/срока на конфиг, полное самообслуживание в боте и т.д.).
|
||||
|
||||
## Документация (single source of truth)
|
||||
|
||||
@@ -28,9 +30,12 @@
|
||||
|
||||
- **Backend**: C# / .NET 10, ASP.NET Core Web API, Clean Architecture, CQRS (**собственный тонкий
|
||||
диспетчер**, без MediatR), EF Core 10 + Npgsql (PostgreSQL), ASP.NET Core Identity + JWT, SignalR,
|
||||
FluentValidation, Mapster, **Serilog** (логирование).
|
||||
- **Frontend**: React 19 + Vite + TypeScript, TanStack Query/Router, shadcn/ui + Tailwind CSS v4,
|
||||
Zustand, react-hook-form + zod, @microsoft/signalr, Recharts. Пакетный менеджер — pnpm.
|
||||
FluentValidation, **Serilog** (логирование). Маппинг DTO — вручную (`FromDomain(...)`), Mapster в
|
||||
проект не попал. OpenAPI — нативный `Microsoft.AspNetCore.OpenApi` + Scalar UI, без Swashbuckle.
|
||||
- **Frontend**: React 19 + Vite + TypeScript, TanStack Query/Router, shadcn-стиль поверх Radix +
|
||||
Tailwind CSS v4, Zustand (только auth-стор), react-hook-form + zod, @microsoft/signalr. Пакетный
|
||||
менеджер — pnpm, линтер — oxlint. `recharts`/`@tanstack/react-table` установлены, но не
|
||||
используются в MVP (статистика — карточками, таблицы — руками).
|
||||
- **Telegram**: Telegram.Bot, бот как `BackgroundService` **в процессе Api** (long polling).
|
||||
- **Инфра**: единый Docker-образ (API + бот + статика SPA) + PostgreSQL в docker-compose.
|
||||
|
||||
@@ -95,11 +100,14 @@
|
||||
Восстановление пароля: через привязанный Telegram (self-service), без привязки — сброс админом
|
||||
(`ResetUserPasswordCommand`). Пока Telegram не привязан — UI настойчиво предлагает его привязать.
|
||||
- **Сидинг из env**: идемпотентный `DbInitializer` на старте создаёт системные роли и учётку админа
|
||||
(username/пароль/Telegram id) из переменных окружения; каталог приложений `ClientApp` (если пуст) —
|
||||
из [`seed/client-apps.json`](seed/client-apps.json). Единый источник примера env — [`.env.example`](.env.example);
|
||||
при добавлении новой настройки обновляй и его. Секреты (пароль админа, JWT-ключ, BotToken) — только через env/secret-store.
|
||||
- Telegram id админов (`AdminSeed__TelegramUserIds`) авторизуют админ-действия в боте и получают
|
||||
уведомления о запросах активации.
|
||||
(`AdminSeed__Username`/`AdminSeed__Password`) из переменных окружения; каталог приложений `ClientApp`
|
||||
(если пуст) — из [`seed/client-apps.json`](seed/client-apps.json). Единый источник примера env —
|
||||
[`.env.example`](.env.example); при добавлении новой настройки обновляй и его. Секреты (пароль
|
||||
админа, JWT-ключ, `Telegram__BotToken`) — только через env/secret-store.
|
||||
- Telegram id админов — **отдельно от сидинга**, `Telegram__AdminTelegramUserIds` (через запятую),
|
||||
читается `TelegramOptions` напрямую при каждой проверке, не пишется в БД. Именно он авторизует
|
||||
админ-кнопки в боте и адресует уведомления о запросах активации. Seed-админ **не** привязывается к
|
||||
Telegram автоматически — привязка делается вручную в UI, как у любого пользователя.
|
||||
|
||||
## Telegram-бот
|
||||
|
||||
@@ -128,13 +136,19 @@
|
||||
|
||||
Полный список — в [backend-conventions.md](docs/backend-conventions.md). Кратко:
|
||||
|
||||
- Команды `<Verb><Noun>Command`, запросы `<Get/List><Noun>Query`, + `Handler`/`Validator`. DTO — суффикс `Dto`.
|
||||
- Команды `<Verb><Noun>Command`, запросы `<Get/List><Noun>Query`, + `Handler`/`Validator` (валидатор —
|
||||
не для каждой команды, только где есть что проверить). Application DTO — суффикс `Dto`
|
||||
(`FromDomain(...)` конвертирует из сущности); тела запросов Api-слоя — суффикс `Body`; тела ответов,
|
||||
которых нет как Application DTO — суффикс `ResponseDto`.
|
||||
- Application организована **по фичам** (feature folders) внутри слоёв.
|
||||
- Один публичный тип на файл, имя файла = имя типа. Async-методы — суффикс `Async` + `CancellationToken`.
|
||||
- Секреты не логировать; логи структурные (Serilog) с `UserId`/`NodeId`/`ConfigId`/`CorrelationId`.
|
||||
- Ошибки API — единый `ProblemDetails`.
|
||||
- Один публичный тип на файл, имя файла = имя типа (кроме вспомогательных `Body`/`ResponseDto`
|
||||
records — они живут в том же файле, что и класс эндпоинтов). Async-методы — суффикс `Async` + `CancellationToken`.
|
||||
- Секреты не логировать; логи — Serilog (`UseSerilogRequestLogging` + `Enrich.FromLogContext()`).
|
||||
Явного обогащения `UserId`/`NodeId`/`ConfigId`/`CorrelationId` пока нет — не полагайся на него при
|
||||
расследовании, пока не добавлено.
|
||||
- Ошибки API — единый `application/problem+json` (без Swashbuckle — нативный `Microsoft.AspNetCore.OpenApi`).
|
||||
|
||||
## Команды (ожидаемые — появятся по мере создания проектов)
|
||||
## Команды
|
||||
|
||||
Backend (из `backend/`):
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user