103 lines
No EOL
2.9 KiB
JavaScript
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;
|
|
}; |