ernestmindres commited on
Commit
91d162f
·
verified ·
1 Parent(s): 5a3d468

Update auth_backend.py

Browse files
Files changed (1) hide show
  1. 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
- # load_users_data est désormais obsolète et retiré.
 
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."