| import logging
|
| from datetime import datetime
|
| from src.database_manager import DatabaseManager
|
|
|
| class AuthManager:
|
| def __init__(self):
|
| self.db_manager = DatabaseManager()
|
|
|
| def authenticate_user(self, username, password):
|
| """Authenticate user and return user data"""
|
| try:
|
|
|
| user = self.db_manager.execute_query_one(
|
| "SELECT id, username, email, name, role, org FROM users WHERE username = %s",
|
| (username,)
|
| )
|
|
|
| if not user:
|
| return None
|
|
|
|
|
| user_password = self.db_manager.execute_query_one(
|
| "SELECT password FROM users WHERE username = %s",
|
| (username,)
|
| )
|
|
|
| if not user_password or user_password['password'] != password:
|
| return None
|
|
|
|
|
| self.db_manager.execute_query(
|
| "UPDATE users SET last_login = %s WHERE id = %s",
|
| (datetime.now(), user['id'])
|
| )
|
|
|
| return user
|
|
|
| except Exception as e:
|
| logging.error(f"Authentication error: {e}")
|
| return None
|
|
|
| def create_user(self, username, email, password, name, role, org_name="", phone="",
|
| country_code="", department="", location="", organization_id=None):
|
| """Create a new user account"""
|
| try:
|
|
|
| existing_user = self.db_manager.execute_query_one(
|
| "SELECT id FROM users WHERE username = %s OR email = %s",
|
| (username, email)
|
| )
|
|
|
| if existing_user:
|
| return False
|
|
|
|
|
| if role == 'organization':
|
|
|
| org_result = self.db_manager.execute_query(
|
| """INSERT INTO organizations (name, email, phone, country_code, department, location, created_at)
|
| VALUES (%s, %s, %s, %s, %s, %s, %s)""",
|
| (org_name or name, email, phone, country_code, department, location, datetime.now())
|
| )
|
|
|
| if not org_result:
|
| return False
|
|
|
|
|
| org_id = self.db_manager.execute_query_one(
|
| "SELECT id FROM organizations WHERE email = %s ORDER BY created_at DESC LIMIT 1",
|
| (email,)
|
| )
|
| organization_id = org_id['id'] if org_id else None
|
|
|
|
|
| user_result = self.db_manager.execute_query(
|
| """INSERT INTO users (username, email, password, name, role, org, created_at)
|
| VALUES (%s, %s, %s, %s, %s, %s, %s)""",
|
| (username, email, password, name, role, organization_id, datetime.now())
|
| )
|
|
|
| return bool(user_result)
|
|
|
| except Exception as e:
|
| logging.error(f"User creation error: {e}")
|
| return False
|
|
|
| def get_organizations(self):
|
| """Get list of all organizations"""
|
| try:
|
| organizations = self.db_manager.execute_query(
|
| "SELECT id, name FROM organizations ORDER BY name",
|
| fetch=True
|
| )
|
| return organizations or []
|
| except Exception as e:
|
| logging.error(f"Error fetching organizations: {e}")
|
| return []
|
|
|
| def get_organization_practitioners(self, organization_id):
|
| """Get practitioners for an organization"""
|
| try:
|
| practitioners = self.db_manager.execute_query(
|
| """SELECT id, username, name, email, created_at, last_login
|
| FROM users WHERE org = %s AND role = 'practitioner'
|
| ORDER BY created_at DESC""",
|
| (organization_id,),
|
| fetch=True
|
| )
|
| return practitioners or []
|
| except Exception as e:
|
| logging.error(f"Error fetching practitioners: {e}")
|
| return []
|
|
|
| def update_user_profile(self, user_id, name=None, email=None):
|
| """Update user profile information"""
|
| try:
|
| if name:
|
| self.db_manager.execute_query(
|
| "UPDATE users SET name = %s WHERE id = %s",
|
| (name, user_id)
|
| )
|
|
|
| if email:
|
|
|
| existing = self.db_manager.execute_query_one(
|
| "SELECT id FROM users WHERE email = %s AND id != %s",
|
| (email, user_id)
|
| )
|
|
|
| if not existing:
|
| self.db_manager.execute_query(
|
| "UPDATE users SET email = %s WHERE id = %s",
|
| (email, user_id)
|
| )
|
| return True
|
| else:
|
| return False
|
|
|
| return True
|
|
|
| except Exception as e:
|
| logging.error(f"Error updating user profile: {e}")
|
| return False
|
|
|