Kaynağa Gözat

feat: enhance actualizar method to handle file updates and add eliminarArchivo route for S3 file deletion

AldrickChavarria 3 ay önce
ebeveyn
işleme
6669edb727

+ 54 - 25
Back/backendP-Educativa/app/Http/Controllers/Api/CircularesController.php

@@ -345,13 +345,20 @@ class CircularesController extends Controller
     public function actualizar(Request $request)
     {
         try {
-            $storagePath = 'public/circulares/';
+            $rutaBucket = 'circulares/';
             $archivosAdjuntos = [];
 
-            // Procesar cada archivo en base64
-            if ($request->has('bases64')) {
+            // Obtener los adjuntos anteriores desde la BD
+            $adjuntosAnteriores = DB::table('circulares')
+                ->where('idCircular', $request->idCircular)
+                ->value('jsonAdjuntos');
+
+            $adjuntosAnteriores = $adjuntosAnteriores ? json_decode($adjuntosAnteriores, true) : [];
+
+            // Si se mandan nuevos archivos base64, los procesamos
+            if ($request->has('bases64') && !empty($request->bases64)) {
                 foreach ($request->bases64 as $file) {
-                    // Extraer la extensión del archivo
+                    // Extraer extensión
                     $fileInfo = explode(';', $file['base64'])[0];
                     $fileExtension = explode('/', $fileInfo)[1];
 
@@ -365,25 +372,33 @@ class CircularesController extends Controller
                         case 'vnd.openxmlformats-officedocument.presentationml.presentation':
                             $fileExtension = 'pptx';
                             break;
-                        default;
                     }
 
-                    // Decodificar el archivo base64
+                    // Generar nombre
+                    $fileName = $file['id'] . '.' . $fileExtension;
+                    $pathS3 = $rutaBucket . $fileName;
+
+                    // Subir nuevo archivo
                     $fileData = substr($file['base64'], strpos($file['base64'], ',') + 1);
                     $fileData = str_replace(' ', '+', $fileData);
+                    $contenidoArchivo = base64_decode($fileData);
 
-                    // Nombre del archivo con la extensión correcta
-                    $fileName = $file['id'] . '.' . $fileExtension;
-
-                    // Guardar el archivo
-                    Storage::put($storagePath . $fileName, base64_decode($fileData));
+                    Storage::disk('s3')->put($pathS3, $contenidoArchivo, 'public');
 
                     $archivosAdjuntos[] = [
+                        'id' => $file['id'],
                         'nombre' => $file['nombre'],
-                        'ruta' => Storage::url($storagePath . $fileName)
+                        'ruta' => Storage::disk('s3')->url($pathS3)
                     ];
                 }
+
+                $archivosAdjuntos = array_merge($adjuntosAnteriores, $archivosAdjuntos);
+            } else {
+                // Se mantienen los adjuntos anteriores 
+                $archivosAdjuntos = $adjuntosAnteriores;
             }
+
+            // Actualizar la circular
             DB::table('circulares')
                 ->updateOrInsert(
                     ['idCircular' => $request->idCircular],
@@ -392,41 +407,55 @@ class CircularesController extends Controller
                         'audiencia' => $request->audiencia,
                         'idReceptores' => $request->idReceptores,
                         'contenido' => $request->contenido,
-                        'jsonAdjuntos' => json_encode($request->jsonAdjuntos),
+                        'jsonAdjuntos' => json_encode($archivosAdjuntos),
                         'importancia' => $request->importancia,
-                        // 'fechaCreacion' => $request->fechaCreacion,
                         'fechaPublicacion' => $request->fechaPublicacion,
                         'fechaCaducidad' => $request->fechaCaducidad,
                         'idUsuario' => $request->idUsuario
                     ]
                 );
 
-            return response()->json(['mensaje' => 'circular actualizada exitosamente'], 201);
+            return response()->json(['mensaje' => 'Circular actualizada exitosamente'], 200);
+
         } catch (\Exception $e) {
             return response()->json(['mensaje' => 'Error al actualizar la circular: ' . $e->getMessage()], 500);
         }
     }
 
 
-
-    public function eliminar($id)
+    public function eliminarArchivo(Request $request)
     {
-        $id = base64_decode($id);
         try {
+            if (!$request->has('url')) {
+                return response()->json(['mensaje' => 'No se proporcionó la URL del archivo'], 400);
+            }
 
-            DB::table('circulares')
-                ->updateOrInsert(
-                    ['idCircular' => $id],
-                    ['estado' => 'Eliminado']
-                );
+            $url = $request->url;
+
+            $parsedUrl = parse_url($url, PHP_URL_PATH);
+
+            $key = ltrim(str_replace('pledu-dv-aeci/', '', $parsedUrl), '/');
+
+            error_log(print_r([
+                'urlRecibida' => $url,
+                'keyCalculada' => $key
+            ], true));
+
+            if (Storage::disk('s3')->exists($key)) {
+                Storage::disk('s3')->delete($key);
+                return response()->json(['mensaje' => 'Archivo eliminado correctamente'], 200);
+            } else {
+                return response()->json(['mensaje' => 'El archivo no existe en S3'], 404);
+            }
 
-            return response()->json(['mensaje' => 'Circular eliminada exitosamente'], 200);
         } catch (\Exception $e) {
-            return response()->json(['mensaje' => 'Error al eliminar la circular: ' . $e->getMessage()], 500);
+            return response()->json(['mensaje' => 'Error al eliminar el archivo: ' . $e->getMessage()], 500);
         }
     }
 
 
+
+
     public function habilitar($id)
     {
         $id = base64_decode($id);

+ 2 - 0
Back/backendP-Educativa/routes/api.php

@@ -73,6 +73,8 @@ Route::middleware(['auth:sanctum'])->group(function () {
 
     //Rutas de Circulares
     Route::get('circularAll', [CircularesController::class, 'mostrar']);
+    Route::post('eliminarArchivoS3', [CircularesController::class, 'eliminarArchivo']);
+
     Route::get('circularUlt', [CircularesController::class, 'ultimasCirc']);
     Route::post('circularSave', [CircularesController::class, 'crear']);
     Route::get('circularOne/{id}', [CircularesController::class, 'findOne']);