Spaces:
Running
Running
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; |