navigator.clipboard is undefined on non-HTTPS origins — add execCommand fallback. Also sync CLAUDE.md with actual project structure (Dockerfiles, nginx, CI, correct API/button descriptions). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
77 lines
2.7 KiB
Markdown
77 lines
2.7 KiB
Markdown
# Blood Brain Barrier
|
||
|
||
**Репозиторий:** https://git.mikhailkilin.ru/killingdruid/blood-brain-barrier
|
||
|
||
Веб-приложение для хранения текстовых записей. Пользователь вводит текст через textarea, сохраняет в PostgreSQL, просматривает список всех записей с возможностью удаления и копирования.
|
||
|
||
## Стек
|
||
|
||
- **Frontend:** React + TypeScript + Vite
|
||
- **Backend:** Rust (Axum + SQLx)
|
||
- **БД:** PostgreSQL
|
||
- **Async runtime:** Tokio
|
||
|
||
## Структура проекта
|
||
|
||
```
|
||
blood-brain-barrier/
|
||
├── frontend/ # React-приложение (Vite)
|
||
│ ├── src/
|
||
│ │ ├── App.tsx # Основной компонент: textarea + список записей
|
||
│ │ ├── api.ts # Функции для запросов к API
|
||
│ │ └── main.tsx
|
||
│ ├── Dockerfile # Сборка фронтенда + nginx
|
||
│ ├── nginx.conf # Конфиг nginx для раздачи SPA и проксирования API
|
||
│ └── package.json
|
||
├── backend/ # Rust API (Axum)
|
||
│ ├── src/
|
||
│ │ ├── main.rs # Точка входа, подключение к БД, CORS, запуск сервера
|
||
│ │ ├── db.rs # Подключение к PostgreSQL, init_db
|
||
│ │ └── routes.rs # Хендлеры API
|
||
│ ├── Dockerfile # Сборка бэкенда
|
||
│ └── Cargo.toml
|
||
├── .woodpecker.yml # CI pipeline
|
||
├── docker-compose.yml # PostgreSQL
|
||
└── CLAUDE.md
|
||
```
|
||
|
||
## База данных
|
||
|
||
Одна таблица `entries`:
|
||
|
||
```sql
|
||
CREATE TABLE entries (
|
||
id SERIAL PRIMARY KEY,
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||
content TEXT NOT NULL
|
||
);
|
||
```
|
||
|
||
## API
|
||
|
||
| Метод | Путь | Описание |
|
||
|--------|------------------|-------------------------|
|
||
| GET | /api/entries | Список записей (id, created_at — без content) |
|
||
| POST | /api/entries | Создать запись |
|
||
| DELETE | /api/entries/:id | Удалить запись по id |
|
||
| GET | /api/entries/:id/content | Получить контент записи (plain text) |
|
||
|
||
## Frontend
|
||
|
||
- Сверху: большая `<textarea>` + кнопка "Create"
|
||
- Ниже: список всех записей (новые сверху), у каждой кнопки "Delete" и "Copy"
|
||
- Копирование — через `navigator.clipboard.writeText()`
|
||
|
||
## Команды
|
||
|
||
```bash
|
||
# Frontend
|
||
cd frontend && npm run dev
|
||
|
||
# Backend
|
||
cd backend && cargo run
|
||
|
||
# PostgreSQL
|
||
docker-compose up -d
|
||
```
|