samoulla-backend / controllers /usersController.js
Samoulla Sync Bot
Auto-deploy Samoulla Backend: b68e45770de26ed39feb4b1c0925e5345eb3a61d
634b9bb
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,
});
}
};