const BookModel = require('../models/bookModel'); const multer = require('multer'); const path = require('path'); exports.getBookLists = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } const bookModel = new BookModel(req.db); try { const lists = await bookModel.getListsByUser(req.session.user.user_id); res.render('booklists', { lists, user_id: req.session.user.user_id }); } catch (error) { res.status(500).send('เกิดข้อผิดพลาดในการโหลดรายการหนังสือ'); } }; exports.postBookList = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } const { listname } = req.body; const bookModel = new BookModel(req.db); try { await bookModel.createList(listname, req.session.user.user_id); res.redirect('/booklists'); } catch (error) { res.status(500).send('เกิดข้อผิดพลาดในการเพิ่มรายการหนังสือ'); } }; exports.getEditList = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } const { list_id } = req.params; const bookModel = new BookModel(req.db); try { const lists = await bookModel.getListsByUser(req.session.user.user_id); const currentList = lists.find(list => list.list_id == list_id); res.render('edit-booklist', { list: currentList }); } catch (error) { res.status(500).send('เกิดข้อผิดพลาดในการโหลดข้อมูลรายการหนังสือ'); } }; exports.postEditList = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } const { list_id } = req.params; const { listname } = req.body; const bookModel = new BookModel(req.db); try { await bookModel.updateList(list_id, listname, req.session.user.user_id); res.redirect('/booklists'); } catch (error) { res.status(500).send('เกิดข้อผิดพลาดในการแก้ไขรายการหนังสือ'); } }; exports.deleteBookList = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } const { list_id } = req.params; const bookModel = new BookModel(req.db); try { await bookModel.deleteList(list_id, req.session.user.user_id); res.redirect('/booklists'); } catch (error) { res.status(500).send('เกิดข้อผิดพลาดในการลบรายการหนังสือ'); } }; exports.getBooks = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } const { list_id } = req.params; const bookModel = new BookModel(req.db); try { const books = await bookModel.getBooksByList(list_id); res.render('books', { books, list_id }); // เพิ่ม list_id } catch (error) { res.status(500).send('เกิดข้อผิดพลาดในการโหลดหนังสือ'); } }; exports.getAddBook = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } const { list_id } = req.params; res.render('addbook', { list_id, isEditing: false, book: { bookname: '', author: '', category: '', type: '', image_url: '' } }); }; exports.postBook = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } const { bookname, author, category, type, list_id, image_url } = req.body; const bookModel = new BookModel(req.db); try { await bookModel.addBook(bookname, author, category, type, list_id, req.session.user.user_id, image_url); res.redirect(`/books/${list_id}`); } catch (error) { res.status(500).send('เกิดข้อผิดพลาดในการเพิ่มหนังสือ'); } }; exports.getEditBook = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } const { book_id } = req.params; const bookModel = new BookModel(req.db); try { const book = await bookModel.getBookByIdAndUser(book_id, req.session.user.user_id); if (!book) { return res.status(403).send('You do not have permission to edit this book'); } res.render('addbook', { isEditing: true, book: book, list_id: book.list_id }); } catch (error) { console.error('Error loading book:', error); res.status(500).send('Error loading book information'); } }; exports.postEditBook = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } upload(req, res, async (err) => { if (err) { return res.status(400).send('Error uploading file: ' + err.message); } try { const { book_id } = req.params; const { bookname, author, category, type, imageOption } = req.body; // First check if book exists and user has permission const bookModel = new BookModel(req.db); const existingBook = await bookModel.getBookByIdAndUser(book_id, req.session.user.user_id); if (!existingBook) { return res.status(403).send('You do not have permission to edit this book'); } // Determine image URL let image_url = existingBook.image_url; // Keep existing image by default if (imageOption === 'file' && req.file) { image_url = `/uploads/${req.file.filename}`; } else if (imageOption === 'url' && req.body.image_url) { image_url = req.body.image_url; } // Update book await bookModel.updateBook(book_id, req.session.user.user_id, { bookname, author, category, type, image_url }); res.redirect(`/books/${existingBook.list_id}`); } catch (error) { console.error('Error updating book:', error); res.status(500).send('Error updating book information'); } }); }; exports.deleteBook = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } const { book_id } = req.params; const bookModel = new BookModel(req.db); try { // Get book info before deleting to know which list to redirect to const book = await bookModel.getBookById(book_id); if (!book || book.length === 0) { return res.status(404).send('ไม่พบหนังสือ'); } const list_id = book[0].list_id; await bookModel.deleteBook(book_id, req.session.user.user_id); res.redirect(`/books/${list_id}`); } catch (error) { console.error('Error deleting book:', error); res.status(500).send('เกิดข้อผิดพลาดในการลบหนังสือ'); } }; exports.getBookInfo = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } const { book_id } = req.params; const bookModel = new BookModel(req.db); try { const [book] = await bookModel.getBookById(book_id); if (!book) { return res.status(404).send('Book not found'); } res.render('bookinfo', { book }); } catch (error) { res.status(500).send('Error loading book information'); } }; // Configure multer for file uploads const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, 'public/uploads/') }, filename: (req, file, cb) => { cb(null, `${Date.now()}-${file.originalname}`) } }); const upload = multer({ storage: storage, limits: { fileSize: 5 * 1024 * 1024 // 5MB limit }, fileFilter: (req, file, cb) => { const filetypes = /jpeg|jpg|png/; const mimetype = filetypes.test(file.mimetype); const extname = filetypes.test(path.extname(file.originalname).toLowerCase()); if (mimetype && extname) { return cb(null, true); } cb(new Error('Only .png, .jpg and .jpeg format allowed!')); } }).single('image_file'); exports.postBook = async (req, res) => { if (!req.session.user) { return res.redirect('/login'); } upload(req, res, async (err) => { if (err) { console.error('Upload error:', err); return res.status(400).send('Error uploading file: ' + err.message); } try { const { bookname, author, category, type, list_id, imageOption } = req.body; let image_url = ''; if (imageOption === 'file' && req.file) { image_url = `/uploads/${req.file.filename}`; } else { image_url = req.body.image_url; } const bookModel = new BookModel(req.db); await bookModel.createBook({ bookname, author, category, type, image_url, list_id, user_id: req.session.user.user_id }); res.redirect(`/books/${list_id}`); } catch (error) { console.error('Error creating book:', error); res.status(500).send('เกิดข้อผิดพลาดในการเพิ่มหนังสือ'); } }); };