const pool = require('../config/database'); const bcrypt = require('bcryptjs'); class Tour { static async getAll() { try { const [results] = await pool.query('SELECT * FROM tours'); return results; } catch (err) { throw err; // Throw error to be caught by the caller } } static async getById(id) { try { const [result] = await pool.query('SELECT * FROM tours WHERE id = ?', [id]); return result; } catch (err) { throw err; } } static async create(data) { try { const [result] = await pool.query('INSERT INTO tours SET ?', data); return result.insertId; // Return the ID of the newly inserted tour } catch (err) { throw err; } } static async update(id, data) { try { const [result] = await pool.query('UPDATE tours SET ? WHERE id = ?', [data, id]); return result.affectedRows > 0; // Return true if update was successful } catch (err) { throw err; } } static async delete(id) { try { const [result] = await pool.query('DELETE FROM tours WHERE id = ?', [id]); return result.affectedRows > 0; // Return true if delete was successful } catch (err) { throw err; } } static async search(query) { try { const [results] = await pool.query('SELECT * FROM tours WHERE name LIKE ?', [`%${query}%`]); return results; } catch (err) { throw err; } } } 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; } } } module.exports = { User, Tour };