# app.py from flask import Flask, request, jsonify, session, g, redirect, url_for from flask_cors import CORS from functools import wraps import os from dotenv import load_dotenv # <-- CONSERVÉ au cas où, mais n'est pas appelé # Charger les variables d'environnement du fichier .env # load_dotenv() # <-- SUPPRIMÉ pour utiliser directement les variables d'environnement du Space from auth_backend import register_user, login_user, get_user_by_id # Note: conversation_backend n'est pas utilisé ici, mais serait pour les routes de conversation app = Flask(__name__) # Configuration de la clé secrète pour les sessions # C'est important en production, assurez-vous de la définir dans .env ou comme Secret app.secret_key = os.environ.get("FLASK_SECRET_KEY", "super_secret_dev_key") # Permettre les requêtes cross-origin (CORS) CORS(app, supports_credentials=True) # Décorateur pour vérifier si l'utilisateur est connecté def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if 'user_id' not in session: return jsonify({"status": "Error", "message": "Accès non autorisé. Veuillez vous connecter."}), 401 return f(*args, **kwargs) return decorated_function # Route de vérification de l'état (Statut du service) @app.route('/', methods=['GET']) def index(): user_id = session.get('user_id') is_logged_in = user_id is not None user_status = "Connecté" if is_logged_in else "Déconnecté (Invité)" return jsonify({ "status": "OK", "is_logged_in": is_logged_in, "message": f"Bienvenue sur le Backend API ErnestMind. Statut de la session: {user_status}." }) # --- Routes d'Authentification --- @app.route('/api/register', methods=['POST']) def api_register(): data = request.get_json() email = data.get('email') password = data.get('password') if not email or not password: return jsonify({"status": "Error", "message": "Email et mot de passe sont requis."}), 400 user_id, message = register_user(email, password) if user_id: # Inscription réussie et connexion automatique session['user_id'] = user_id return jsonify({"status": "Success", "message": message, "user_id": user_id}), 201 else: return jsonify({"status": "Error", "message": message}), 400 @app.route('/api/login', methods=['POST']) def api_login(): data = request.get_json() email = data.get('email') password = data.get('password') if not email or not password: return jsonify({"status": "Error", "message": "Email et mot de passe sont requis."}), 400 user_id, message = login_user(email, password) if user_id: # Connexion réussie, définir la session session['user_id'] = user_id return jsonify({"status": "Success", "message": message, "user_id": user_id}), 200 else: return jsonify({"status": "Error", "message": message}), 401 # 401 Unauthorized @app.route('/api/logout', methods=['POST']) def api_logout(): # Retirer l'utilisateur de la session session.pop('user_id', None) return jsonify({"status": "Success", "message": "Déconnexion réussie."}), 200 # --- Routes Protégées (Exemple) --- @app.route('/api/profile', methods=['GET']) @login_required def api_profile(): user_id = session['user_id'] user_data = get_user_by_id(user_id) if user_data: # On ne renvoie pas le mot de passe ! profile = { "user_id": user_data["user_id"], "email": user_data["email"], "created_at": user_data["created_at"], "message": "Bienvenue sur votre profil." } return jsonify({"status": "Success", "profile": profile}), 200 # Cas où l'ID est dans la session mais l'utilisateur n'existe pas dans le JSON session.pop('user_id', None) return jsonify({"status": "Error", "message": "Profil introuvable, session réinitialisée."}), 404 if __name__ == '__main__': # Le port est configuré ici pour le développement # Pour Hugging Face Spaces Docker, l'application doit écouter sur le port 7860 # ou celui spécifié par la variable d'environnement PORT, # qui peut être lue via os.environ.get("PORT", 7860) ou similaire. # Ici, nous conservons la logique initiale avec 5000 par défaut # et nous laisserons le Dockerfile s'assurer que le port 5000 est exposé. port = int(os.environ.get("PORT", 5000)) # Note: On utilise le mode debug qui est idéal pour le développement app.run(debug=True, host='0.0.0.0', port=port)