File size: 7,181 Bytes
7bac7c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ea2d2fc
7bac7c5
ea2d2fc
 
 
 
7bac7c5
ea2d2fc
 
7bac7c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
193
194
195
196
197
198
199
200
201
202
203
from flask import jsonify, request
from models.user import User
from models.department import Department
from utils.auth import generate_token
import logging

# Configure logging
logger = logging.getLogger(__name__)

def create_user():
    """Create a new user and update their department's members array"""
    data = request.get_json()
    
    # Check if required fields are present
    required_fields = ['email', 'name', 'password', 'position', 'permissions', 'department_id']
    for field in required_fields:
        if field not in data:
            return jsonify({'message': f'Missing required field: {field}'}), 400
    
    # Check if user with this email already exists
    existing_user = User.find_by_email(data['email'])
    if existing_user:
        return jsonify({'message': 'User with this email already exists'}), 400
    
    # Check if permissions are valid
    if data['permissions'] not in ['Admin', 'User']:
        data['permissions'] = 'User'  # Default to User if invalid
    
    # Check if department exists
    department = Department.find_by_id(data['department_id'])
    if not department:
        return jsonify({'message': 'Department not found'}), 404
    
    try:
        # Hash password
        hashed_password = User.hash_password(data['password'])
        
        # Create new user
        user = User(
            email=data['email'],
            name=data['name'],
            password=hashed_password,
            permissions=data['permissions'],
            position=data['position'],
            department_id=department._id
        )
        
        if user.save():
            # Add user to department members
            department.add_member(user._id)
            
            return jsonify({
                'message': 'User created successfully',
                'user': user.to_dict()
            }), 201
        else:
            return jsonify({'message': 'Failed to save user'}), 500
            
    except Exception as e:
        logger.error(f"Error creating user: {str(e)}")
        return jsonify({'message': f'Error creating user: {str(e)}'}), 500

def create_users_bulk():
    """Create multiple users in bulk and update their departments"""
    data = request.get_json()
    
    if not isinstance(data, list):
        return jsonify({'message': 'Request body must be an array of users'}), 400
    
    created_users = []
    errors = []
    
    for i, user_data in enumerate(data):
        # Check if required fields are present
        required_fields = ['email', 'name', 'password', 'position', 'permissions', 'department_id']
        missing_fields = [field for field in required_fields if field not in user_data]
        
        if missing_fields:
            errors.append(f"User {i+1}: Missing required fields: {', '.join(missing_fields)}")
            continue
        
        # Check if user already exists
        if User.find_by_email(user_data['email']):
            errors.append(f"User {i+1}: User with email {user_data['email']} already exists")
            continue
        
        # Check if department exists
        department = Department.find_by_id(user_data['department_id'])
        if not department:
            errors.append(f"User {i+1}: Department not found")
            continue
        
        try:
            # Hash password
            hashed_password = User.hash_password(user_data['password'])
            
            # Create new user
            user = User(
                email=user_data['email'],
                name=user_data['name'],
                password=hashed_password,
                permissions=user_data['permissions'],
                position=user_data['position'],
                department_id=department._id
            )
            
            if user.save():
                # Add user to department members
                department.add_member(user._id)
                created_users.append(user.to_dict())
            else:
                errors.append(f"User {i+1}: Failed to save user {user_data['email']}")
                
        except Exception as e:
            logger.error(f"Error creating user {user_data['email']}: {str(e)}")
            errors.append(f"User {i+1}: Error creating user: {str(e)}")
    
    return jsonify({
        'message': f'Created {len(created_users)} users with {len(errors)} errors',
        'users': created_users,
        'errors': errors
    }), 201 if created_users else 400

def get_all_users(current_user=None):
    """Get all users"""
    logger.info(f"get_all_users called")
    if current_user:
        logger.info(f"Called by user: {current_user._id}, {current_user.email}, Permissions: {current_user.permissions}")
    
    users = User.get_all()
    logger.info(f"Found {len(users)} users in the database")
    
    return jsonify({'users': [user.to_dict() for user in users]}), 200

def get_user(user_id):
    """Get a specific user by ID"""
    user = User.find_by_id(user_id)
    if not user:
        return jsonify({'message': 'User not found'}), 404
    
    return jsonify({'user': user.to_dict()}), 200

def update_user(user_id):
    """Update a user's information"""
    user = User.find_by_id(user_id)
    if not user:
        return jsonify({'message': 'User not found'}), 404
    
    data = request.get_json()
    
    # Update fields if provided
    if 'name' in data:
        user.name = data['name']
    
    if 'position' in data:
        user.position = data['position']
    
    if 'permissions' in data and data['permissions'] in ['Admin', 'User']:
        user.permissions = data['permissions']
    
    # For department_id changes, we need to update both the user and the departments
    if 'department_id' in data and str(data['department_id']) != str(user.department_id):
        # Get old and new departments
        old_department = Department.find_by_id(user.department_id)
        new_department = Department.find_by_id(data['department_id'])
        
        if not new_department:
            return jsonify({'message': 'New department not found'}), 404
        
        # Remove user from old department
        if old_department:
            old_department.remove_member(user._id)
        
        # Update user's department
        user.department_id = new_department._id
        
        # Add user to new department
        new_department.add_member(user._id)
    
    if user.save():
        return jsonify({
            'message': 'User updated successfully',
            'user': user.to_dict()
        }), 200
    else:
        return jsonify({'message': 'Failed to update user'}), 500

def delete_user(user_id):
    """Delete a user and remove them from their department's members array"""
    user = User.find_by_id(user_id)
    if not user:
        return jsonify({'message': 'User not found'}), 404
    
    # Remove user from department
    department = Department.find_by_id(user.department_id)
    if department:
        department.remove_member(user._id)
    
    # Delete user
    if user.delete():
        return jsonify({'message': 'User deleted successfully'}), 200
    else:
        return jsonify({'message': 'Failed to delete user'}), 500