File size: 4,730 Bytes
f490d20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# 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)