ernestmindres commited on
Commit
d1829d1
·
verified ·
1 Parent(s): d7dc4e2

Update web_routes.py

Browse files
Files changed (1) hide show
  1. 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
- @login_required
203
- def create_repository():
204
- """Point API pour créer un nouveau dépôt utilisateur."""
 
 
 
 
 
 
 
205
 
206
- user_id = session.get('user_id')
207
  data = request.get_json()
208
 
209
- if not user_id:
210
- return jsonify({"success": False, "message": "Session utilisateur requise."}), 401
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) # Utiliser cette ligne quand la vérification du plan sera là
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
- return jsonify({"success": False, "message": f"Un dépôt avec le nom '{repo_name}' existe déjà."}), 409
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
- return jsonify({"success": False, "message": f"Échec de l'enregistrement du dépôt: {message_db}"}), 500
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
- # NOTE: On peut choisir de laisser la BDD à jour et logguer l'erreur HF
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):