const express = require("express"); const router = express.Router(); const mongoose = require("mongoose"); const Address = require("../Database/models/address"); const { successResponse, failedResponse } = require("../utils/responseModel"); // Middleware for async error handling const asyncHandler = fn => (req, res, next) => Promise.resolve(fn(req, res, next)).catch(next); // Validation middleware const validateAddressData = (req, res, next) => { const requiredFields = ['user', 'name', 'mobileNumber', 'pinCode', 'address']; const missingFields = requiredFields.filter(field => !req.body[field]); if (missingFields.length > 0) { return res.status(400).json(failedResponse( `Missing required fields: ${missingFields.join(', ')}` )); } next(); }; // Create address router.post("/", validateAddressData, asyncHandler(async (req, res) => { const addressData = { ...req.body, user: parseInt(req.body.user) // Convert to number }; const newAddress = new Address(addressData); res.status(201).json(successResponse("Address created successfully", newAddress)); })); // Get addresses by user router.get("/user/:userId", asyncHandler(async (req, res) => { const userId = parseInt(req.params.userId); if (isNaN(userId)) { return res.status(400).json(response.error("Invalid user ID")); } const addresses = await Address.find({ user: userId }); res.json(successResponse("Success!", addresses)); })); // Get all addresses router.get("/", asyncHandler(async (req, res) => { const addresses = await Address.find().populate('user', 'username email'); res.json(successResponse("Success!", addresses)); })); // Update address router.put("/:id", validateAddressData, asyncHandler(async (req, res) => { const updatedAddress = await Address.findOneAndUpdate( { _id: req.params.id }, req.body, { new: true, runValidators: true } ); if (!updatedAddress) { return res.status(404).json(failedResponse("Address not found", 404)); } res.json(successResponse("Address updated successfully", updatedAddress)); })); // Delete address router.delete("/:id", asyncHandler(async (req, res) => { const deletedAddress = await Address.findOneAndDelete({ _id: req.params.id }); if (!deletedAddress) { return res.status(404).json(failedResponse("Address not found", 404)); } res.json(successResponse("Address deleted successfully", null,)); })); // Error handling middleware router.use((err, req, res, next) => { console.error(err.stack); res.status(500).json(failedResponse("Internal server error", 500)); }); module.exports = router;