91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
from typing import Optional, List
|
|
from models import db, User, UserRole, Tenant
|
|
from models import AuditLog
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class UserAdminService:
|
|
@staticmethod
|
|
def get_users():
|
|
return User.query.order_by(User.created_at.desc()).all()
|
|
|
|
@staticmethod
|
|
def update_user(target_user, email, name, role, admin_user):
|
|
target_user.email = email if email else target_user.email
|
|
target_user.name = name if name else target_user.name
|
|
if role in [r.value for r in UserRole]:
|
|
target_user.role = UserRole(role)
|
|
|
|
db.session.commit()
|
|
|
|
AuditLog.log_action(
|
|
action='update',
|
|
resource_type='user',
|
|
user=admin_user,
|
|
resource_id=target_user.id,
|
|
details={'email': target_user.email, 'role': target_user.role.value}
|
|
)
|
|
|
|
@staticmethod
|
|
def delete_user(target_user, admin_user):
|
|
db.session.delete(target_user)
|
|
db.session.commit()
|
|
|
|
AuditLog.log_action(
|
|
action='delete',
|
|
resource_type='user',
|
|
user=admin_user,
|
|
resource_id=target_user.id,
|
|
details={'email': target_user.email}
|
|
)
|
|
|
|
@staticmethod
|
|
def assign_tenant_to_user(user, tenant, admin_user):
|
|
"""Assign a tenant to a user."""
|
|
if tenant not in user.tenants:
|
|
user.tenants.append(tenant)
|
|
db.session.commit()
|
|
|
|
AuditLog.log_action(
|
|
action='assign_tenant',
|
|
resource_type='user',
|
|
user=admin_user,
|
|
resource_id=user.id,
|
|
details={'tenant_id': tenant.id, 'tenant_name': tenant.name}
|
|
)
|
|
logger.info(f'Assigned user {user.id} to tenant {tenant.id}')
|
|
|
|
@staticmethod
|
|
def remove_tenant_from_user(user, tenant, admin_user):
|
|
"""Remove a tenant from a user."""
|
|
if tenant in user.tenants:
|
|
user.tenants.remove(tenant)
|
|
db.session.commit()
|
|
|
|
AuditLog.log_action(
|
|
action='remove_tenant',
|
|
resource_type='user',
|
|
user=admin_user,
|
|
resource_id=user.id,
|
|
details={'tenant_id': tenant.id, 'tenant_name': tenant.name}
|
|
)
|
|
logger.info(f'Removed user {user.id} from tenant {tenant.id}')
|
|
|
|
@staticmethod
|
|
def update_user_role(user, role, admin_user):
|
|
"""Update a user's role."""
|
|
if role in [r.value for r in UserRole]:
|
|
old_role = user.role.value
|
|
user.role = UserRole(role)
|
|
db.session.commit()
|
|
|
|
AuditLog.log_action(
|
|
action='update_role',
|
|
resource_type='user',
|
|
user=admin_user,
|
|
resource_id=user.id,
|
|
details={'old_role': old_role, 'new_role': role}
|
|
)
|
|
logger.info(f'Updated user {user.id} role from {old_role} to {role}')
|