const User = require('../models/userModel'); const Order = require('../models/orderModel'); // Get all users with their order statistics exports.getAllUsers = async (req, res) => { try { // Get all users sorted by registration date (newest first) const users = await User.find() .select('-password') .sort({ createdAt: -1 }) .lean(); // Get current month date range const now = new Date(); const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1); const endOfMonth = new Date( now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59, ); // Get order counts for each user const usersWithStats = await Promise.all( users.map(async (user) => { // Count total orders for this user const totalOrders = await Order.countDocuments({ user: user._id }); // Count orders this month const ordersThisMonth = await Order.countDocuments({ user: user._id, createdAt: { $gte: startOfMonth, $lte: endOfMonth }, }); // Calculate total spent const orders = await Order.find({ user: user._id }); const totalSpent = orders.reduce( (sum, order) => sum + order.totalPrice, 0, ); // Calculate tier based on order count let tier = 'حديدي'; // Iron (default for 0 orders) if (totalOrders >= 35) { tier = 'بلاتيني'; // Platinum } else if (totalOrders >= 20) { tier = 'ذهبي'; // Gold } else if (totalOrders >= 10) { tier = 'فضي'; // Silver } else if (totalOrders >= 1) { tier = 'برونزي'; // Bronze } // isActive is true if user has orders this month const isActive = ordersThisMonth > 0; return { ...user, totalOrders, totalSpent, tier, isActive, }; }), ); res.status(200).json({ status: 'success', results: usersWithStats.length, data: usersWithStats, }); } catch (err) { console.error('Error fetching users:', err); res.status(500).json({ status: 'fail', message: 'Failed to fetch users', error: err.message, }); } }; // Get user by ID with their orders exports.getUserById = async (req, res) => { try { const { id } = req.params; // Find user by ID const user = await User.findById(id).select('-password').lean(); if (!user) { return res.status(404).json({ status: 'fail', message: 'User not found', }); } // Get all orders for this user const orders = await Order.find({ user: id }) .populate('items.product', 'nameAr nameEn price images') .populate('promo', 'code discountType discountValue') .sort({ createdAt: -1 }) .lean(); // Get current month date range const now = new Date(); const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1); const endOfMonth = new Date( now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59, ); // Count total orders const totalOrders = orders.length; // Count orders this month const ordersThisMonth = orders.filter( (order) => order.createdAt >= startOfMonth && order.createdAt <= endOfMonth, ).length; // Calculate total spent const totalSpent = orders.reduce((sum, order) => sum + order.totalPrice, 0); // Calculate tier based on order count let tier = 'حديدي'; // Iron (default for 0 orders) if (totalOrders >= 35) { tier = 'بلاتيني'; // Platinum } else if (totalOrders >= 20) { tier = 'ذهبي'; // Gold } else if (totalOrders >= 10) { tier = 'فضي'; // Silver } else if (totalOrders >= 1) { tier = 'برونزي'; // Bronze } // isActive is true if user has orders this month const isActive = ordersThisMonth > 0; res.status(200).json({ status: 'success', data: { user: { ...user, totalOrders, totalSpent, tier, isActive, }, orders, }, }); } catch (err) { console.error('Error fetching user by ID:', err); res.status(500).json({ status: 'fail', message: 'Failed to fetch user details', error: err.message, }); } }; // Delete a user exports.deleteUser = async (req, res) => { try { const user = await User.findByIdAndDelete(req.params.id); if (!user) { return res.status(404).json({ status: 'fail', message: 'User not found', }); } res.status(204).json({ status: 'success', data: null, }); } catch (err) { res.status(500).json({ status: 'fail', message: 'Failed to delete user', error: err.message, }); } };