Spaces:
Build error
Build error
Update auth_backend.py
Browse files- auth_backend.py +106 -2
auth_backend.py
CHANGED
|
@@ -17,7 +17,8 @@ from baserow_storage import (
|
|
| 17 |
# Fonctions de recherche indexées (nouvelles et plus efficaces)
|
| 18 |
get_user_by_email,
|
| 19 |
get_client_user_by_api_key,
|
| 20 |
-
|
|
|
|
| 21 |
)
|
| 22 |
from flask import session
|
| 23 |
from config import PLANS_CONFIG
|
|
@@ -251,4 +252,107 @@ def update_user_profile(user_id: str, username: str, email: str, new_password: O
|
|
| 251 |
if save_primary_user_data(user_data, commit_msg=f"feat: Mise à jour du profil utilisateur {user_id}"):
|
| 252 |
return True, "Votre profil a été mis à jour avec succès."
|
| 253 |
else:
|
| 254 |
-
return False, "Une erreur s'est produite lors de la sauvegarde du profil."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
# Fonctions de recherche indexées (nouvelles et plus efficaces)
|
| 18 |
get_user_by_email,
|
| 19 |
get_client_user_by_api_key,
|
| 20 |
+
FIELD_USER_TYPE,
|
| 21 |
+
FIELD_CLIENT_ID,
|
| 22 |
)
|
| 23 |
from flask import session
|
| 24 |
from config import PLANS_CONFIG
|
|
|
|
| 252 |
if save_primary_user_data(user_data, commit_msg=f"feat: Mise à jour du profil utilisateur {user_id}"):
|
| 253 |
return True, "Votre profil a été mis à jour avec succès."
|
| 254 |
else:
|
| 255 |
+
return False, "Une erreur s'est produite lors de la sauvegarde du profil."
|
| 256 |
+
|
| 257 |
+
def register_end_user(client_id: str, username: str, email: str, password: str, confirm_password: str) -> tuple[Optional[str], str, Optional[Dict]]:
|
| 258 |
+
"""
|
| 259 |
+
Enregistre un nouvel utilisateur final (End User) lié à un utilisateur client (Primary User).
|
| 260 |
+
"""
|
| 261 |
+
if password != confirm_password:
|
| 262 |
+
return None, "Les mots de passe ne correspondent pas.", None
|
| 263 |
+
if len(password) < 8:
|
| 264 |
+
return None, "Le mot de passe doit contenir au moins 8 caractères.", None
|
| 265 |
+
|
| 266 |
+
# Vérification de l'unicité de l'email UNIQUEMENT pour ce client et pour le type 'End'
|
| 267 |
+
existing_user_by_email = load_primary_user_data(
|
| 268 |
+
filters={
|
| 269 |
+
FIELD_EMAIL: email,
|
| 270 |
+
FIELD_USER_TYPE: 'End',
|
| 271 |
+
FIELD_CLIENT_ID: client_id
|
| 272 |
+
}
|
| 273 |
+
)
|
| 274 |
+
if existing_user_by_email:
|
| 275 |
+
return None, "Cet email est déjà utilisé pour votre service.", None
|
| 276 |
+
|
| 277 |
+
# 1. Création des données de l'utilisateur final
|
| 278 |
+
user_id = str(uuid.uuid4())
|
| 279 |
+
password_hash = generate_password_hash(password)
|
| 280 |
+
|
| 281 |
+
new_user_data = {
|
| 282 |
+
FIELD_ID: user_id,
|
| 283 |
+
FIELD_EMAIL: email,
|
| 284 |
+
FIELD_USERNAME: username,
|
| 285 |
+
FIELD_PASSWORD_HASH: password_hash,
|
| 286 |
+
FIELD_DATE_CREATION: datetime.now().isoformat(),
|
| 287 |
+
FIELD_USER_TYPE: 'End', # <-- IMPORTANT: Marquer comme utilisateur final
|
| 288 |
+
FIELD_CLIENT_ID: client_id, # <-- IMPORTANT: Lier au client principal
|
| 289 |
+
FIELD_PLAN: PLANS_CONFIG['free']['baserow_value'], # Plan par défaut
|
| 290 |
+
}
|
| 291 |
+
|
| 292 |
+
# 2. Sauvegarde dans Baserow (dans la même table)
|
| 293 |
+
success, row_id = save_primary_user_data(new_user_data, is_new=True)
|
| 294 |
+
|
| 295 |
+
if success:
|
| 296 |
+
new_user_data['baserow_row_id'] = row_id
|
| 297 |
+
return user_id, "Inscription réussie !", new_user_data
|
| 298 |
+
else:
|
| 299 |
+
return None, f"Erreur lors de l'enregistrement dans la base de données. ID: {user_id}", None
|
| 300 |
+
|
| 301 |
+
def login_end_user(client_id: str, email: str, password: str) -> tuple[Optional[str], str, Optional[Dict]]:
|
| 302 |
+
"""
|
| 303 |
+
Connecte un utilisateur final (End User) lié à un client donné.
|
| 304 |
+
"""
|
| 305 |
+
user_data_list = load_primary_user_data(
|
| 306 |
+
filters={
|
| 307 |
+
FIELD_EMAIL: email,
|
| 308 |
+
FIELD_USER_TYPE: 'End', # Filtrer uniquement les utilisateurs finaux
|
| 309 |
+
FIELD_CLIENT_ID: client_id # Filtrer par l'ID du client
|
| 310 |
+
}
|
| 311 |
+
)
|
| 312 |
+
|
| 313 |
+
if not user_data_list:
|
| 314 |
+
return None, "Email ou mot de passe invalide.", None
|
| 315 |
+
|
| 316 |
+
user_data = user_data_list[0]
|
| 317 |
+
|
| 318 |
+
if check_password_hash(user_data.get(FIELD_PASSWORD_HASH), password):
|
| 319 |
+
return user_data.get(FIELD_ID), "Connexion réussie.", user_data
|
| 320 |
+
else:
|
| 321 |
+
return None, "Email ou mot de passe invalide.", None
|
| 322 |
+
|
| 323 |
+
def reset_end_user_password(client_id: str, email: str, new_password: str, confirm_password: str) -> tuple[bool, str]:
|
| 324 |
+
"""
|
| 325 |
+
Réinitialise le mot de passe d'un utilisateur final (End User) lié à un client donné.
|
| 326 |
+
"""
|
| 327 |
+
if new_password != confirm_password:
|
| 328 |
+
return False, "Les mots de passe ne correspondent pas."
|
| 329 |
+
if len(new_password) < 8:
|
| 330 |
+
return False, "Le nouveau mot de passe est trop court (min 8 caractères)."
|
| 331 |
+
|
| 332 |
+
user_data_list = load_primary_user_data(
|
| 333 |
+
filters={
|
| 334 |
+
FIELD_EMAIL: email,
|
| 335 |
+
FIELD_USER_TYPE: 'End',
|
| 336 |
+
FIELD_CLIENT_ID: client_id
|
| 337 |
+
}
|
| 338 |
+
)
|
| 339 |
+
|
| 340 |
+
if not user_data_list:
|
| 341 |
+
return False, "Utilisateur non trouvé."
|
| 342 |
+
|
| 343 |
+
user_data = user_data_list[0]
|
| 344 |
+
|
| 345 |
+
# Mise à jour du mot de passe
|
| 346 |
+
user_data[FIELD_PASSWORD_HASH] = generate_password_hash(new_password)
|
| 347 |
+
|
| 348 |
+
baserow_row_id = user_data.get('baserow_row_id')
|
| 349 |
+
|
| 350 |
+
if baserow_row_id is None:
|
| 351 |
+
return False, "Erreur de configuration: ID de ligne Baserow manquant."
|
| 352 |
+
|
| 353 |
+
success, _ = save_primary_user_data(user_data, commit_to_baserow=True)
|
| 354 |
+
|
| 355 |
+
if success:
|
| 356 |
+
return True, "Votre mot de passe a été réinitialisé avec succès."
|
| 357 |
+
else:
|
| 358 |
+
return False, "Une erreur s'est produite lors de la réinitialisation du mot de passe."
|