# Blood Brain Barrier **Репозиторий:** https://git.mikhailkilin.ru/killingdruid/blood-brain-barrier Веб-приложение для управления проектами с текстовыми полями и файлами. Главная страница — список проектов, клик по проекту — страница проекта с полями (local, corp), textarea (content) и загрузкой файлов в MinIO S3. ## Стек - **Frontend:** React + TypeScript + Vite - **Backend:** Rust (Axum + SQLx + rust-s3) - **БД:** PostgreSQL - **Файлы:** MinIO S3 - **Async runtime:** Tokio ## Структура проекта ``` blood-brain-barrier/ ├── frontend/ # React-приложение (Vite) │ ├── src/ │ │ ├── App.tsx # Две view: ProjectList + ProjectPage │ │ ├── api.ts # Функции для запросов к API │ │ ├── App.css # Стили │ │ └── main.tsx │ ├── Dockerfile # Сборка фронтенда + nginx │ ├── nginx.conf # Nginx: SPA + проксирование API (110MB limit) │ └── package.json ├── backend/ # Rust API (Axum) │ ├── src/ │ │ ├── main.rs # Точка входа, AppState, роуты │ │ ├── db.rs # Подключение к PostgreSQL, init_db │ │ ├── s3.rs # Инициализация MinIO S3 bucket │ │ └── routes.rs # Хендлеры API (projects + файлы) │ ├── Dockerfile # Сборка бэкенда │ └── Cargo.toml ├── .woodpecker.yml # CI pipeline ├── docker-compose.yml # PostgreSQL └── CLAUDE.md ``` ## База данных ```sql CREATE TABLE IF NOT EXISTS projects ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, local TEXT NOT NULL DEFAULT '', corp TEXT NOT NULL DEFAULT '', content TEXT NOT NULL DEFAULT '', file_name TEXT, file_key TEXT, file_size BIGINT, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); ``` ## API | Метод | Путь | Описание | |--------|----------------------------|---------------------------------------| | GET | /api/projects | Список проектов (id, name, created_at)| | POST | /api/projects | Создать проект (JSON: {name}) | | GET | /api/projects/:id | Получить проект целиком | | PUT | /api/projects/:id | Обновить (multipart: local, corp, content, file?) | | DELETE | /api/projects/:id | Удалить проект + файл из S3 | | GET | /api/projects/:id/file | Скачать файл | | GET | /api/projects/:id/content | Получить content (plain text) | ## Frontend - **Главная:** список проектов + инпут для создания нового - **Страница проекта:** поля Local/Corp, textarea Content, загрузка файла, кнопки Save/Copy text/Download file/Delete ## Команды ```bash # Frontend cd frontend && npm run dev # Backend cd backend && cargo run # PostgreSQL docker-compose up -d ``` ## Env vars (backend) - `DATABASE_URL` — PostgreSQL connection string - `S3_ENDPOINT` — MinIO endpoint (default: http://localhost:9000) - `S3_ACCESS_KEY` — MinIO access key (default: minioadmin) - `S3_SECRET_KEY` — MinIO secret key (default: minioadmin) - `S3_BUCKET` — bucket name (default: bbb) - `S3_REGION` — S3 region (default: us-east-1)