Snaplocal / server /src /controllers /userController.js
Kuruva Laxmi
Fix getPhotographerById to support dual-role accounts
d2fec9a
Raw
History Blame Contribute Delete
5.99 kB
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
};