ERNESTMIND2.5 / app.py
ernestmindres's picture
Upload 6 files
f490d20 verified
# 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)