From 63dfe85832e3fcd9c83020a9aa4c495740bb913f Mon Sep 17 00:00:00 2001 From: BlipRanger <1860540+BlipRanger@users.noreply.github.com> Date: Sat, 31 Aug 2024 11:44:20 -0400 Subject: [PATCH] Add locations --- backup/books.db | Bin 0 -> 221184 bytes books.db | Bin 221184 -> 450560 bytes index.js | 278 +++++++++++++++++++++++++++++++------------- public/library.html | 97 ++++++++++++++++ public/script.js | 16 ++- 5 files changed, 306 insertions(+), 85 deletions(-) create mode 100644 backup/books.db create mode 100644 public/library.html diff --git a/backup/books.db b/backup/books.db new file mode 100644 index 0000000000000000000000000000000000000000..75ac5f7a6383f0c5c0596c6e21ca3cf6d3b7d8ce GIT binary patch literal 221184 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໵TduhO2=m>TM~mg(IT*K(pBgj(=c2}w8NXarT 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 delta 4150 zcmeHJYit}>6`sdF?6ucpJ9SLrm|U+&6UXcIz8@idY;04ziIa5WKuwZbvpaWphRn`g z&%?%v(zTOT6iQ2q8bH01-ch8xH_j?xJ_nzI{$t*Jr6NkT*hkeZ-rn3S4M_!oYyeAm% zhu#y_4&?DJo$zKnFN9ckcXv1YQhMoBTW>i_$Z-Sh@Sq1CMMC5ICr6(e&7gys@riV1 z3hf=8Lg~Yk2gdggXGSMR_fPuQt}?P3njC$09h0e;DqdqN+hIk^l!`%g)spJ*>f4P1t zz_7Ak!#T6D*YcVaYQzKv>*p{>W`U+r6xDUMQqO~pC}K&mivQDzD(VHuWiOo7eH8kg zpqg;oO{%B(Qfqr^fC!3^6OIXA5uOqD3ZudkLQ04TgTi*9Pv{Z41VLyP__n)kx7%)l z$}Y0yZ_jaEjCZK7>y;-KdG54(k$>UX$(fm%39Mr@EbEG4Dx#*C^TUBd0kjX#DMl!j zijO0)h)jK6(F#bWP?MmNj%Oj`NYv(uhLIuGt)`5Tjv)#2C{GBL1~O&3%#=kFl}nhE zKx!m!VvR0AVwPAY8dHk9(DK6f$Cnq*7wLLwo`w)}Ib1T))7Y>KB*F(3z-FQ%(M1)R zSj+(#KgxoKaU>B9Rs$byx4;0S0a%bzu9{9!7;^t7r~D^`9%;fT{r}LiZ!05}^r^5H1w# zr8>f@fvMe&kuB5hVl;wh6_t`6!>SrUQ^c}2UlfmHG*2uY`O&aRqJ`#n*)(;UbN!--GAr#jC>&l*gFrQUX7XHT#Gz!Ax1QnNr25 zfB{+21J40TJGUTaR1!^{Xo^8qs}aq>@M-9jrXh=|VMU6vMK{`zV*NN};76URIB!CV zfD$Qz*g=Jsv9XSjKspqmXmATaMP%v8nr|qailw5V(8LhEi_@#`BJ=B$z5*c9qQnH|&f&O&5{@$)=iCOg%QH@X^X|13tR2_}310nDEl2-itLFwze zz2`@~-%lm|Rj#W%2Gxz|5O=ap@6sn+0rMG~;=tl>#IvicYHKt_hySwx=+x*`} z_44C~qD9>)uyP%azVzy3(M}%VeI8Hc?!UOtx#8qdC>5*B{E~gN61>ei_*ghzS^O3| z=t@Q5Yq;{v%iMrFV*jX~+Z5nJQ1gGocn7z2J$8yaZEZahIb19j$3a25213qRs%hzX zM4Sa}9fXpE^~&GU{O--ER3aIUP7JLeryEGNyK-%g-7pXghZ4aMmC1by3x^}&STg4G z`y!yPU@!@Y>bY(=SN%?JmfZqmVv9#%j4mF5F|zn9jN!!$jG?8@tyi}-Blz0X1B1H@ z23H#l&Sn@K4*KfD3ZF2-C(x4qEWCEmy~V@w-CX@`hxwz|bBS@dmKpD>uH~jTT3!NB z2ludVJ?vW#`aSD$q78sJ9cMejE)4;QxseBD`;@V&(Ujx!s9KG?q-oCx#jxrfm=GrU$xW zED?#MXvqpCL-BYpT459HBhGL%5{Xwr*SX$~U?dTX1w+wz(03-zZD71hAM^}VU0c4% zR)4T*`)8=cPRwwfv`jkr8;s|j=BrH~xIW@9gNE%Q`(A$9Uf5Ft>xNb-c;`gH3)R3toD*Gc=g}?7?Kt zQuBK(9o{ieM$G52`b7~?!-K0(OMR)H+TriA7rm{$jJMjf(|yK#Y z9Ke*|UoWsbYCC_*{vqMH#kB5ke!KZ`?iRq7x!T9e>^_%M`g#YzhOV=|8otiH { + console.log('Connection has been established successfully.'); + }) + .catch(err => { + console.error('Unable to connect to the database:', err); + }); + // TODO: Add physical location of book to database + const Book = sequelize.define('Book', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + isbn: { + type: DataTypes.TEXT, + allowNull: false, + unique: true, + }, + title: { + type: DataTypes.TEXT, + allowNull: false, + }, + authors: { + type: DataTypes.TEXT, + }, + publishedDate: { + type: DataTypes.TEXT, + }, + description: { + type: DataTypes.TEXT, + }, + url: { + type: DataTypes.TEXT, + }, + number_of_pages: { + type: DataTypes.INTEGER, + }, + identifiers: { + type: DataTypes.TEXT, + }, + publishers: { + type: DataTypes.TEXT, + }, + subjects: { + type: DataTypes.TEXT, + }, + notes: { + type: DataTypes.TEXT, + }, + cover_small: { + type: DataTypes.TEXT, + }, + cover_medium: { + type: DataTypes.TEXT, + }, + cover_large: { + type: DataTypes.TEXT, + }, + location_id: { + type: DataTypes.INTEGER, + references: { + model: Location, + key: 'id' + } + } + }, { + tableName: 'books', + timestamps: false, // If your table doesn't have `createdAt` and `updatedAt` + }); + +const Location = sequelize.define('Location', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + name: { + type: DataTypes.TEXT, + allowNull: false, + }, + shelf: { + type: DataTypes.TEXT, + allowNull: false, + } +}, { + tableName: 'locations', + timestamps: false, // If your table doesn't have `createdAt` and `updatedAt` +}); + + + + // Set up the SQLite database const db = new sqlite3.Database('./books.db', (err) => { if (err) { @@ -51,14 +154,22 @@ const db = new sqlite3.Database('./books.db', (err) => { // 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; console.log(`Fetching book data for ISBN: ${isbn}`); try { - // First try Google Books + // First, check if the book is in the local database + const book = await Book.findOne({ where: { isbn } }); + + if (book) { + console.log('Book found in the local database'); + res.json({ source: 'local', data: book }); + return; + } + + // If not found locally, try Google Books const apiKey = 'AIzaSyCQikthZ5TlkFTcKTG8n171dRafosK2Mg8'; const googleBooksResponse = await axios.get(`https://www.googleapis.com/books/v1/volumes?q=${isbn}&key=${apiKey}`); @@ -77,7 +188,7 @@ app.get('/book/:isbn', async (req, res) => { if (googleBooksResponse.data.items && googleBooksResponse.data.items.length > 0) { const googleBookData = googleBooksResponse.data.items[0]; console.log('Book data found in Google Books'); - res.json(formatGoogleBooksData(googleBookData)); + res.json({ source: 'external', data: formatGoogleBooksData(googleBookData) }); return; } else { console.log('Book not found in Google Books'); @@ -101,7 +212,7 @@ app.get('/book/:isbn', async (req, res) => { if (bookData) { console.log('Book data found in Open Library'); - res.json(formatOpenLibraryData(bookData)); + res.json({ source: 'external', data: formatOpenLibraryData(bookData) }); return; } else { console.log('Book not found in Open Library'); @@ -113,7 +224,7 @@ app.get('/book/:isbn', async (req, res) => { if (archiveData) { console.log('Book data found in the Internet Archive'); - res.json(formatArchiveData(archiveData)); + res.json({ source: 'external', data: formatArchiveData(archiveData) }); } else { console.log('Book not found in the Internet Archive'); res.status(404).json({ error: 'Book not found' }); @@ -126,20 +237,39 @@ app.get('/book/:isbn', async (req, res) => { - -// Endpoint to search for book by title app.get('/search-title', async (req, res) => { - const { title } = req.query; - console.log(`Searching for book by title: ${title}`); + const { title, internalOnly=false } = req.query; + console.log(`Searching for books by title or related fields: ${title}`); try { - // Search Open Library by title, limit to 5 results + // First, search in the local database across all relevant fields + const localBooks = await Book.findAll({ + where: { + [Sequelize.Op.or]: [ + { title: { [Sequelize.Op.like]: `%${title}%` } }, + { authors: { [Sequelize.Op.like]: `%${title}%` } }, + { publishers: { [Sequelize.Op.like]: `%${title}%` } }, + { description: { [Sequelize.Op.like]: `%${title}%` } }, + { subjects: { [Sequelize.Op.like]: `%${title}%` } } + ] + } + }); + + if (localBooks.length > 0) { + console.log('Books found in the local database'); + res.json({ source: 'local', results: localBooks }); + return; + } + if (internalOnly) { + res.status(404).json({ error: 'No books found with that title or related fields.' }); + return; + } + // If no results found locally, proceed to search external sources const openLibraryResponse = await axios.get(`https://openlibrary.org/search.json?q=${encodeURIComponent(title)}&limit=7`); const searchResults = openLibraryResponse.data.docs; - console.log(searchResults); if (searchResults.length > 0) { - console.log('Books found by title'); + console.log('Books found by title in external sources'); const bookData = searchResults.map(result => ({ title: result.title, authors: result.author_name || [], @@ -148,88 +278,63 @@ app.get('/search-title', async (req, res) => { publisher: result.publisher ? result.publisher[0] : '', key: result.key // Unique key to fetch more detailed data later if needed })); - console.log(bookData); - res.json({ results: bookData }); + res.json({ source: 'external', results: bookData }); } else { - res.status(404).json({ error: 'No books found with that title.' }); + res.status(404).json({ error: 'No books found with that title or related fields.' }); } } catch (error) { console.error(error); - res.status(500).json({ error: 'Failed to search for book by title' }); + res.status(500).json({ error: 'Failed to search for book by title or related fields' }); } }); // 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, url, - number_of_pages, identifiers, publishers, subjects, - notes, cover_small, cover_medium, cover_large - } = req.body; - - // 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 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 { - // 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 }); - } - }); - } - }); +app.post('/store-book', async (req, res) => { + try { + const book = await Book.create(req.body); + res.json({ success: true, book }); + } catch (error) { + console.error('Failed to store book:', error); + res.status(500).json({ error: 'Failed to store book in database' }); + } }); +app.put('/book/:isbn', async (req, res) => { + try { + const { isbn } = req.params; + const book = await Book.findOne({ where: { isbn } }); + if (book) { + await book.update(req.body); + res.json({ success: true, message: 'Book updated successfully' }); + } else { + res.status(404).json({ error: 'Book not found' }); + } + } catch (error) { + console.error('Failed to update book:', error); + res.status(500).json({ error: 'Failed to update book in database' }); + } +}); + +app.delete('/book/:id', async (req, res) => { + try { + const { id } = req.params; + const book = await Book.findByPk(id); + if (book) { + await book.destroy(); + res.json({ success: true, message: 'Book deleted successfully' }); + } else { + res.status(404).json({ error: 'Book not found' }); + } + } catch (error) { + console.error('Failed to delete book:', error); + res.status(500).json({ error: 'Failed to delete book from database' }); + } +}); + +// TODO: Function to checkout a book + +// TODO: Function to return a book function formatOpenLibraryData(data) { return { @@ -294,6 +399,11 @@ function formatGoogleBooksData(data) { const httpsServer = https.createServer(credentials, app); +sequelize.sync({ alter: true }).then(() => { + console.log('Database & tables synced!'); +}); + + httpsServer.listen(PORT, () => { console.log(`HTTPS Server running on https://localhost:${PORT}`); }); diff --git a/public/library.html b/public/library.html new file mode 100644 index 0000000..59ecc39 --- /dev/null +++ b/public/library.html @@ -0,0 +1,97 @@ + + + + + + Book Library + + + +

Book Library

+ + + + + + + + + + + + + + + +
TitleAuthorsPublisherPublished DateISBN
+ + + + diff --git a/public/script.js b/public/script.js index f42f331..5ab7f99 100644 --- a/public/script.js +++ b/public/script.js @@ -46,7 +46,7 @@ function startScanner() { alert('No camera selected or available.'); return; } - + // TODO: Limit the field of view to a smaller area for faster detection Quagga.init({ inputStream: { name: "Live", @@ -68,7 +68,11 @@ function startScanner() { } console.log("Initialization finished. Ready to start"); Quagga.start(); + + // TODO: Add a button to enable/disable torch Quagga.CameraAccess.enableTorch(); + + // TODO: Add a button to enable/disable the "locate" functionality }); Quagga.onDetected(async function (data) { @@ -79,6 +83,9 @@ function startScanner() { console.log("Detected ISBN:", isbn); Quagga.stop(); // Stop the scanner once an ISBN is detected + // TODO: Validate the ISBN before fetching book details + // Use a library like barcode-validator to validate the ISBN + // Fetch book details await fetchBookInfo(isbn); @@ -91,6 +98,10 @@ async function fetchBookInfo(isbn) { const response = await fetch(`/book/${isbn}`); const bookData = await response.json(); + // TODO: If bookData value of "source" is "local", then the book data is already in the database + // TODO: Display the book info and ask if they would like to checkout the book + + // TODO: Store scanned ISBN in a different field to check against the one we get from the API if (bookData.title) { bookData.isbn2 = isbn; // Add the ISBN to the book data promptUserWithBook(bookData); @@ -125,6 +136,9 @@ function promptUserWithBook(bookData) { } } +// TODO: Function to prompt user for physical location of the book +// Should pull from the database and allow the user to select or add a location + // Add an event listener for the search button document.getElementById('search-title').addEventListener('click', searchByTitle);