hayat / routes /profileUpdate.js
Mohamed Abu Basith
CHG: asyn handler missed
d121fea
const express = require('express');
const multer = require('multer');
const firebase = require("../utils/firebase")
var imageUrl = ""
const os = require('os');
const path = require('path');
const fs = require('fs');
const router = express.Router();
const User = require('../Database/models/user');
const { successResponse, failedResponse } = require("../utils/responseModel");
const mongoose = require('mongoose'); // Import Mongoose Types
const storage = multer.diskStorage({
destination: (req, file, cb) => {
const uploadDir = path.join(os.tmpdir(), 'uploads'); // Use a temporary directory
fs.mkdirSync(uploadDir, { recursive: true }); // Create the directory if it doesn't exist
cb(null, uploadDir);
},
filename: (req, file, cb) => {
cb(null, file.originalname);
},
});
const upload = multer({ storage, limits: { fileSize: 5 * 1024 * 1024 }, });
//Update profile and watch
router.post('/', upload.single('file'), async (req, res) => {
try {
console.log("File:", req.file); // Check the uploaded file
console.log("Body:", req.body); // Check other form data
let imageUrl = '';
// Find the user by userId
const user = await User.findOne({ unique_id: req.body.userId });
if (!user) {
return res.status(404).send({ message: 'User not found!' });
}
// Handle file upload to Firebase Storage
if (req.file || req.body.file) {
const filePath = req.file.path; // Path to the uploaded file
const imageName = req.file.filename; // Name of the uploaded file
// Upload the file to Firebase Storage
await firebase.uploadFile(filePath, "profile/" + imageName);
await firebase.generateSignedUrl("profile/" + imageName)
.then(url => {
imageUrl = url;
})
.catch(e => {
console.log(e);
});
// Update profilePic only if imageUrl is not empty
if (imageUrl) {
user.profilePic = imageUrl;
}
}
// Update other user details
if (req.body.username) user.username = req.body.username;
if (req.body.dateOfBirth) user.dateOfBirth = req.body.dateOfBirth;
if (req.body.mobileNumber) user.mobileNumber = req.body.mobileNumber;
if (req.body.email) user.email = req.body.email;
// Save the updated user data
const savedData = await user.save();
console.log('Profile updated successfully', savedData);
res.status(200).send({ message: 'Profile updated!', data: savedData });
} catch (error) {
console.error('Error updating profile:', error);
res.status(400).send({ message: 'Error updating profile', error });
}
});
// Replace the "// Adress section" comment and subsequent code with:
// Address Section
const validateAddress = (address) => {
const requiredFields = ['name', 'mobileNumber', 'pinCode', 'address', 'area'];
const missingFields = requiredFields.filter(field => !address[field]);
if (missingFields.length > 0) {
throw new Error(`Missing required fields: ${missingFields.join(', ')}`);
}
};
const asyncHandler = fn => (req, res, next) =>
Promise.resolve(fn(req, res, next)).catch(next);
// Create new address
router.post("/address", asyncHandler(async (req, res) => {
try {
const { userId } = req.body;
if (!userId) {
return res.status(400).json({
status: false,
message: "User ID is required",
data: null
});
}
validateAddress(req.body);
const addressData = {
name: req.body.name,
mobileNumber: req.body.mobileNumber,
pinCode: req.body.pinCode,
address: req.body.address,
area: req.body.area,
landMark: req.body.landMark || '',
alterMobileNumber: req.body.alterMobileNumber || ''
};
const updatedUser = await User.findOneAndUpdate(
{ unique_id: userId },
{ $push: { addresses: addressData } },
{ new: true }
);
if (!updatedUser) {
return res.status(404).json({
status: false,
message: "User not found",
data: null
});
}
const newAddress = updatedUser.addresses[updatedUser.addresses.length - 1];
return res.status(200).json({
status: true,
message: "Address added successfully",
data: newAddress
});
} catch (error) {
return res.status(400).json({
status: false,
message: error.message,
data: null
});
}
}));
// Get all addresses
router.get("/address/:userId", asyncHandler(async (req, res) => {
try {
const { userId } = req.params;
const user = await User.findOne({ unique_id: userId }).select('addresses');
if (!user) {
return res.status(404).json({
status: false,
message: "User not found",
data: null
});
}
return res.status(200).json({
status: true,
message: "Addresses retrieved successfully",
data: user.addresses || []
});
} catch (error) {
return res.status(400).json({
status: false,
message: error.message,
data: null
});
}
}));
// Update address
router.put("/address", asyncHandler(async (req, res) => {
try {
const { userId, addressId } = req.body;
if (!userId || !addressId) {
return res.status(400).json({
status: false,
message: "User ID and Address ID are required",
data: null
});
}
validateAddress(req.body);
const updateFields = {};
['name', 'mobileNumber', 'pinCode', 'address', 'area', 'landMark', 'alterMobileNumber']
.forEach(field => {
if (req.body[field] !== undefined) {
updateFields[`addresses.$.${field}`] = req.body[field];
}
});
const updatedUser = await User.findOneAndUpdate(
{
unique_id: userId,
"addresses._id": addressId
},
{ $set: updateFields },
{ new: true }
);
if (!updatedUser) {
return res.status(404).json({
status: false,
message: "Address not found",
data: null
});
}
const updatedAddress = updatedUser.addresses.find(
addr => addr._id.toString() === addressId
);
return res.status(200).json({
status: true,
message: "Address updated successfully",
data: updatedAddress
});
} catch (error) {
return res.status(400).json({
status: false,
message: error.message,
data: null
});
}
}));
// Delete address
router.delete("/address", asyncHandler(async (req, res) => {
try {
const { userId, addressId } = req.body;
if (!userId || !addressId) {
return res.status(400).json({
status: false,
message: "User ID and Address ID are required",
data: null
});
}
const updatedUser = await User.findOneAndUpdate(
{ unique_id: userId },
{ $pull: { addresses: { _id: addressId } } },
{ new: true }
);
if (!updatedUser) {
return res.status(404).json({
status: false,
message: "Address not found",
data: null
});
}
return res.status(200).json({
status: true,
message: "Address deleted successfully",
data: null
});
} catch (error) {
return res.status(400).json({
status: false,
message: error.message,
data: null
});
}
}));
module.exports = router;