# Читальня — онлайн-платформа для книжного клуба

Веб-приложение для организации работы книжного клуба: клубы, список чтения
с голосованием за следующую книгу, расписание встреч и обсуждение.

- **Бэкенд:** Go 1.22 (только стандартная библиотека). REST API, хранилище в
  памяти с персистентностью в JSON-файл. Логику хранения легко заменить на
  SQLite/Postgres — она спрятана за типом `Store`.
- **Фронтенд:** React 18 + Vite. Без внешних UI-библиотек.

## Структура

```
bookclub/
├── backend/
│   ├── main.go        # сервер, маршруты, CORS, раздача статики
│   ├── handlers.go    # HTTP-обработчики
│   ├── store.go       # хранилище + персистентность + демо-данные
│   ├── models.go      # модели предметной области
│   └── go.mod
└── frontend/
    ├── src/
    │   ├── App.jsx
    │   ├── api.js          # обёртка над fetch
    │   ├── helpers.js      # форматирование дат и т.п.
    │   ├── styles.css
    │   └── components/     # ClubsPage, ClubPage, BooksTab, ...
    ├── index.html
    ├── vite.config.js
    └── package.json
```

## Запуск для разработки

Нужны Go 1.22+ и Node 18+.

**1. Бэкенд** (терминал 1):

```bash
cd backend
go run .
# слушает http://localhost:8080, данные в backend/bookclub-data.json
```

**2. Фронтенд** (терминал 2):

```bash
cd frontend
npm install
npm run dev
# открыть http://localhost:5173
```

Vite проксирует запросы `/api/*` на бэкенд (порт 8080), CORS уже настроен.

## Сборка в один бинарник (production)

Собранный фронтенд можно положить в `backend/static/` — Go-сервер раздаст его
сам, отдельный веб-сервер не нужен:

```bash
cd frontend && npm run build      # появится frontend/dist
cp -r frontend/dist backend/static
cd ../backend && go build -o bookclub .
./bookclub                        # всё на http://localhost:8080
```

Переменные окружения: `ADDR` (по умолчанию `:8080`),
`DATA_PATH` (по умолчанию `bookclub-data.json`).

## REST API

| Метод  | Путь                              | Действие                       |
|--------|-----------------------------------|--------------------------------|
| GET    | `/api/clubs`                      | список клубов                  |
| POST   | `/api/clubs`                      | создать клуб                   |
| GET    | `/api/clubs/{id}`                 | клуб по id                     |
| GET    | `/api/clubs/{id}/members`         | участники                      |
| POST   | `/api/clubs/{id}/members`         | вступить (`{name}`)            |
| GET    | `/api/clubs/{id}/books`           | список чтения                  |
| POST   | `/api/clubs/{id}/books`           | предложить книгу               |
| POST   | `/api/books/{bookId}/vote`        | голос за/против (`{voter}`)    |
| PATCH  | `/api/books/{bookId}/status`      | сменить статус (`{status}`)    |
| GET    | `/api/clubs/{id}/meetings`        | встречи                        |
| POST   | `/api/clubs/{id}/meetings`        | назначить встречу              |
| GET    | `/api/clubs/{id}/posts`           | сообщения обсуждения           |
| POST   | `/api/clubs/{id}/posts`           | написать сообщение             |

Статусы книги: `suggested` → `reading` → `finished`.

При первом запуске создаётся демо-клуб с книгами, встречей и участниками.
```
