Mohamed Abu Basith commited on
Commit
70d644b
·
1 Parent(s): 736f203

CHG: Major changes on the Address.

Browse files
Files changed (1) hide show
  1. routes/profileUpdate.js +135 -138
routes/profileUpdate.js CHANGED
@@ -74,147 +74,121 @@ router.post('/', upload.single('file'), async (req, res) => {
74
  }
75
  });
76
 
77
- // Adress section
78
-
79
- // Middleware for async error handling
80
- const asyncHandler = fn => (req, res, next) =>
81
- Promise.resolve(fn(req, res, next)).catch(next);
82
-
83
- // Validation middleware
84
- // const validateAddressData = (req, res, next) => {
85
- // const requiredFields = ['name', 'mobileNumber', 'pinCode', 'address'];
86
- // const missingFields = requiredFields.filter(field => !req.body[field]);
87
- // console.log("validateAddressData: " + missingFields)
88
- // if (missingFields.length > 0) {
89
- // return res.status(400).json(failedResponse(
90
- // `Missing required fields: ${missingFields.join(', ')}`
91
- // ));
92
- // }
93
- // next();
94
- // };
95
-
96
- // Create address (add to user's address array)
97
- router.post("/:userId/addresses", asyncHandler(async (req, res) => {
98
- const userId = parseInt(req.params.userId);
99
-
100
- // Validate userId
101
- if (isNaN(userId)) {
102
- return res.status(400).json({
103
- status: 400,
104
- message: "Invalid user ID",
105
- data: null
106
- });
107
- }
108
-
109
- // Validate request body
110
- const { name, mobileNumber, pinCode, address, area, landMark, alterMobileNumber } = req.body;
111
- if (!name || !mobileNumber || !pinCode || !address || !area) {
112
- return res.status(400).json({
113
- status: 400,
114
- message: "Missing required fields in the address",
115
- data: null
116
- });
117
  }
 
118
 
 
 
119
  try {
120
- // Find the user by unique_id and update the addresses array
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  const updatedUser = await User.findOneAndUpdate(
122
- { unique_id: userId }, // Filter by unique_id
123
- { $push: { addresses: req.body } }, // Push new address into the addresses array
124
- { new: true, runValidators: true } // Return updated document and run schema validators
125
  );
126
 
127
- // If user not found, return 404
128
  if (!updatedUser) {
129
  return res.status(404).json({
130
- status: 404,
131
  message: "User not found",
132
  data: null
133
  });
134
  }
135
 
136
- // Extract the newly added address
137
- const addressesArray = updatedUser.addresses || [];
138
- const newAddress = addressesArray[addressesArray.length - 1];
139
-
140
- // If newAddress is missing, return 500
141
- if (!newAddress) {
142
- return res.status(500).json({
143
- status: 500,
144
- message: "Failed to retrieve new address",
145
- data: null
146
- });
147
- }
148
 
149
- // Return success response with the new address
150
- res.status(200).json({
151
- status: 201,
152
- message: "Address created successfully",
153
  data: newAddress
154
  });
155
  } catch (error) {
156
- console.error("Error updating user address:", error);
 
 
 
 
 
 
157
 
158
- // Handle specific MongoDB errors
159
- if (error.name === "ValidationError") {
160
- return res.status(400).json({
161
- status: 400,
162
- message: "Validation error: " + error.message,
163
- data: null
164
- });
165
- }
166
 
167
- if (error.name === "MongoError" && error.code === 11000) {
168
- return res.status(400).json({
169
- status: 400,
170
- message: "Duplicate key error: " + error.message,
171
  data: null
172
  });
173
  }
174
 
175
- // Generic server error
176
- res.status(500).json({
177
- status: 500,
178
- message: "Internal server error",
 
 
 
 
 
179
  data: null
180
  });
181
  }
182
  }));
183
 
