Files
blood-brain-barrier/CLAUDE.md
Mikhail Kilin 570e0ca643
All checks were successful
ci/woodpecker/push/build Pipeline was successful
Rewrite app: entries → projects with S3 file storage
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>
2026-03-18 13:50:28 +03:00

3.7 KiB
Raw Permalink Blame History

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 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)