E-Commerce-Module/backend/src/routes/userOrders.js
2025-04-26 23:43:27 -05:00

103 lines
No EOL
2.9 KiB
JavaScript

// Create a new file called userOrders.js in the routes directory
const express = require('express');
const router = express.Router();
module.exports = (pool, query, authMiddleware) => {
// Apply authentication middleware to all routes
router.use(authMiddleware);
// Get all orders for the authenticated user
router.get('/', async (req, res, next) => {
try {
const userId = req.user.id;
// Get orders with basic information
const result = await query(`
SELECT
o.id,
o.status,
o.total_amount,
o.shipping_address,
o.created_at,
o.updated_at,
o.payment_completed,
o.shipping_date,
COUNT(oi.id) AS item_count,
CASE WHEN o.shipping_info IS NOT NULL THEN true ELSE false END AS has_shipping_info,
(SELECT SUM(quantity) FROM order_items WHERE order_id = o.id) AS total_items
FROM orders o
LEFT JOIN order_items oi ON o.id = oi.order_id
WHERE o.user_id = $1
GROUP BY o.id
ORDER BY o.created_at DESC
`, [userId]);
res.json(result.rows);
} catch (error) {
next(error);
}
});
// Get a single order with details for the authenticated user
router.get('/:id', async (req, res, next) => {
try {
const { id } = req.params;
const userId = req.user.id;
// Get order with verification that it belongs to the current user
const orderResult = await query(`
SELECT o.*
FROM orders o
WHERE o.id = $1 AND o.user_id = $2
`, [id, userId]);
if (orderResult.rows.length === 0) {
return res.status(404).json({
error: true,
message: 'Order not found'
});
}
// Get order items with product details
const itemsResult = await query(`
SELECT
oi.id,
oi.product_id,
oi.quantity,
oi.price_at_purchase,
p.name as product_name,
p.description as product_description,
pc.name as product_category,
(
SELECT json_agg(
json_build_object(
'id', pi.id,
'path', pi.image_path,
'isPrimary', pi.is_primary,
'displayOrder', pi.display_order
) ORDER BY pi.display_order
)
FROM product_images pi
WHERE pi.product_id = p.id
) AS product_images
FROM order_items oi
JOIN products p ON oi.product_id = p.id
JOIN product_categories pc ON p.category_id = pc.id
WHERE oi.order_id = $1
`, [id]);
// Combine order with items
const order = {
...orderResult.rows[0],
items: itemsResult.rows
};
res.json(order);
} catch (error) {
next(error);
}
});
return router;
};