Spaces:
Sleeping
Sleeping
| import sqlite3 | |
| import bcrypt | |
| from services.database import get_connection | |
| def create_user(email, password, face_image=None, prenom=None, nom=None, telephone=None, is_admin=0): | |
| """Crée un utilisateur normal (admin=0 par défaut)""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt()) | |
| try: | |
| cursor.execute("SELECT id FROM users WHERE email = ?", (email,)) | |
| if cursor.fetchone(): | |
| print(f" Email déjà existant: {email}") | |
| conn.close() | |
| return False | |
| cursor.execute( | |
| "INSERT INTO users (email, password, face_image, prenom, nom, telephone, is_admin) VALUES (?, ?, ?, ?, ?, ?, ?)", | |
| (email, hashed, face_image, prenom, nom, telephone, is_admin) | |
| ) | |
| conn.commit() | |
| print(f" Utilisateur créé: {email} (admin: {is_admin})") | |
| conn.close() | |
| return True | |
| except Exception as e: | |
| print(f" Erreur création: {e}") | |
| conn.close() | |
| return False | |
| def verify_user(email, password): | |
| """Vérifie les identifiants et retourne les infos utilisateur""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| cursor.execute("SELECT password, is_admin FROM users WHERE email=?", (email,)) | |
| result = cursor.fetchone() | |
| conn.close() | |
| if result and bcrypt.checkpw(password.encode(), result[0]): | |
| return {"email": email, "is_admin": result[1]} | |
| return None | |
| def get_user_by_email(email): | |
| """Récupère les infos d'un utilisateur""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| cursor.execute( | |
| "SELECT id, email, is_admin, face_image, prenom, nom, telephone, created_at, public_stats, COALESCE(is_online, 0) FROM users WHERE email=?", | |
| (email,) | |
| ) | |
| result = cursor.fetchone() | |
| conn.close() | |
| if result: | |
| return { | |
| "id": result[0], | |
| "email": result[1], | |
| "is_admin": result[2], | |
| "face_image": result[3], | |
| "prenom": result[4] or "", | |
| "nom": result[5] or "", | |
| "telephone": result[6] or "", | |
| "created_at": result[7] or "", | |
| "public_stats": bool(result[8]), | |
| "is_online": bool(result[9]), | |
| } | |
| return None | |
| def set_online_status(email, value: bool): | |
| """Active ou désactive le statut en ligne de l'utilisateur""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| try: | |
| cursor.execute("UPDATE users SET is_online = ? WHERE email = ?", (1 if value else 0, email)) | |
| conn.commit() | |
| return True | |
| except Exception as e: | |
| print(f"Erreur set_online_status: {e}") | |
| return False | |
| finally: | |
| conn.close() | |
| def set_public_stats(email, value: bool): | |
| """Active ou désactive la visibilité publique des stats de l'utilisateur""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| try: | |
| cursor.execute("UPDATE users SET public_stats = ? WHERE email = ?", (1 if value else 0, email)) | |
| conn.commit() | |
| return True | |
| except Exception as e: | |
| print(f"Erreur set_public_stats: {e}") | |
| return False | |
| finally: | |
| conn.close() | |
| def update_user_profile(email, prenom, nom, telephone): | |
| """Met à jour les informations de profil d'un utilisateur""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| try: | |
| cursor.execute( | |
| "UPDATE users SET prenom=?, nom=?, telephone=? WHERE email=?", | |
| (prenom, nom, telephone, email) | |
| ) | |
| conn.commit() | |
| return cursor.rowcount > 0 | |
| except Exception as e: | |
| print(f" Erreur mise à jour profil: {e}") | |
| return False | |
| finally: | |
| conn.close() | |
| def is_admin(email): | |
| """Vérifie si un utilisateur est admin""" | |
| user = get_user_by_email(email) | |
| return user and user["is_admin"] == 1 | |
| def promote_to_admin(email): | |
| """Promouvoir un utilisateur en admin""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| cursor.execute("UPDATE users SET is_admin = 1 WHERE email = ?", (email,)) | |
| conn.commit() | |
| success = cursor.rowcount > 0 | |
| conn.close() | |
| if success: | |
| print(f" {email} est maintenant admin") | |
| return success | |
| def demote_from_admin(email): | |
| """Rétrograder un admin en utilisateur normal""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| # Vérifier que ce n'est pas le dernier admin | |
| cursor.execute("SELECT COUNT(*) FROM users WHERE is_admin = 1") | |
| admin_count = cursor.fetchone()[0] | |
| if admin_count <= 1: | |
| print(" Impossible de rétrograder le dernier admin") | |
| conn.close() | |
| return False | |
| cursor.execute("UPDATE users SET is_admin = 0 WHERE email = ?", (email,)) | |
| conn.commit() | |
| success = cursor.rowcount > 0 | |
| conn.close() | |
| return success | |
| def get_all_users(): | |
| """Récupère tous les utilisateurs (pour admin)""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| cursor.execute("SELECT id, email, is_admin, face_image FROM users ORDER BY id DESC") | |
| users = cursor.fetchall() | |
| conn.close() | |
| return users | |
| # Ajoute ces fonctions à la fin du fichier auth_service.py | |
| def promote_to_admin(email): | |
| """Promouvoir un utilisateur en admin""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| try: | |
| cursor.execute("UPDATE users SET is_admin = 1 WHERE email = ?", (email,)) | |
| conn.commit() | |
| success = cursor.rowcount > 0 | |
| if success: | |
| print(f" {email} promu admin") | |
| return success | |
| except Exception as e: | |
| print(f" Erreur promotion: {e}") | |
| return False | |
| finally: | |
| conn.close() | |
| def demote_from_admin(email): | |
| """Rétrograder un admin en utilisateur normal""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| try: | |
| # Vérifier que ce n'est pas le dernier admin | |
| cursor.execute("SELECT COUNT(*) FROM users WHERE is_admin = 1") | |
| admin_count = cursor.fetchone()[0] | |
| if admin_count <= 1: | |
| print(" Impossible de rétrograder le dernier admin") | |
| return False | |
| cursor.execute("UPDATE users SET is_admin = 0 WHERE email = ?", (email,)) | |
| conn.commit() | |
| success = cursor.rowcount > 0 | |
| if success: | |
| print(f" {email} rétrogradé") | |
| return success | |
| except Exception as e: | |
| print(f" Erreur rétrogradation: {e}") | |
| return False | |
| finally: | |
| conn.close() | |
| def delete_user(user_id): | |
| """Supprimer un utilisateur par son ID""" | |
| conn = get_connection() | |
| cursor = conn.cursor() | |
| try: | |
| # Vérifier que ce n'est pas le dernier admin | |
| cursor.execute("SELECT email, is_admin FROM users WHERE id = ?", (user_id,)) | |
| user = cursor.fetchone() | |
| if user and user[1] == 1: # C'est un admin | |
| cursor.execute("SELECT COUNT(*) FROM users WHERE is_admin = 1") | |
| admin_count = cursor.fetchone()[0] | |
| if admin_count <= 1: | |
| print(" Impossible de supprimer le dernier admin") | |
| return False | |
| cursor.execute("DELETE FROM users WHERE id = ?", (user_id,)) | |
| conn.commit() | |
| deleted = cursor.rowcount > 0 | |
| if deleted: | |
| print(f" Utilisateur {user_id} supprimé") | |
| return deleted | |
| except Exception as e: | |
| print(f" Erreur suppression: {e}") | |
| return False | |
| finally: | |
| conn.close() | |
| # ... (garde les autres fonctions comme get_users_with_faces, etc.) |