Browse Source

容器搜索附件或文件夹

kely 10 months ago
parent
commit
e4cbff1e4f

+ 35 - 0
app/Http/Controllers/API/FolderController.php

@@ -12,6 +12,7 @@ use App\Models\Enums\FolderObjectType;
 use App\Models\File;
 use App\Models\Folder;
 use App\Models\Library;
+use App\Services\File\FolderUrlService;
 use App\Services\Folder\VersionFileTreeByObjectService;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Http\Request;
@@ -331,4 +332,38 @@ class FolderController extends Controller
         }
 
     }
+
+    public function search(Request $request,FolderUrlService $service){
+        $objectType = $request->get("object_type");
+        $objectId = $request->get("object_id");
+        $name=$request->get('name');
+
+        $folderObjectType = FolderObjectType::from($objectType);
+
+        $folderObjectType->modelBuilderAllowed()->findOrFail($objectId);
+
+        $objectWhere = ['object_type' => $objectType, 'object_id' => $objectId,];
+
+        $folders = Folder::query()
+            ->where($objectWhere)
+            ->where('name','like',"%$name%")
+            ->get();
+
+        $newFolders=$folders?$service->folderFormat($folders):[];
+        $file=File::query()
+            ->where($objectWhere)
+            ->where('title','like',"%$name%")
+            ->where("is_latest_version", 1)
+            ->get();
+
+        $newFiles=$file?$service->filesFormat($file):[];
+
+        return $this->success([
+            'data' => [
+                'folders' => $newFolders,
+                'files' => $newFiles,
+            ]
+        ]);
+
+    }
 }

+ 68 - 0
app/Services/File/FolderUrlService.php

@@ -0,0 +1,68 @@
+<?php
+/**
+ * Created by IntelliJ IDEA.
+ * User: kelyliang
+ * Date: 2024/5/8
+ * Time: 下午 03:47
+ */
+
+namespace App\Services\File;
+
+
+use App\Http\Resources\API\FileDownloadResource;
+use App\Models\Folder;
+use Illuminate\Support\Collection;
+use App\Models\Enums\FileObjectType;
+use function Nette\Utils\isEmpty;
+
+class FolderUrlService
+{
+    public function folderFormat(Collection $folders){
+        $item=[];
+        foreach ($folders as $folder){
+            $folderIds=[];
+            $folderIds = [...$folderIds, ...explode(",", $folder->path)];
+            //排除自己的文件夹
+            $folderPathArray = array_unique(array_diff($folderIds, [$folder->id]));
+            $folders = Folder::query()->whereIn("id", $folderPathArray)->pluck("name", "id");
+            if($folders->isEmpty()){
+                $folder['folder_path']='/';
+                $item[]=$folder;
+            }else{
+                $folderPath = [];
+                foreach($folderPathArray as $folderId) {
+                    $folderPath[] = $folders->get($folderId);
+                }
+                $folder['folder_path']=implode('/', $folderPath);
+                $item[]=$folder;
+            }
+        }
+        return $item;
+    }
+
+    public function filesFormat(Collection $files)
+    {
+        $folderIds = [];
+        foreach ($files as $file) {
+            $folderIds = [...$folderIds, ...explode(",", $file->folder?->path)];
+        }
+
+        $folders = Folder::query()->whereIn("id", array_unique(array_filter($folderIds)))->pluck("name", "id");
+
+        $items = [];
+        foreach ($files as $file) {
+
+            $fileDownloadResource = (new FileDownloadResource($file))->toArray(request());
+
+            $folderPath = [];
+            foreach(array_filter(explode(",", $file->folder?->path)) as $folderId) {
+                $folderPath[] = $folders->get($folderId);
+            }
+
+            $fileDownloadResource['folder_path'] = "/" . implode('/', $folderPath);
+
+            $items[] = $fileDownloadResource;
+        }
+        return $items;
+    }
+}

+ 1 - 0
routes/api.php

@@ -141,6 +141,7 @@ Route::middleware(['auth:sanctum'])->group(function () {
         Route::get("folder/file-version-tree/{object_type}/{object_id}", [API\FolderController::class, "versionFileTreeByObject"])
             ->name("folder.file-version-tree-by-object");
         Route::patch("folder/{folder}/change-name", [API\FolderController::class, "changeName"])->name("folder.change-name");
+        Route::get("folder/search/folder-file", [API\FolderController::class, "search"])->name("folder.search-folder-file");
 
         Route::post("requirement/batch", [API\RequirementController::class, "batchStore"])->name("requirement.batchStore");