const User = require('../models/User'); const updateProfile = async (req, res) => { try { const { firstName, lastName, bio, specialty, price, address, experience } = req.body; const user = await User.findById(req.user._id); if (user) { user.firstName = firstName || user.firstName; user.lastName = lastName || user.lastName; user.bio = bio || user.bio; user.specialty = specialty || user.specialty; user.price = price !== undefined ? price : user.price; user.address = address || user.address; user.experience = experience !== undefined ? experience : user.experience; const updatedUser = await user.save(); res.json({ _id: updatedUser._id, email: updatedUser.email, role: updatedUser.role, firstName: updatedUser.firstName, lastName: updatedUser.lastName, bio: updatedUser.bio, specialty: updatedUser.specialty, price: updatedUser.price, portfolio: updatedUser.portfolio, address: updatedUser.address, experience: updatedUser.experience, availability: updatedUser.availability }); } else { res.status(404).json({ message: 'User not found' }); } } catch (error) { res.status(500).json({ message: error.message }); } }; const updateAvailability = async (req, res) => { try { const { availability } = req.body; const user = await User.findById(req.user._id); if (user) { user.availability = availability; await user.save(); res.json(user.availability); } else { res.status(404).json({ message: 'User not found' }); } } catch (error) { res.status(500).json({ message: error.message }); } }; const addPortfolioItem = async (req, res) => { try { const { imageUrl, type } = req.body; const user = await User.findById(req.user._id); if (user) { user.portfolio.push({ url: imageUrl, type: type || 'image' }); await user.save(); res.json(user.portfolio); } else { res.status(404).json({ message: 'User not found' }); } } catch (error) { res.status(500).json({ message: error.message }); } }; const removePortfolioItem = async (req, res) => { try { const { imageUrl } = req.body; const user = await User.findById(req.user._id); if (user) { user.portfolio = user.portfolio.filter(item => item.url !== imageUrl); await user.save(); res.json(user.portfolio); } else { res.status(404).json({ message: 'User not found' }); } } catch (error) { res.status(500).json({ message: error.message }); } }; const getPhotographerById = async (req, res) => { try { const user = await User.findById(req.params.id).select('-password'); if (user && (user.role === 'photographer' || (user.roles && user.roles.includes('photographer')))) { res.json(user); } else { res.status(404).json({ message: 'Photographer not found' }); } } catch (error) { res.status(500).json({ message: error.message }); } }; const getPhotographers = async (req, res) => { try { const query = req.query.q; // photographer filter: primary role OR in roles array (dual-role support) const photographerFilter = { $or: [{ role: 'photographer' }, { roles: 'photographer' }] }; let pgs; if (query) { pgs = await User.find({ ...photographerFilter, $or: [ { firstName: { $regex: query, $options: 'i' } }, { lastName: { $regex: query, $options: 'i' } }, { specialty: { $regex: query, $options: 'i' } }, { address: { $regex: query, $options: 'i' } } ] }).select('-password').sort({ recommendationScore: -1, rating: -1 }); } else { pgs = await User.find(photographerFilter).select('-password').sort({ recommendationScore: -1, rating: -1 }); } res.json(pgs); } catch (error) { res.status(500).json({ message: error.message }); } }; const getNearbyPhotographers = async (req, res) => { try { const { lat, lng, radius = 5000 } = req.query; // radius in meters if (!lat || !lng) { return res.status(400).json({ message: 'Latitude and longitude are required' }); } const photographers = await User.find({ role: 'photographer', location: { $near: { $geometry: { type: 'Point', coordinates: [parseFloat(lng), parseFloat(lat)] }, $maxDistance: parseInt(radius) } } }).select('-password'); res.json(photographers); } catch (error) { res.status(500).json({ message: error.message }); } }; const getUserById = async (req, res) => { try { const user = await User.findById(req.params.id) .select('firstName lastName profilePicture role bio specialty price experience address portfolio'); if (user) { res.json(user); } else { res.status(404).json({ message: 'User not found' }); } } catch (error) { res.status(500).json({ message: error.message }); } }; module.exports = { updateProfile, addPortfolioItem, removePortfolioItem, getPhotographerById, getPhotographers, updateAvailability, getNearbyPhotographers, getUserById };