Source: routes/v1/book-info.js

/** @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;
}