ctrlv-ince/gamezone-react-native
0
1const { User } = require('../models/user');2const bcrypt = require('bcryptjs');3const jwt = require('jsonwebtoken');4 5exports.getUsers = async (req, res) => {6 try {7 const userList = await User.find().select('-passwordHash');8 9 if (!userList) {10 return res.status(500).json({ success: false });11 }12 res.send(userList);13 } catch (err) {14 res.status(500).json({ success: false, error: err.message });15 }16};17 18exports.getUserById = async (req, res) => {19 try {20 const user = await User.findById(req.params.id).select('-passwordHash');21 22 if (!user) {23 return res.status(500).json({ message: 'The user with the given ID was not found.' });24 }25 res.status(200).send(user);26 } catch (err) {27 res.status(500).json({ success: false, error: err.message });28 }29};30 31exports.registerUser = async (req, res) => {32 try {33 // If a photo was uploaded via multer/cloudinary, use the URL34 let photoUrl = '';35 if (req.file) {36 photoUrl = req.file.path; // Cloudinary returns the URL in path37 }38 39 let user = new User({40 name: req.body.name,41 email: req.body.email,42 passwordHash: bcrypt.hashSync(req.body.password, 10),43 phone: req.body.phone,44 isAdmin: req.body.isAdmin,45 address: req.body.address || '',46 pushToken: req.body.pushToken || '',47 photo: photoUrl,48 });49 user = await user.save();50 51 if (!user) return res.status(400).send('the user cannot be created!');52 53 res.send(user);54 } catch (err) {55 console.error("Registration validation error:", err);56 return res.status(500).json({ message: 'Server error during registration', error: err.message });57 }58};59 60exports.loginUser = async (req, res) => {61 try {62 const user = await User.findOne({ email: req.body.email });63 const secret = process.env.SECRET;64 65 if (!user) {66 return res.status(400).json({ message: 'The user not found' });67 }68 69 if (user && bcrypt.compareSync(req.body.password, user.passwordHash)) {70 const token = jwt.sign(71 {72 userId: user.id,73 isAdmin: user.isAdmin74 },75 secret,76 { expiresIn: '1d' }77 );78 79 res.status(200).send({ user: user.email, token: token, userId: user.id, pushToken: user.pushToken });80 } else {81 res.status(400).json({ message: 'password is wrong' });82 }83 } catch (err) {84 return res.status(500).json({ message: 'Server error during login', error: err.message });85 }86};87 88exports.updateUser = async (req, res) => {89 try {90 const userExist = await User.findById(req.params.id);91 if (!userExist) return res.status(400).send('Invalid user ID');92 93 let newPassword;94 if (req.body.password) {95 newPassword = bcrypt.hashSync(req.body.password, 10);96 } else {97 newPassword = userExist.passwordHash;98 }99 100 // If a photo was uploaded via multer/cloudinary, use the URL101 let photopath;102 if (req.file) {103 photopath = req.file.path; // Cloudinary returns the URL in path104 } else {105 photopath = userExist.photo;106 }107 108 const user = await User.findByIdAndUpdate(109 req.params.id,110 {111 name: req.body.name || userExist.name,112 email: req.body.email || userExist.email,113 passwordHash: newPassword,114 phone: req.body.phone || userExist.phone,115 isAdmin: req.body.isAdmin !== undefined ? req.body.isAdmin : userExist.isAdmin,116 address: req.body.address !== undefined ? req.body.address : userExist.address,117 pushToken: req.body.pushToken || userExist.pushToken,118 photo: photopath,119 },120 { new: true }121 );122 123 if (!user) return res.status(400).send('the user cannot be updated!');124 125 res.send(user);126 } catch (err) {127 return res.status(500).json({ message: 'Server error during update', error: err.message });128 }129};130 131exports.googleLogin = async (req, res) => {132 try {133 const { email, name, photo } = req.body;134 const secret = process.env.SECRET;135 136 if (!email) {137 return res.status(400).json({ message: 'Email is required for Google Login' });138 }139 140 let user = await User.findOne({ email: email });141 142 if (!user) {143 // Auto-register user if they don't exist144 user = new User({145 name: name || 'Google User',146 email: email,147 passwordHash: bcrypt.hashSync(Math.random().toString(36).slice(-8), 10), // Random secure password148 phone: '',149 isAdmin: false,150 address: '',151 pushToken: '',152 photo: photo || '',153 });154 user = await user.save();155 }156 157 const token = jwt.sign(158 {159 userId: user.id,160 isAdmin: user.isAdmin161 },162 secret,163 { expiresIn: '1d' }164 );165 166 res.status(200).send({ user: user.email, token: token, userId: user.id, pushToken: user.pushToken });167 } catch (err) {168 return res.status(500).json({ message: 'Server error during Google login', error: err.message });169 }170};171 