126 lines
3.2 KiB
JavaScript
126 lines
3.2 KiB
JavaScript
const express = require('express');
|
|
const { User } = require('../models'); // Import from models/index.js to get models with associations
|
|
const { authenticateToken } = require('../middleware/auth');
|
|
const { uploadProfileImage } = require('../middleware/upload');
|
|
const fs = require('fs').promises;
|
|
const path = require('path');
|
|
const router = express.Router();
|
|
|
|
router.get('/profile', authenticateToken, async (req, res) => {
|
|
try {
|
|
const user = await User.findByPk(req.user.id, {
|
|
attributes: { exclude: ['password'] }
|
|
});
|
|
res.json(user);
|
|
} catch (error) {
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
router.get('/:id', async (req, res) => {
|
|
try {
|
|
const user = await User.findByPk(req.params.id, {
|
|
attributes: { exclude: ['password', 'email', 'phone', 'address'] }
|
|
});
|
|
|
|
if (!user) {
|
|
return res.status(404).json({ error: 'User not found' });
|
|
}
|
|
|
|
res.json(user);
|
|
} catch (error) {
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
});
|
|
|
|
router.put('/profile', authenticateToken, async (req, res) => {
|
|
try {
|
|
const {
|
|
firstName,
|
|
lastName,
|
|
email,
|
|
phone,
|
|
address1,
|
|
address2,
|
|
city,
|
|
state,
|
|
zipCode,
|
|
country
|
|
} = req.body;
|
|
|
|
// Build update object, excluding empty email
|
|
const updateData = {
|
|
firstName,
|
|
lastName,
|
|
phone,
|
|
address1,
|
|
address2,
|
|
city,
|
|
state,
|
|
zipCode,
|
|
country
|
|
};
|
|
|
|
// Only include email if it's not empty
|
|
if (email && email.trim() !== '') {
|
|
updateData.email = email;
|
|
}
|
|
|
|
await req.user.update(updateData);
|
|
|
|
const updatedUser = await User.findByPk(req.user.id, {
|
|
attributes: { exclude: ['password'] }
|
|
});
|
|
|
|
res.json(updatedUser);
|
|
} catch (error) {
|
|
console.error('Profile update error:', error);
|
|
res.status(500).json({
|
|
error: error.message,
|
|
details: error.errors ? error.errors.map(e => ({ field: e.path, message: e.message })) : undefined
|
|
});
|
|
}
|
|
});
|
|
|
|
// Upload profile image endpoint
|
|
router.post('/profile/image', authenticateToken, (req, res) => {
|
|
uploadProfileImage(req, res, async (err) => {
|
|
if (err) {
|
|
console.error('Upload error:', err);
|
|
return res.status(400).json({ error: err.message });
|
|
}
|
|
|
|
if (!req.file) {
|
|
return res.status(400).json({ error: 'No file uploaded' });
|
|
}
|
|
|
|
try {
|
|
// Delete old profile image if exists
|
|
const user = await User.findByPk(req.user.id);
|
|
if (user.profileImage) {
|
|
const oldImagePath = path.join(__dirname, '../uploads/profiles', user.profileImage);
|
|
try {
|
|
await fs.unlink(oldImagePath);
|
|
} catch (unlinkErr) {
|
|
console.error('Error deleting old image:', unlinkErr);
|
|
}
|
|
}
|
|
|
|
// Update user with new image filename
|
|
await user.update({
|
|
profileImage: req.file.filename
|
|
});
|
|
|
|
res.json({
|
|
message: 'Profile image uploaded successfully',
|
|
filename: req.file.filename,
|
|
imageUrl: `/uploads/profiles/${req.file.filename}`
|
|
});
|
|
} catch (error) {
|
|
console.error('Database update error:', error);
|
|
res.status(500).json({ error: 'Failed to update profile image' });
|
|
}
|
|
});
|
|
});
|
|
|
|
module.exports = router; |