Spaces:
Running
Running
| 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, | |
| }); | |
| } | |
| }; | |