184
- // Get addresses by user
185
- router.get("/:userId/addresses", asyncHandler(async (req, res) => {
186
- const user = await User.findOne({ unique_id: req.params.userId }).select('addresses');
187
-
188
- if (!user) {
189
- return res.status(404).json(failedResponse("User not found", 404));
190
- }
191
-
192
- res.status(200).json(successResponse("Success!", user.addresses));
193
- }));
194
-
195
- // Update Adress
196
- router.put("/:userId/addresses/:addressId", asyncHandler(async (req, res) => {
197
  try {
198
- const userId = Number(req.params.userId); // Convert userId to a Number
199
- const addressId = new mongoose.Types.ObjectId(req.params.addressId); // Convert addressId to ObjectId
200
-
201
- console.log("Converted Address ID:", addressId);
202
-
203
- // Check if the address exists first
204
- const user = await User.findOne({
205
- unique_id: userId,
206
- "addresses._id": addressId
207
- });
208
-
209
- if (!user) {
210
- return res.status(404).json(failedResponse("User or address not found", 404));
211
  }
212
 
213
- // Update only fields that are provided in req.body
 
214
  const updateFields = {};
215
- Object.keys(req.body).forEach(key => {
216
- updateFields[`addresses.$.${key}`] = req.body[key];
217
- });
 
 
 
218
 
219
  const updatedUser = await User.findOneAndUpdate(
220
  {
@@ -222,50 +196,73 @@ router.put("/:userId/addresses/:addressId", asyncHandler(async (req, res) => {
222
  "addresses._id": addressId
223
  },
224
  { $set: updateFields },
225
- { new: true, runValidators: true }
226
  );
227
 
228
  if (!updatedUser) {
229
- return res.status(404).json(failedResponse("Address update failed", 404));
 
 
 
 
230
  }
231
 
232
- const updatedAddress = updatedUser.addresses.find(a => a._id.equals(addressId));
 
 
233
 
234
- res.status(200).json(successResponse("Address updated successfully", updatedAddress));
 
 
 
 
235
  } catch (error) {
236
- console.error("Error updating address:", error);
237
- return res.status(500).json(failedResponse(error.message || "Internal server error", 500));
 
 
 
238
  }
239
  }));
240
 
241
  // Delete address
242
- router.delete("/:userId/addresses/:addressId", asyncHandler(async (req, res) => {
243
- // Convert userId to number
244
- const userId = parseInt(req.params.userId);
 
 
 
 
 
 
 
245
 
246
- // Simple validation
247
- if (isNaN(userId)) {
248
- return res.status(400).json(failedResponse("Invalid user ID", 400));
249
- }
 
250
 
251
- const updatedUser = await User.findOneAndUpdate(
252
- { unique_id: userId },
253
- { $pull: { addresses: { _id: req.params.addressId } } },
254
- { new: true }
255
- );
 
 
256
 
257
- if (!updatedUser) {
258
- return res.status(404).json(failedResponse("User not found", 404));
 
 
 
 
 
 
 
 
 
259
  }
260
-
261
- res.status(200).json(successResponse("Address deleted successfully"));
262
  }));
263
 
264
- // Remove the GET all addresses endpoint as it's no longer relevant
265
- // Update error handling middleware
266
- // router.use((err, req, res, next) => {
267
- // console.error(err.stack);
268
- // res.status(500).json(failedResponse("Internal server error", 500));
269
- // });
270
-
271
  module.exports = router;
 
74
  }
75
  });
76
 
77
+ // Replace the "// Adress section" comment and subsequent code with:
78
+
79
+ // Address Section
80
+ const validateAddress = (address) => {
81
+ const requiredFields = ['name', 'mobileNumber', 'pinCode', 'address', 'area'];
82
+ const missingFields = requiredFields.filter(field => !address[field]);
83
+
84
+ if (missingFields.length > 0) {
85
+ throw new Error(`Missing required fields: ${missingFields.join(', ')}`);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  }
87
+ };
88
 
89
+ // Create new address
90
+ router.post("/address", asyncHandler(async (req, res) => {
91
  try {
92
+ const { userId } = req.body;
93
+ if (!userId) {
94
+ return res.status(400).json({
95
+ status: false,
96
+ message: "User ID is required",
97
+ data: null
98
+ });
99
+ }
100
+
101
+ validateAddress(req.body);
102
+
103
+ const addressData = {
104
+ name: req.body.name,
105
+ mobileNumber: req.body.mobileNumber,
106
+ pinCode: req.body.pinCode,
107
+ address: req.body.address,
108
+ area: req.body.area,
109
+ landMark: req.body.landMark || '',
110
+ alterMobileNumber: req.body.alterMobileNumber || ''
111
+ };
112
+
113
  const updatedUser = await User.findOneAndUpdate(
114
+ { unique_id: userId },
115
+ { $push: { addresses: addressData } },
116
+ { new: true }
117
  );
118
 
 
119
  if (!updatedUser) {
120
  return res.status(404).json({
121
+ status: false,
122
  message: "User not found",
123
  data: null
124
  });
125
  }
126
 
127
+ const newAddress = updatedUser.addresses[updatedUser.addresses.length - 1];
 
 
 
 
 
 
 
 
 
 
 
128
 
129
+ return res.status(200).json({
130
+ status: true,
131
+ message: "Address added successfully",
 
132
  data: newAddress
133
  });
134
  } catch (error) {
135
+ return res.status(400).json({
136
+ status: false,
137
+ message: error.message,
138
+ data: null
139
+ });
140
+ }
141
+ }));
142
 
