Backend для приложения районной библиотеки: каталог и выдача книг, читательские клубы, мероприятия, отзывы и книжные дуэли. Проект построен на Express, Sequelize и SQLite, поэтому локально поднимается без отдельного сервера базы.
Главная часть этой версии — явная модель доступа. Публичная регистрация всегда создаёт читателя. Каталогом, выдачами, статистикой и пользовательским справочником может управлять только библиотекарь, а новости и мероприятия клуба — только его создатель.
- JWT-аутентификация с ограниченным сроком жизни токена;
- роли
readerиlibrarianс проверкой по актуальной записи в базе; - каталог, поиск по автору и ключевым словам;
- выдача, возврат, два продления и блокировка продления;
- статистика активных, просроченных и завершённых выдач;
- клубы с сообщениями, новостями, событиями и рейтингом;
- события, отзывы и книжные дуэли;
- опциональные quiz endpoints и push-уведомления;
- health check, интеграционные тесты и CI.
Нужны Node.js 20+ и инструменты сборки для пакета sqlite3.
git clone https://github.com/ivanpukhov/library.git
cd library
npm install
cp .env.example .envЗамените JWT_SECRET на случайную строку длиной не меньше 32 символов, затем:
npm startAPI будет доступен на http://127.0.0.1:3001. В development-режиме с
автоперезапуском используйте npm run dev.
| Переменная | По умолчанию | Назначение |
|---|---|---|
HOST |
127.0.0.1 |
Адрес сервера |
PORT |
3001 |
Порт HTTP API |
DB_STORAGE |
./database.sqlite |
SQLite-файл или :memory: |
CORS_ORIGIN |
http://localhost:3000 |
Разрешённые origins через запятую |
JWT_SECRET |
— | Ключ подписи, минимум 32 символа |
JWT_EXPIRES_IN |
2h |
Срок жизни access token |
OPENAI_API_KEY |
— | Только для книжных quiz endpoints |
NOTIFICATIONS_ENABLED |
false |
Разрешить Expo push |
REMINDERS_ENABLED |
false |
Запустить ежедневные напоминания |
Внешние интеграции по умолчанию выключены, поэтому тестовый запуск ничего не отправляет за пределы процесса.
public registration ──► reader
├─ own loans, reviews, events
└─ clubs and reading duels
admin promotion ──────► librarian
├─ catalogue management
├─ book issue and renewal policy
└─ statistics and reader directory
Роль не берётся из тела регистрации и не доверяется полю внутри JWT: middleware каждый раз загружает текущую роль пользователя из базы. Повышение до библиотекаря должно выполняться отдельным административным процессом, которого нет в публичном API.
Полный список endpoints и примеры запросов находятся в docs/API.md.
npm testИнтеграционные тесты используют SQLite in-memory и проверяют регистрацию, аутентификацию, запрет самовыбора роли, отказ читателю на административном route и успешную операцию библиотекаря.
Это backend-прототип, а не готовая библиотечная информационная система. Перед
production нужны миграции вместо sequelize.sync, rate limiting, refresh tokens,
аудит административных действий и отдельная панель управления ролями.
Лицензия: MIT.