/** @module routes/v1 */
// Register router
const { authorize } = require('../../utils.js');
const express = require('express');
const router = express.Router();
const { ISBNFactory, ISBN } = require('../../classes/books/ISBN.js');
const EditionController = require('../../controllers/EditionController.js');
const { EditionFactory } = require('../../classes/books/Edition.js');
/** Route for getting book information */
router.get('/book', async (req, res) => {
if (!await authorize(['search.book'], req, res)) {
return;
}
let isbnString = req.query.isbn;
if (!isbnString) {
res.status(400).send({ message: 'Missing ISBN' });
return;
}
const isbn = await new ISBNFactory().setISBN(isbnString).create();
if (!isbn) {
res.status(400).send({ message: 'Invalid ISBN' });
return;
}
const bookInfo = await getBookInfo(isbn);
if (!bookInfo) {
res.status(404).send({ message: 'Book not found' });
return;
}
res.send(bookInfo);
});
module.exports = router;
// Functions
/**
* Get book information via ISBN from the database
*
* @param {ISBN} isbn
* @returns {Promise<object | null>}
*/
async function getBookInfo(isbn) {
const editionDbRecord = await new EditionController().byISBN(isbn);
if (!editionDbRecord) {
return null;
}
const edition = await new EditionFactory().load(editionDbRecord).create();
const book = await edition.getBook();
const authors = await book.getAuthors();
const result = {
title: book.title,
authors: authors.map(author => author.name),
};
return result;
}