143
+ // Get all addresses
144
+ router.get("/address/:userId", asyncHandler(async (req, res) => {
145
+ try {
146
+ const { userId } = req.params;
147
+ const user = await User.findOne({ unique_id: userId }).select('addresses');
 
 
 
148
 
149
+ if (!user) {
150
+ return res.status(404).json({
151
+ status: false,
152
+ message: "User not found",
153
  data: null
154
  });
155
  }
156
 
157
+ return res.status(200).json({
158
+ status: true,
159
+ message: "Addresses retrieved successfully",
160
+ data: user.addresses || []
161
+ });
162
+ } catch (error) {
163
+ return res.status(400).json({
164
+ status: false,
165
+ message: error.message,
166
  data: null
167
  });
168
  }
169
  }));
170
 
171
+ // Update address
172
+ router.put("/address", asyncHandler(async (req, res) => {
 
 
 
 
 
 
 
 
 
 
 
173
  try {
174
+ const { userId, addressId } = req.body;
175
+ if (!userId || !addressId) {
176
+ return res.status(400).json({
177
+ status: false,
178
+ message: "User ID and Address ID are required",
179
+ data: null
180
+ });
 
 
 
 
 
 
181
  }
182
 
183
+ validateAddress(req.body);
184
+
185
  const updateFields = {};
186
+ ['name', 'mobileNumber', 'pinCode', 'address', 'area', 'landMark', 'alterMobileNumber']
187
+ .forEach(field => {
188
+ if (req.body[field] !== undefined) {
189
+ updateFields[`addresses.$.${field}`] = req.body[field];
190
+ }
191
+ });
192
 
193
  const updatedUser = await User.findOneAndUpdate(
194
  {
 
196
  "addresses._id": addressId
197
  },
198
  { $set: updateFields },
199
+ { new: true }
200
  );
201
 
202
  if (!updatedUser) {
203
+ return res.status(404).json({
204
+ status: false,
205
+ message: "Address not found",
206
+ data: null
207
+ });
208
  }
209
 
210
+ const updatedAddress = updatedUser.addresses.find(
211
+ addr => addr._id.toString() === addressId
212
+ );
213
 
214
+ return res.status(200).json({
215
+ status: true,
216
+ message: "Address updated successfully",
217
+ data: updatedAddress
218
+ });
219
  } catch (error) {
220
+ return res.status(400).json({
221
+ status: false,
222
+ message: error.message,
223
+ data: null
224
+ });
225
  }
226
  }));
227
 
228
  // Delete address
229
+ router.delete("/address", asyncHandler(async (req, res) => {
230
+ try {
231
+ const { userId, addressId } = req.body;
232
+ if (!userId || !addressId) {
233
+ return res.status(400).json({
234
+ status: false,
235
+ message: "User ID and Address ID are required",
236
+ data: null
237
+ });
238
+ }
239
 
240
+ const updatedUser = await User.findOneAndUpdate(
241
+ { unique_id: userId },
242
+ { $pull: { addresses: { _id: addressId } } },
243
+ { new: true }
244
+ );
245
 
246
+ if (!updatedUser) {
247
+ return res.status(404).json({
248
+ status: false,
249
+ message: "Address not found",
250
+ data: null
251
+ });
252
+ }
253
 
254
+ return res.status(200).json({
255
+ status: true,
256
+ message: "Address deleted successfully",
257
+ data: null
258
+ });
259
+ } catch (error) {
260
+ return res.status(400).json({
261
+ status: false,
262
+ message: error.message,
263
+ data: null
264
+ });
265
  }
 
 
266
  }));
267
 
 
 
 
 
 
 
 
268
  module.exports = router;