This commit is contained in:
F4ilji
2026-04-13 14:37:57 +05:00
parent 5eb5a7bc06
commit 2e77978d5c
16 changed files with 241 additions and 34 deletions
@@ -0,0 +1,56 @@
<?php
namespace App\Containers\Dashboard\Actions\ContentBuilder;
use App\Containers\Dashboard\Tasks\Files\UploadFileTask;
use Illuminate\Http\UploadedFile;
class UploadContentBuilderFilesAction
{
public function __construct(
private readonly UploadFileTask $uploadFileTask,
) {}
/**
* Загружает массив файлов и возвращает метаданные
*
* @param UploadedFile[] $files Массив загруженных файлов
* @return array[] Массив метаданных файлов ['path', 'url', 'original_name', 'extension', 'size']
*/
public function run(array $files): array
{
$results = [];
foreach ($files as $file) {
if (!$file instanceof UploadedFile) {
continue;
}
$uploadResult = $this->uploadFileTask->run($file);
$results[] = [
'path' => $uploadResult['path'],
'url' => $uploadResult['url'],
'title' => $uploadResult['original_name'],
'expansion' => strtolower($file->getClientOriginalExtension()),
'size' => $this->formatFileSize($file->getSize()),
];
}
return $results;
}
/**
* Форматирует размер файла в читаемый вид
*/
private function formatFileSize(int $bytes): string
{
$units = ['B', 'KB', 'MB', 'GB'];
$bytes = max($bytes, 0);
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
$bytes /= (1 << (10 * $pow));
return round($bytes, 2) . ' ' . $units[$pow];
}
}
@@ -3,6 +3,7 @@
namespace App\Containers\Dashboard\UI\WEB\Controllers;
use App\Containers\AppStructure\Models\Page;
use App\Containers\Dashboard\Actions\ContentBuilder\UploadContentBuilderFilesAction;
use App\Containers\Dashboard\Actions\Pages\CreatePageAction;
use App\Containers\Dashboard\Actions\Pages\DeletePageAction;
use App\Containers\Dashboard\Actions\Pages\ListPagesAction;
@@ -10,6 +11,7 @@ use App\Containers\Dashboard\Actions\Pages\UpdatePageAction;
use App\Containers\Dashboard\UI\WEB\Requests\StorePageRequest;
use App\Containers\Dashboard\UI\WEB\Requests\UpdatePageRequest;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Inertia\Inertia;
@@ -21,6 +23,7 @@ class PageController extends Controller
private readonly CreatePageAction $createPageAction,
private readonly UpdatePageAction $updatePageAction,
private readonly DeletePageAction $deletePageAction,
private readonly UploadContentBuilderFilesAction $uploadContentBuilderFilesAction,
) {}
/**
@@ -115,4 +118,29 @@ class PageController extends Controller
->with('error', 'Ошибка при удалении страницы: ' . $e->getMessage());
}
}
/**
* Загружает файлы для ContentBuilder и возвращает метаданные
*/
public function uploadFiles(Request $request): JsonResponse
{
$request->validate([
'files' => 'required|array',
'files.*' => 'required|file|mimes:pdf,docx,xlsx,pptx,zip,doc,xls,ppt|max:524288',
]);
try {
$results = $this->uploadContentBuilderFilesAction->run($request->file('files'));
return response()->json([
'success' => true,
'files' => $results,
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'error' => 'Ошибка при загрузке файлов: ' . $e->getMessage(),
], 500);
}
}
}
@@ -364,6 +364,7 @@ Route::middleware(['access-check', 'dashboard.auth'])->group(function () {
Route::get('/', [PageController::class, 'index'])->name('index');
Route::get('/create', [PageController::class, 'create'])->name('create');
Route::post('/', [PageController::class, 'store'])->name('store');
Route::post('/upload-files', [PageController::class, 'uploadFiles'])->name('upload-files');
Route::get('/{page}/edit', [PageController::class, 'edit'])->name('edit');
Route::put('/{page}', [PageController::class, 'update'])->name('update');
Route::delete('/{page}', [PageController::class, 'destroy'])->name('destroy');