File size: 4,929 Bytes
634b9bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
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,
    });
  }
};