Spaces:
Sleeping
Sleeping
| # 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): | |
| 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) | |
| 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 --- | |
| 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 | |
| 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 | |
| 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) --- | |
| 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) |