All checks were successful
ci/woodpecker/push/build Pipeline was successful
Replace flat text entries with project-based structure. Each project has name, local/corp fields, content textarea, and file upload (up to 100MB) stored in MinIO S3. New API: CRUD projects + file download + content copy. Frontend: two views (project list + project page). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3.7 KiB
3.7 KiB
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
База данных
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
Команды
# Frontend
cd frontend && npm run dev
# Backend
cd backend && cargo run
# PostgreSQL
docker-compose up -d
Env vars (backend)
DATABASE_URL— PostgreSQL connection stringS3_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)