email sent when personal information changed

This commit is contained in:
jackiettran
2025-11-21 16:47:39 -05:00
parent f7767dfd13
commit f2d42dffee
9 changed files with 701 additions and 153 deletions

View File

@@ -3,6 +3,7 @@ const { User, UserAddress } = require('../models'); // Import from models/index.
const { authenticateToken } = require('../middleware/auth');
const { uploadProfileImage } = require('../middleware/upload');
const logger = require('../utils/logger');
const userService = require('../services/UserService');
const fs = require('fs').promises;
const path = require('path');
const router = express.Router();
@@ -57,15 +58,7 @@ router.get('/addresses', authenticateToken, async (req, res) => {
router.post('/addresses', authenticateToken, async (req, res) => {
try {
const address = await UserAddress.create({
...req.body,
userId: req.user.id
});
const reqLogger = logger.withRequestId(req.id);
reqLogger.info("User address created", {
userId: req.user.id,
addressId: address.id
});
const address = await userService.createUserAddress(req.user.id, req.body);
res.status(201).json(address);
} catch (error) {
@@ -82,23 +75,7 @@ router.post('/addresses', authenticateToken, async (req, res) => {
router.put('/addresses/:id', authenticateToken, async (req, res) => {
try {
const address = await UserAddress.findByPk(req.params.id);
if (!address) {
return res.status(404).json({ error: 'Address not found' });
}
if (address.userId !== req.user.id) {
return res.status(403).json({ error: 'Unauthorized' });
}
await address.update(req.body);
const reqLogger = logger.withRequestId(req.id);
reqLogger.info("User address updated", {
userId: req.user.id,
addressId: req.params.id
});
const address = await userService.updateUserAddress(req.user.id, req.params.id, req.body);
res.json(address);
} catch (error) {
@@ -109,29 +86,18 @@ router.put('/addresses/:id', authenticateToken, async (req, res) => {
userId: req.user.id,
addressId: req.params.id
});
if (error.message === 'Address not found') {
return res.status(404).json({ error: error.message });
}
res.status(500).json({ error: error.message });
}
});
router.delete('/addresses/:id', authenticateToken, async (req, res) => {
try {
const address = await UserAddress.findByPk(req.params.id);
if (!address) {
return res.status(404).json({ error: 'Address not found' });
}
if (address.userId !== req.user.id) {
return res.status(403).json({ error: 'Unauthorized' });
}
await address.destroy();
const reqLogger = logger.withRequestId(req.id);
reqLogger.info("User address deleted", {
userId: req.user.id,
addressId: req.params.id
});
await userService.deleteUserAddress(req.user.id, req.params.id);
res.status(204).send();
} catch (error) {
@@ -142,6 +108,11 @@ router.delete('/addresses/:id', authenticateToken, async (req, res) => {
userId: req.user.id,
addressId: req.params.id
});
if (error.message === 'Address not found') {
return res.status(404).json({ error: error.message });
}
res.status(500).json({ error: error.message });
}
});
@@ -211,49 +182,13 @@ router.get('/:id', async (req, res) => {
router.put('/profile', authenticateToken, async (req, res) => {
try {
const {
firstName,
lastName,
email,
phone,
address1,
address2,
city,
state,
zipCode,
country,
itemRequestNotificationRadius
} = req.body;
// Build update object, excluding empty email
const updateData = {
firstName,
lastName,
phone,
address1,
address2,
city,
state,
zipCode,
country,
itemRequestNotificationRadius
};
// 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'] }
});
// Use UserService to handle update and email notification
const updatedUser = await userService.updateProfile(req.user.id, req.body);
res.json(updatedUser);
} catch (error) {
console.error('Profile update error:', error);
res.status(500).json({
res.status(500).json({
error: error.message,
details: error.errors ? error.errors.map(e => ({ field: e.path, message: e.message })) : undefined
});