const pool = require('../config/database'); const bcrypt = require('bcryptjs'); class Tour { // ดึงทัวร์ทั้งหมด static async getAllTours(userId) { try { console.log('Fetching all tours'); // ดึงทัวร์ทั้งหมดที่ userId ตรงกับผู้ใช้ที่ล็อกอิน const [rows] = await pool.query('SELECT * FROM tours'); console.log('Tours fetched successfully:', rows); return rows; } catch (error) { console.error('Error fetching tours:', error.message); throw new Error('เกิดข้อผิดพลาดในการดึงข้อมูลทัวร์: ' + error.message); } } // ค้นหาทัวร์โดยใช้ชื่อ static async searchTours(query) { try { const [rows] = await pool.query('SELECT * FROM tours WHERE name LIKE ?', [`%${query}%`]); // หากไม่มีทัวร์ที่ตรงกับคำค้นหา if (rows.length === 0) { return 'ไม่พบทัวร์ที่ตรงกับคำค้นหาของคุณ'; } return rows; } catch (error) { console.error('Error searching tours:', error.message); throw new Error('เกิดข้อผิดพลาดในการค้นหาทัวร์'); } } // สร้างทัวร์ static async createTour(name, description, price, duration, userId) { // ตรวจสอบข้อมูล if (!name || !price || !duration) { throw new Error('ข้อมูลไม่ครบถ้วน กรุณากรอกข้อมูลให้ครบถ้วน'); } const query = 'INSERT INTO tours (name, description, price, duration, userId) VALUES (?, ?, ?, ?, ?)'; try { // บันทึกทัวร์พร้อมกับ userId ที่สร้างทัวร์ await pool.execute(query, [name, description, price, duration, userId]); } catch (error) { console.error('Error creating tour:', error); throw new Error('เกิดข้อผิดพลาดในการสร้างทัวร์'); } } // อัปเดตทัวร์ static async updateTour(tourId, tourData) { const { name, description, price, duration } = tourData; // ตรวจสอบข้อมูลให้ครบถ้วน if (!name || !description || !price || !duration) { throw new Error('ข้อมูลไม่ครบถ้วน'); } // สร้างคำสั่ง SQL สำหรับการอัปเดตข้อมูล const query = 'UPDATE tours SET name = ?, description = ?, price = ?, duration = ? WHERE id = ?'; try { // ใช้ tourId ที่รับมาในการอัปเดต const [results] = await pool.execute(query, [name, description, price, duration, tourId]); console.log('✅ Update results:', results); return results; } catch (error) { console.error('Error updating tour:', error); // ข้อผิดพลาดจากการอัปเดต throw error; } } // ดึงทัวร์ตาม ID static async getTourById(tourId) { const query = 'SELECT id, name, description, price, duration, userId FROM tours WHERE id = ?'; try { const [results] = await pool.execute(query, [tourId]); if (results.length === 0) { throw new Error(`ไม่พบทัวร์ที่มี ID ${tourId}`); } return results[0]; // คืนค่าทัวร์ที่พบ } catch (error) { console.error('Error fetching tour by ID:', error); throw error; // ส่งข้อผิดพลาดกลับไปที่ controller } } // ลบทัวร์ static async deleteTour(id) { try { console.log("Deleting tour with ID:", id); // เช็คค่า ID ที่รับมา if (!id) { throw new Error("Tour ID is required"); } // ตรวจสอบว่าทัวร์มีอยู่จริง const checkQuery = 'SELECT * FROM tours WHERE id = ?'; const [tours] = await pool.execute(checkQuery, [id]); if (tours.length === 0) { throw new Error(`ไม่พบทัวร์ที่ต้องการลบ ID: ${id}`); } // ลบ bookings ที่เกี่ยวข้องก่อน const deleteBookingsQuery = 'DELETE FROM bookings WHERE tour_id = ?'; await pool.execute(deleteBookingsQuery, [id]); // ลบ tour หลังจาก bookings ถูกลบแล้ว const deleteTourQuery = 'DELETE FROM tours WHERE id = ?'; const [result] = await pool.execute(deleteTourQuery, [id]); console.log("Delete result:", result); return result; } catch (error) { console.error('Error deleting tour:', error); throw new Error('เกิดข้อผิดพลาดในการลบทัวร์'); } } } class User { static async findOne(email) { try { const [rows] = await pool.query('SELECT * FROM users WHERE email = ?', [email]); return rows.length > 0 ? rows[0] : null; } catch (err) { throw err; } } static async create(name, email, password) { try { const hashedPassword = await bcrypt.hash(password, 10); const [result] = await pool.query( 'INSERT INTO users (name, email, password) VALUES (?, ?, ?)', [name, email, hashedPassword] ); return result.insertId; } catch (err) { throw err; } } static async comparePassword(email, password) { try { const user = await User.findOne(email); if (!user) return false; return await bcrypt.compare(password, user.password); } catch (err) { throw err; } } } class Booking { // ดึงรายการจองของผู้ใช้ static async getUserBookings(userId) { const query = ` SELECT b.id, t.name AS tour_name, t.price, b.booking_date FROM bookings b JOIN tours t ON b.tour_id = t.id WHERE b.user_id = ? ORDER BY b.id ASC `; try { const [rows] = await pool.query(query, [userId]); return rows; // คืนค่ารายการจองทั้งหมด } catch (error) { console.error('Error fetching user bookings:', error); throw new Error('Unable to retrieve user bookings'); } } // ทำการจองทัวร์ static async createBooking(userId, tourId) { const query = 'INSERT INTO bookings (user_id, tour_id) VALUES (?, ?)'; try { const [result] = await pool.execute(query, [userId, tourId]); return result; // คืนค่าผลลัพธ์จากการจอง } catch (error) { console.error('Error creating booking:', error); throw new Error('Error creating booking'); } } // ลบการจอง static async deleteBooking(bookingId) { const query = 'DELETE FROM bookings WHERE id = ?'; try { const [result] = await pool.execute(query, [bookingId]); return result; // คืนค่าผลลัพธ์จากการลบการจอง } catch (error) { console.error('Error deleting booking:', error); throw new Error('Error deleting booking'); } } } module.exports = { User, Tour, Booking };