Nexus / user_routes.py
ernestmindres's picture
Update user_routes.py
3911f60 verified
# user_routes.py
from flask import Blueprint, render_template, request, redirect, url_for, session, flash, jsonify
from auth_backend import (
register_user,
login_user,
reset_password_via_security_question,
get_user_by_id,
update_user_profile,
)
from decorators import login_required
# Création du Blueprint 'user_bp'
user_bp = Blueprint('user_bp', __name__)
@user_bp.route("/inscription", methods=['GET', 'POST'])
def inscription():
if request.method == 'POST':
# Traitement du formulaire d'inscription
username = request.form.get("username")
email = request.form.get("email")
password = request.form.get("password")
confirm_password = request.form.get("confirm_password")
security_question = request.form.get("security_question")
security_answer = request.form.get("security_answer")
# CORRECTION ICI: Déballage des 3 valeurs. On utilise '_' pour la troisième (new_user_data)
user_id, message, _ = register_user(username, email, password, confirm_password, security_question, security_answer)
if user_id:
flash(message, "success")
# Rediriger vers la page de connexion après l'inscription
return redirect(url_for('user_bp.connexion'))
else:
flash(message, "error")
return render_template("inscription.html",
username=username,
email=email,
security_question=security_question,
security_answer=security_answer)
return render_template("inscription.html")
@user_bp.route("/connexion")
def connexion():
return render_template("connexion.html")
@user_bp.route("/deconnexion")
@login_required
def deconnexion():
# Déconnexion en vidant la session
session.pop('user_id', None)
flash("Vous êtes déconnecté avec succès.", "success")
# Redirection vers la page d'accueil ou de connexion
return redirect(url_for('web_bp.index'))
@user_bp.route("/mot-de-passe-oublie", methods=['GET', 'POST'])
def mot_de_passe_oublie():
if request.method == 'POST':
username_or_email = request.form.get("username_or_email")
security_answer = request.form.get("security_answer")
new_password = request.form.get("new_password")
confirm_password = request.form.get("confirm_password")
# Validation rapide
if new_password != confirm_password:
flash("Les nouveaux mots de passe ne correspondent pas.", "error")
return render_template("mot_de_passe_oublie.html", username_or_email=username_or_email)
success, message = reset_password_via_security_question(username_or_email, security_answer, new_password)
if success:
flash(message, "success")
return redirect(url_for('user_bp.connexion'))
else:
flash(message, "error")
return render_template("mot_de_passe_oublie.html", username_or_email=username_or_email)
return render_template("mot_de_passe_oublie.html")
# --- Routes du Dashboard ---
@user_bp.route("/dashboard")
@login_required
def dashboard():
"""
Page du tableau de bord. Gère le message de succès de paiement (Phase 4).
"""
user = get_user_by_id(session.get('user_id'))
# Logique pour le succès de paiement
payment_status = request.args.get('payment')
if payment_status == 'success':
# On flashe un message pour l'afficher via Jinja dans le dashboard.html
flash("Félicitations ! Votre abonnement a été activé avec succès.", "success")
# Redirection pour nettoyer l'URL du paramètre de paiement
return redirect(url_for('user_bp.dashboard'))
return render_template("dashboard.html", user=user)
@user_bp.route("/profile", methods=['GET', 'POST']) # <--- AJOUTER 'POST'
@login_required
def profile():
user_id = session.get('user_id')
if request.method == 'POST':
# 1. Récupération des données du formulaire POST
username = request.form.get('username')
email = request.form.get('email')
new_password = request.form.get('new_password')
confirm_password = request.form.get('confirm_password')
# 2. Validation simple côté serveur
if not username or not email:
flash("Le nom d'utilisateur et l'e-mail sont obligatoires.", "error")
elif new_password and new_password != confirm_password:
flash("Le nouveau mot de passe et la confirmation ne correspondent pas.", "error")
else:
# 3. Appel de la fonction de mise à jour du backend
# Note : on passe None si le mot de passe n'est pas fourni/n'est pas validé.
password_to_update = new_password if new_password and new_password == confirm_password else None
success, message = update_user_profile(user_id, username, email, password_to_update)
if success:
flash(message, "success")
# On pourrait aussi rediriger vers la page /profile GET pour rafraîchir la vue
# et nettoyer l'URL.
return redirect(url_for('user_bp.profile'))
else:
# Échec de la mise à jour (ex: email déjà pris, mot de passe trop court)
flash(message, "error")
# Logique pour la méthode GET ou après un échec POST
# On récupère toujours l'utilisateur pour l'affichage (s'assure des données les plus fraîches)
user = get_user_by_id(user_id)
if user is None:
# Erreur critique de session
flash("Erreur de session. Veuillez vous reconnecter.", "error")
session.pop('user_id', None)
return redirect(url_for('user_bp.connexion'))
return render_template("profile.html", user=user)
@user_bp.route("/api-key", methods=['GET'])
@login_required
def api_key():
"""
Affiche la page de gestion des clés API.
L'objet 'user' (retourné par get_user_by_id) contient maintenant la liste 'api_keys' (5 éléments).
"""
user_id = session.get('user_id') # Récupération de l'ID depuis la session
user = get_user_by_id(user_id) # Appel à la fonction qui pourrait retourner None
# --- CORRECTION DE L'ERREUR DÉTECTÉE DANS LES LOGS ---
if user is None:
# Si l'utilisateur n'est pas trouvé malgré le login_required (session corrompue)
flash("Erreur critique de session. Veuillez vous reconnecter.", "error")
# Forcer la déconnexion en vidant la session et rediriger vers la page de connexion
session.pop('user_id', None)
# Si vous utilisez un logger, il faudrait logger cette erreur pour investigation
# current_app.logger.error(f"FAILURE: User ID {user_id} in session but not found in DB.")
return redirect(url_for('user_bp.connexion'))
# ----------------------------------------------------
return render_template("api_key.html", user=user)