const { User, Tour } = require('../models/tourModel'); const pool = require('../config/database'); exports.getTours = async (req, res) => { try { const tours = await Tour.getAllTours(req.session.userId); // ดึงทัวร์ที่สร้างโดยผู้ใช้ที่ล็อกอิน res.render('index', { tours, session: req.session }); } catch (error) { res.status(500).send(error.message); } }; exports.getTourDetails = async (req, res) => { const tourId = req.params.id; try { const tour = await Tour.getTourById(tourId); // ค้นหาทัวร์จาก ID // ถ้าทัวร์ไม่พบ จะส่งข้อความกลับไป if (!tour) { return res.status(404).send('ไม่พบข้อมูลทัวร์ที่ต้องการ'); } res.render('tour-details', { tour }); } catch (error) { console.error('Error fetching tour by ID:', error); res.status(500).send('เกิดข้อผิดพลาดในการดึงข้อมูลทัวร์'); } }; //User// exports.getLogin = (req, res) => { res.render('login', { message: null }); }; exports.getRegister = (req, res) => { res.render('register', { message: null }); }; exports.postRegister = async (req, res) => { const { name, email, password, confirmPassword } = req.body; if (password !== confirmPassword) { return res.render('register', { message: 'Passwords do not match' }); } try { const existingUser = await User.findOne(email); if (existingUser) { return res.render('register', { message: 'Email already in use' }); } const userId = await User.create(name, email, password); req.session.userId = userId; res.redirect('/login'); } catch (err) { console.error(err); res.render('register', { message: 'Error creating user' }); } }; exports.postLogin = async (req, res) => { const { email, password } = req.body; try { const user = await User.findOne(email); // หาผู้ใช้จากฐานข้อมูล if (!user) { return res.render('login', { message: 'Invalid email or password' }); } const isMatch = await User.comparePassword(email, password); // ตรวจสอบรหัสผ่าน if (!isMatch) { return res.render('login', { message: 'Invalid email or password' }); } req.session.userId = user.id; // เก็บ email ใน session req.session.userName = user.name; // เก็บชื่อผู้ใช้ใน session res.redirect('/'); // เมื่อ login สำเร็จให้ไปหน้า home } catch (err) { console.error(err); res.render('login', { message: 'Error logging in' }); } }; exports.Logout = (req, res) => { req.session.destroy((err) => { if (err) { return res.status(500).send('เกิดข้อผิดพลาดในการออกจากระบบ'); } res.redirect('/login'); // หลังจาก logout สำเร็จ ให้ redirect ไปหน้า login }); }; //Profile exports.getProfilePage = (req, res) => { if (req.session.userId) { const user = req.session.userName; res.render('profile', { user, session: req.session }); } else { res.redirect('/login'); } }; exports.getEditProfilePage = async (req, res) => { if (!req.session.userId) { return res.redirect('/profile'); } try { const user = await User.findById(req.session.userId); res.render('edit-profile', { user }); } catch (err) { console.error(err); res.redirect('/profile'); } }; exports.updateProfile = async (req, res) => { const { name, email, password } = req.body; if (!name || !email) { return res.status(400).send('Name and Email are required'); } try { let user = await User.findById(req.session.userId); // อัปเดตชื่อและอีเมล user.name = name; user.email = email; // อัปเดตพาสเวิร์ดถ้ามีการกรอก if (password) { user.password = await bcrypt.hash(password, 10); } await user.save(); res.redirect('/profile'); } catch (err) { console.error(err); res.status(500).send('Error updating profile'); } }; //CRUD // แสดงฟอร์มสร้างทัวร์ exports.getCreateTour = (req, res) => { res.render('createtour'); }; // บันทึกทัวร์ใหม่ exports.createTour = async (req, res) => { const { name, description, price, duration } = req.body; if (!name || !description || !price || !duration) { return res.status(400).send('กรุณากรอกข้อมูลให้ครบทุกช่อง'); } // แปลง userId ให้เป็นตัวเลข const userId = parseInt(req.session.userId, 10); if (isNaN(userId)) { return res.status(400).send('User ID is not valid'); } // ตรวจสอบค่าที่ได้รับจาก req.session และ body console.log('Received Values:'); console.log('UserID:', userId); console.log('Tour Details:'); console.log('Name:', name); console.log('Description:', description); console.log('Price:', price); console.log('Duration:', duration); try { // ส่ง userId ที่เก็บไว้ใน session ไปพร้อมกับข้อมูลทัวร์ await Tour.createTour(name, description, price, duration, req.session.userId); res.redirect('/'); // กลับไปหน้าแรกหลังจากสร้างทัวร์ } catch (error) { console.error('Error creating tour:', error); res.status(500).send('เกิดข้อผิดพลาดในการสร้างทัวร์'); } }; // ฟังก์ชั่นสำหรับสร้างทัวร์ exports.postCreateTour = async (req, res) => { const { name, description, price, duration } = req.body; if (!name || !price || !duration) { return res.render('createtour', { message: 'ข้อมูลไม่ครบถ้วน' }); } try { // ใช้ฟังก์ชันจากโมเดลในการสร้างทัวร์ await Tour.createTour(name, description, price, duration, req.session.userId); res.redirect('/'); // กลับไปหน้าแรกหลังจากสร้างเสร็จ } catch (error) { console.error(error); res.render('createtour', { message: 'เกิดข้อผิดพลาดในการสร้างทัวร์' }); } }; exports.getEditTour = async (req, res) => { try { const tour = await Tour.getTourById(req.params.id); // ตรวจสอบค่าที่ได้จากฐานข้อมูล console.log("Tour data:", tour); console.log("Session user ID:", req.session.userId); if (tour.userId !== req.session.userId) { return res.status(403).send('คุณไม่มีสิทธิ์แก้ไขทัวร์นี้'); } if (!tour) { return res.status(404).send('ไม่พบข้อมูลทัวร์'); } res.render('edittour', { tour }); } catch (error) { console.error("Error fetching tour:", error); res.status(500).send('เกิดข้อผิดพลาด'); } }; exports.postEditTour = async (req, res) => { const { name, description, price, duration } = req.body; const tourId = req.params.id; // ดึง id จาก URL parameters console.log('📥 Data received:', req.body); // ตรวจสอบข้อมูลที่ได้รับจากฟอร์ม if (!tourId) { return res.status(400).send('ไม่พบข้อมูลทัวร์'); } if (!name || !description || !price || !duration) { return res.status(400).send('กรุณากรอกข้อมูลให้ครบทุกช่อง'); } const tourData = { name, description, price, duration }; try { const result = await Tour.updateTour(tourId, tourData); // ส่ง tourId และ tourData console.log('Tour updated:', result); res.redirect('/tour/' + tourId); // ไปที่หน้ารายละเอียดทัวร์ } catch (error) { console.error('Error updating tour:', error); res.status(500).send('เกิดข้อผิดพลาดในการแก้ไขทัวร์'); } }; exports.deleteTour = async (req, res) => { try { const tourId = req.params.id; console.log("Request to delete tour ID:", tourId); // ตรวจสอบค่า ID if (!tourId) { return res.status(400).send("Tour ID is required"); } await Tour.deleteTour(tourId); res.redirect('/'); } catch (error) { res.status(500).send(error.message); } }; //ค้นหาทัวร์ exports.searchTours = async (req, res) => { try { const searchQuery = req.query.query; const tours = await Tour.searchTours(searchQuery); // ตรวจสอบว่าผลลัพธ์จาก Tour.searchTours เป็นอาร์เรย์หรือไม่ if (!Array.isArray(tours)) { console.log('ผลลัพธ์จาก searchTours ไม่ใช่ Array:', tours); return res.render('search', { tours: [], session: req.session }); // ส่งอาร์เรย์ว่างไปหากไม่ใช่ Array } res.render('search', { tours, session: req.session }); } catch (error) { console.error('Error searching tours:', error); res.status(500).send("Error searching tours"); } }; //จองทัวร์ exports.getAllTours = async (req, res) => { try { const tours = await Tour.getAllTours(); // เรียกใช้ฟังก์ชันดึงทัวร์ทั้งหมด res.render('booking', { tours }); } catch (error) { console.error('Error fetching tours:', error.message); res.status(500).send('Internal Server Error'); } }; // ดึงข้อมูลการจองพร้อมชื่อผู้จอง // ดึงรายการจองของผู้ใช้ exports.getUserBookings = async (req, res) => { const userId = req.session.userId; // สมมติว่าใช้ session สำหรับจัดการผู้ใช้ if (!userId) { return res.redirect('/login'); // ถ้าไม่ได้ล็อกอิน ให้ไปหน้า login } console.log("Fetching bookings for user:", userId); try { const query = ` SELECT b.id AS booking_id, t.name AS tour_name, u.name AS user_name FROM bookings b JOIN tours t ON b.tour_id = t.id JOIN users u ON b.user_id = u.id WHERE b.user_id = ? ORDER BY b.id ASC `; const [bookings] = await pool.query(query, [userId]); console.log("Bookings Data:", bookings); // ส่งข้อมูลการจองไปยังหน้า EJS res.render('bookinglist', { bookings: bookings }); } catch (error) { console.error('Error fetching bookings:', error.message); res.status(500).send('เกิดข้อผิดพลาดในการดึงข้อมูลการจอง'); } }; // ฟังก์ชันสร้างการจอง exports.createBooking = async (req, res) => { const userId = req.session.userId; // สมมติว่าใช้ session ในการจัดการการล็อกอิน const tourId = req.body['tour-id']; // รับ tour_id จากฟอร์ม // ตรวจสอบว่ามีข้อมูล tour-id หรือไม่ if (!tourId) { return res.status(400).send('Tour ID is required.'); } try { // ตรวจสอบว่า tour_id ที่ส่งมาถูกต้องหรือไม่ (สามารถเพิ่มการตรวจสอบว่า tour_id นี้มีอยู่ในฐานข้อมูล) const tourQuery = 'SELECT * FROM tours WHERE id = ?'; const [tour] = await pool.query(tourQuery, [tourId]); if (tour.length === 0) { return res.status(404).send('Tour not found.'); } // ทำการจองทัวร์ (บันทึกการจองในตาราง bookings) const bookingQuery = 'INSERT INTO bookings (user_id, tour_id) VALUES (?, ?)'; await pool.execute(bookingQuery, [userId, tourId]); // หลังจากบันทึกการจองสำเร็จแล้ว, ส่งผู้ใช้กลับไปที่หน้ารายการจอง res.redirect('/bookinglist'); } catch (error) { console.error('Error creating booking:', error.message); res.status(500).send('เกิดข้อผิดพลาดในการจองทัวร์'); } }; // ฟังก์ชันยกเลิกการจอง exports.cancelBooking = async (req, res) => { const bookingId = req.params.id; // รับ bookingId จาก URL params try { // ตรวจสอบว่ามีการจองนี้ในฐานข้อมูลหรือไม่ const cancelQuery = 'DELETE FROM bookings WHERE id = ?'; const [result] = await pool.execute(cancelQuery, [bookingId]); // ถ้าลบไม่สำเร็จ ให้แจ้งว่าไม่พบการจอง if (result.affectedRows === 0) { return res.status(404).send('Booking not found'); } res.status(200).send('Booking canceled successfully'); } catch (error) { console.error('Error canceling booking:', error.message); res.status(500).send('เกิดข้อผิดพลาดในการยกเลิกการจอง'); } };