Spaces:
Sleeping
Sleeping
| 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 | |
| }; | |