diff --git a/books.db b/books.db index 872abe9..fa36490 100644 Binary files a/books.db and b/books.db differ diff --git a/index.js b/index.js index a7c86bf..35f0b58 100644 --- a/index.js +++ b/index.js @@ -18,6 +18,7 @@ const credentials = { key: privateKey, cert: certificate }; // Middleware to parse JSON bodies app.use(express.json()); // Use built-in body-parser for JSON +// Set up the SQLite database // Set up the SQLite database const db = new sqlite3.Database('./books.db', (err) => { if (err) { @@ -31,15 +32,26 @@ const db = new sqlite3.Database('./books.db', (err) => { title TEXT, authors TEXT, publishedDate TEXT, - description TEXT + description TEXT, + url TEXT, + number_of_pages INTEGER, + identifiers TEXT, + publishers TEXT, + subjects TEXT, + notes TEXT, + cover_small TEXT, + cover_medium TEXT, + cover_large TEXT ) `); } }); + // Serve static files from the 'public' directory app.use(express.static(path.join(__dirname, 'public'))); +// Endpoint to fetch book details by ISBN // Endpoint to fetch book details by ISBN app.get('/book/:isbn', async (req, res) => { const { isbn } = req.params; @@ -52,7 +64,6 @@ app.get('/book/:isbn', async (req, res) => { if (bookData) { console.log('Book data found in Open Library'); - console.log(bookData); res.json(formatOpenLibraryData(bookData)); } else { // Fallback to Internet Archive if no data from Open Library @@ -72,23 +83,78 @@ app.get('/book/:isbn', async (req, res) => { }); + +// Endpoint to store book in the database +// Endpoint to store book in the database // Endpoint to store book in the database app.post('/store-book', (req, res) => { - const { isbn, title, authors, publishedDate, description } = req.body; + const { + isbn, title, authors, publishedDate, description, url, + number_of_pages, identifiers, publishers, subjects, + notes, cover_small, cover_medium, cover_large + } = req.body; - const query = `INSERT INTO books (isbn, title, authors, publishedDate, description) VALUES (?, ?, ?, ?, ?)`; - const params = [isbn, title, authors ? authors.join(', ') : '', publishedDate, description || '']; - - db.run(query, params, function (err) { + // Check if a book with the same ISBN already exists + const checkQuery = `SELECT * FROM books WHERE isbn = ?`; + db.get(checkQuery, [isbn], (err, row) => { if (err) { - console.error('Error storing book in database:', err); - res.status(500).json({ error: 'Failed to store book in database' }); + console.error('Error checking for existing book:', err); + return res.status(500).json({ error: 'Failed to check for existing book' }); + } + + if (row) { + // Book already exists, update the existing record + const updateQuery = ` + UPDATE books + SET title = ?, authors = ?, publishedDate = ?, description = ?, url = ?, + number_of_pages = ?, identifiers = ?, publishers = ?, subjects = ?, + notes = ?, cover_small = ?, cover_medium = ?, cover_large = ? + WHERE isbn = ? + `; + + const updateParams = [ + title, authors ? authors.join(', ') : '', publishedDate, description || '', + url, number_of_pages, identifiers, publishers, subjects, + notes, cover_small, cover_medium, cover_large, isbn + ]; + + db.run(updateQuery, updateParams, function (err) { + if (err) { + console.error('Error updating book in database:', err); + return res.status(500).json({ error: 'Failed to update book in database' }); + } else { + res.json({ success: true, message: 'Book updated successfully' }); + } + }); } else { - res.json({ success: true, message: 'Book stored successfully', bookId: this.lastID }); + // Book does not exist, insert a new record + const insertQuery = ` + INSERT INTO books ( + isbn, title, authors, publishedDate, description, url, + number_of_pages, identifiers, publishers, subjects, + notes, cover_small, cover_medium, cover_large + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + `; + + const insertParams = [ + isbn, title, authors ? authors.join(', ') : '', publishedDate, description || '', + url, number_of_pages, identifiers, publishers, subjects, + notes, cover_small, cover_medium, cover_large + ]; + + db.run(insertQuery, insertParams, function (err) { + if (err) { + console.error('Error storing book in database:', err); + return res.status(500).json({ error: 'Failed to store book in database' }); + } else { + res.json({ success: true, message: 'Book stored successfully', bookId: this.lastID }); + } + }); } }); }); + function formatOpenLibraryData(data) { return { isbn: data.identifiers.isbn_13 ? data.identifiers.isbn_13[0] : '', @@ -96,16 +162,38 @@ function formatOpenLibraryData(data) { authors: data.authors ? data.authors.map(author => author.name) : [], publishedDate: data.publish_date, description: data.excerpts ? data.excerpts[0].text : 'No description available', + url: data.url, + number_of_pages: data.number_of_pages || null, + identifiers: JSON.stringify(data.identifiers), // Store as JSON string + publishers: data.publishers ? data.publishers.map(pub => pub.name).join(', ') : '', + subjects: data.subjects ? data.subjects.map(sub => sub.name).join(', ') : '', + notes: data.notes || '', + cover_small: data.cover ? data.cover.small : '', + cover_medium: data.cover ? data.cover.medium : '', + cover_large: data.cover ? data.cover.large : '' }; } + function formatArchiveData(data) { return { isbn: data.isbn ? data.isbn[0] : '', title: data.title, - authors: data.creator, - publishedDate: data.date, - description: data.description ? data.description[0] : 'No description available', + authors: data.contributor ? [data.contributor] : [], + publishedDate: data.date ? new Date(data.date).getFullYear() : '', + description: data.description ? data.description.join(' ') : 'No description available', + url: `https://archive.org/details/${data.identifier}`, + number_of_pages: data.imagecount || null, + identifiers: JSON.stringify({ + archive_identifier: data.identifier, + oclc: data['external-identifier'] ? data['external-identifier'].filter(id => id.includes('urn:oclc')).map(id => id.split(':')[2]) : [] + }), + publishers: data.publisher || '', + subjects: data.subject ? data.subject.join(', ') : '', + notes: '', // Archive data does not provide specific notes like Open Library + cover_small: '', // Placeholder, as cover image URLs need to be constructed manually + cover_medium: '', // Same as above + cover_large: '' // Same as above }; } diff --git a/public/index.html b/public/index.html index aaef4a7..22b5eaa 100644 --- a/public/index.html +++ b/public/index.html @@ -21,7 +21,10 @@