Spaces:
Build error
Build error
Update web_routes.py
Browse files- web_routes.py +21 -15
web_routes.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
# web_routes.py (Version API Pure - Logique Métier Conservée)
|
| 2 |
-
|
| 3 |
import shutil
|
| 4 |
# Suppression de render_template, redirect, url_for, flash
|
| 5 |
from flask import Blueprint, request, jsonify, send_from_directory, current_app, session
|
|
@@ -198,21 +198,29 @@ def delete_project_api(deploy_id):
|
|
| 198 |
# NOUVELLES ROUTES POUR LA GESTION DES DÉPÔTS (GitForge)
|
| 199 |
# ----------------------------------------------------------------------
|
| 200 |
|
|
|
|
| 201 |
@web_bp.route('/api/create_repository', methods=['POST'])
|
| 202 |
-
@
|
| 203 |
-
def create_repository():
|
| 204 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 205 |
|
| 206 |
-
user_id = session.get('user_id')
|
| 207 |
data = request.get_json()
|
| 208 |
|
| 209 |
-
if not user_id
|
| 210 |
-
|
| 211 |
if not data or 'repo-name' not in data or 'visibility' not in data:
|
| 212 |
return jsonify({"success": False, "message": "Nom et visibilité du dépôt requis."}), 400
|
| 213 |
|
| 214 |
repo_name = data.get('repo-name').strip()
|
| 215 |
# Créer un slug simple pour le chemin HF et l'URL
|
|
|
|
| 216 |
repo_slug = secure_filename(repo_name).lower().replace('-', '_')
|
| 217 |
|
| 218 |
if not repo_slug:
|
|
@@ -224,12 +232,12 @@ def create_repository():
|
|
| 224 |
return jsonify({"success": False, "message": "Visibilité invalide."}), 400
|
| 225 |
|
| 226 |
# 1. Vérification des limites de plan (À implémenter plus tard si besoin)
|
| 227 |
-
# limit = get_plan_limit(user_plan)
|
| 228 |
|
| 229 |
# 2. Vérification de l'existence du slug (pour s'assurer que l'utilisateur ne crée pas de doublon)
|
| 230 |
existing_repos = get_all_user_repositories(user_id)
|
| 231 |
if any(repo['repo_slug'] == repo_slug for repo in existing_repos):
|
| 232 |
-
|
| 233 |
|
| 234 |
# 3. Préparation des données du nouveau dépôt
|
| 235 |
repo_id = str(uuid.uuid4()) # ID unique pour le dépôt
|
|
@@ -237,7 +245,7 @@ def create_repository():
|
|
| 237 |
"repo_id": repo_id,
|
| 238 |
"repo_name": repo_name,
|
| 239 |
"repo_slug": repo_slug,
|
| 240 |
-
"user_id": user_id,
|
| 241 |
"visibility": visibility,
|
| 242 |
"license": data.get('license', 'None'),
|
| 243 |
"description": data.get('description', ''),
|
|
@@ -249,16 +257,14 @@ def create_repository():
|
|
| 249 |
success_db, message_db = save_new_repository(user_id, new_repo_data)
|
| 250 |
|
| 251 |
if not success_db:
|
| 252 |
-
|
| 253 |
|
| 254 |
# 5. Création du dossier initial sur Hugging Face (Stockage de fichiers)
|
| 255 |
success_hf, message_hf = create_empty_repo_folder_on_hf(repo_slug, str(user_id))
|
| 256 |
|
| 257 |
if not success_hf:
|
| 258 |
-
#
|
| 259 |
-
# ou essayer de rollback. Pour l'instant, on log l'erreur et on permet de réessayer plus tard.
|
| 260 |
current_app.logger.error(f"Échec de l'initialisation HF pour {repo_slug}: {message_hf}")
|
| 261 |
-
# On retourne quand même un succès BDD, mais un avertissement
|
| 262 |
return jsonify({
|
| 263 |
"success": True,
|
| 264 |
"message": f"Dépôt créé dans la BDD. Avertissement: Échec de l'initialisation du dossier sur Hugging Face ({message_hf}).",
|
|
@@ -273,10 +279,10 @@ def create_repository():
|
|
| 273 |
}), 201
|
| 274 |
|
| 275 |
except Exception as e:
|
|
|
|
| 276 |
current_app.logger.error(f"Erreur inattendue lors de la création du dépôt: {e}")
|
| 277 |
return jsonify({"success": False, "message": "Erreur serveur inattendue."}), 500
|
| 278 |
|
| 279 |
-
|
| 280 |
@web_bp.route('/api/repository_files/<repo_slug>', methods=['GET'])
|
| 281 |
@login_required
|
| 282 |
def get_repository_files(repo_slug):
|
|
|
|
| 1 |
# web_routes.py (Version API Pure - Logique Métier Conservée)
|
| 2 |
+
from decorators import api_session_required
|
| 3 |
import shutil
|
| 4 |
# Suppression de render_template, redirect, url_for, flash
|
| 5 |
from flask import Blueprint, request, jsonify, send_from_directory, current_app, session
|
|
|
|
| 198 |
# NOUVELLES ROUTES POUR LA GESTION DES DÉPÔTS (GitForge)
|
| 199 |
# ----------------------------------------------------------------------
|
| 200 |
|
| 201 |
+
|
| 202 |
@web_bp.route('/api/create_repository', methods=['POST'])
|
| 203 |
+
@api_session_required # ⬅️ CHANGEMENT CLÉ : Utiliser le décorateur API basé sur la session
|
| 204 |
+
def create_repository(client_user): # ⬅️ CHANGEMENT CLÉ : Accepter l'objet utilisateur injecté
|
| 205 |
+
"""
|
| 206 |
+
Point API pour créer un nouveau dépôt utilisateur.
|
| 207 |
+
L'utilisateur est authentifié et fourni par le décorateur @api_session_required via la session.
|
| 208 |
+
"""
|
| 209 |
+
|
| 210 |
+
# 1. Récupération de l'ID utilisateur à partir de l'objet injecté
|
| 211 |
+
# L'authentification (vérification de la session) est gérée par le décorateur.
|
| 212 |
+
user_id = client_user['uuid']
|
| 213 |
|
|
|
|
| 214 |
data = request.get_json()
|
| 215 |
|
| 216 |
+
# L'ancienne vérification 'if not user_id' est désormais gérée par le décorateur.
|
| 217 |
+
|
| 218 |
if not data or 'repo-name' not in data or 'visibility' not in data:
|
| 219 |
return jsonify({"success": False, "message": "Nom et visibilité du dépôt requis."}), 400
|
| 220 |
|
| 221 |
repo_name = data.get('repo-name').strip()
|
| 222 |
# Créer un slug simple pour le chemin HF et l'URL
|
| 223 |
+
# secure_filename doit être importé de werkzeug.utils
|
| 224 |
repo_slug = secure_filename(repo_name).lower().replace('-', '_')
|
| 225 |
|
| 226 |
if not repo_slug:
|
|
|
|
| 232 |
return jsonify({"success": False, "message": "Visibilité invalide."}), 400
|
| 233 |
|
| 234 |
# 1. Vérification des limites de plan (À implémenter plus tard si besoin)
|
| 235 |
+
# limit = get_plan_limit(client_user.get('user_plan'))
|
| 236 |
|
| 237 |
# 2. Vérification de l'existence du slug (pour s'assurer que l'utilisateur ne crée pas de doublon)
|
| 238 |
existing_repos = get_all_user_repositories(user_id)
|
| 239 |
if any(repo['repo_slug'] == repo_slug for repo in existing_repos):
|
| 240 |
+
return jsonify({"success": False, "message": f"Un dépôt avec le nom '{repo_name}' existe déjà."}), 409
|
| 241 |
|
| 242 |
# 3. Préparation des données du nouveau dépôt
|
| 243 |
repo_id = str(uuid.uuid4()) # ID unique pour le dépôt
|
|
|
|
| 245 |
"repo_id": repo_id,
|
| 246 |
"repo_name": repo_name,
|
| 247 |
"repo_slug": repo_slug,
|
| 248 |
+
"user_id": user_id, # ⬅️ ID utilisateur récupéré et correctement utilisé
|
| 249 |
"visibility": visibility,
|
| 250 |
"license": data.get('license', 'None'),
|
| 251 |
"description": data.get('description', ''),
|
|
|
|
| 257 |
success_db, message_db = save_new_repository(user_id, new_repo_data)
|
| 258 |
|
| 259 |
if not success_db:
|
| 260 |
+
return jsonify({"success": False, "message": f"Échec de l'enregistrement du dépôt: {message_db}"}), 500
|
| 261 |
|
| 262 |
# 5. Création du dossier initial sur Hugging Face (Stockage de fichiers)
|
| 263 |
success_hf, message_hf = create_empty_repo_folder_on_hf(repo_slug, str(user_id))
|
| 264 |
|
| 265 |
if not success_hf:
|
| 266 |
+
# On log l'erreur et on retourne quand même un succès BDD, mais un avertissement
|
|
|
|
| 267 |
current_app.logger.error(f"Échec de l'initialisation HF pour {repo_slug}: {message_hf}")
|
|
|
|
| 268 |
return jsonify({
|
| 269 |
"success": True,
|
| 270 |
"message": f"Dépôt créé dans la BDD. Avertissement: Échec de l'initialisation du dossier sur Hugging Face ({message_hf}).",
|
|
|
|
| 279 |
}), 201
|
| 280 |
|
| 281 |
except Exception as e:
|
| 282 |
+
# current_app doit être importé de flask
|
| 283 |
current_app.logger.error(f"Erreur inattendue lors de la création du dépôt: {e}")
|
| 284 |
return jsonify({"success": False, "message": "Erreur serveur inattendue."}), 500
|
| 285 |
|
|
|
|
| 286 |
@web_bp.route('/api/repository_files/<repo_slug>', methods=['GET'])
|
| 287 |
@login_required
|
| 288 |
def get_repository_files(repo_slug):
|