BOOK-LIBRARY: обзор и сценарии

BOOK-LIBRARY решает спокойную прикладную задачу: собрать электронные книги в каталог, где читатель видит понятные категории и карточки, а администратор может пополнять коллекцию без ручного ведения отдельных HTML-страниц.

Проект не пытается быть полноценным книжным маркетплейсом или социальной сетью. По коду и документации это именно библиотечный каталог с загрузкой файлов, хранением метаданных и скачиванием книг.

Сценарий читателя

Публичная часть начинается с главной страницы frontend/src/routes/+page.svelte: она запрашивает /api/categories и показывает сетку категорий. В карточке категории есть emoji, название и описание. Если категорий нет, интерфейс честно предлагает зайти в админку и создать их.

Дальше читатель открывает страницу категории frontend/src/routes/categories/[id]/+page.svelte. Там приложение:

  1. загружает список категорий, чтобы показать название текущей;
  2. запрашивает книги через /api/categories/:id/books;
  3. выводит обложку, порядковый номер, название, автора, описание и кнопку скачивания.

Скачивание устроено не прямой ссылкой на файл. Frontend отправляет POST /api/download/book/:id, backend проверяет, что книга существует, создаёт временный токен и возвращает URL вида /download/temp/:token. Такой подход удобен для каталога: публичный интерфейс не раскрывает постоянный путь к файлу книги.

Сценарий администратора

Админская часть закрыта авторизацией. Вход реализован через /api/admin/login: backend сравнивает логин из окружения и bcrypt-хэш пароля, после чего сохраняет состояние в session cookie.

После входа администратор может:

  • создавать категории с названием, описанием и emoji;
  • удалять категории вместе с книгами внутри;
  • добавлять одну книгу через форму;
  • редактировать название, автора, описание, категорию и обложку;
  • удалять отдельные книги;
  • загружать ZIP-архив для пакетного импорта.

В интерфейсе админки отдельно виден сценарий пакетной загрузки. Форма отправляет архив на /api/admin/books/batch, а ответ приходит как NDJSON-поток. Это позволяет показывать прогресс: сколько файлов найдено, какой файл обрабатывается, сколько книг импортировано, пропущено или завершилось ошибкой.

Где появляется автоимпорт

При одиночной загрузке книги форма прямо подсказывает, что поля можно оставить пустыми: система попробует заполнить их автоматически. Это подтверждается backend-контроллером createBook: если не хватает title, author, description, cover или categoryId, запускается processBookFile.

Автоимпорт делает несколько практичных вещей:

  • пытается извлечь метаданные и фрагмент текста из файла;
  • передаёт данные в LLM, чтобы восстановить название, автора, описание и категорию;
  • ищет подходящую обложку;
  • если LLM предложила новую категорию, backend может создать её автоматически.

Это полезно при большой коллекции, где руками заполнять каждую карточку долго. При этом результат всё равно лучше воспринимать как черновик: описание, категория и обложка могут требовать ручной проверки.

Что важно для портфолио

В этом проекте хорошо видна практичная связка нескольких слоёв:

  • пользовательский каталог на SvelteKit;
  • админские формы и защищённые маршруты;
  • Express API;
  • SQLite как простое хранилище метаданных;
  • файловое хранилище книг и обложек;
  • LLM-помощник для заполнения карточек;
  • legacy-страницы на EJS для более простого HTML-доступа.

Главная ценность проекта — не в сложности интерфейса, а в том, что он закрывает полный рабочий цикл: загрузить книги, привести их к карточкам, разложить по категориям и дать пользователю понятную страницу скачивания.