Browse Source

基于类型的文件夹、文件版本树

moell 10 months ago
parent
commit
5eaffd66d2
3 changed files with 70 additions and 0 deletions
  1. 63 0
      app/Http/Controllers/API/FolderController.php
  2. 5 0
      app/Models/Folder.php
  3. 2 0
      routes/api.php

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

@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
 use App\Http\Requests\API\Folder\CreateRequest;
 use App\Http\Requests\API\Folder\UpdateRequest;
 use App\Http\Resources\API\FileByObjectResource;
+use App\Http\Resources\API\FileVersioTreeByObjectResource;
 use App\Http\Resources\API\FolderDetailResource;
 use App\Models\Enums\FolderObjectType;
 use App\Models\File;
@@ -266,4 +267,66 @@ class FolderController extends Controller
             ]
         ]);
     }
+
+    /**
+     * 基于类型的文件夹、文件版本树
+     *
+     * @param string $objectType
+     * @param string $objectId
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function versionFileTreeByObject(string $objectType, string $objectId)
+    {
+        $folderObjectType = FolderObjectType::from($objectType);
+
+        $folderObjectType->modelBuilderAllowed()->findOrFail($objectId);
+
+        $objectWhere = ['object_type' => $objectType, 'object_id' => $objectId,];
+
+        $folders = Folder::query()->with(['files'])->where($objectWhere)->get(['id', 'name', 'parent_id']);
+
+        $fileResourceFunction = function (File $file) {
+            return [
+                'id' => $file->id,
+                'title' => $file->title,
+                'extension' => $file->extension,
+                'size' => $file->size,
+                'created_by' => $file->createdBy ? [
+                    'id' => $file->createdBy->id,
+                    'name' => $file->createdBy->name,
+                    'username' => $file->createdBy->username,
+                ] : [],
+                'created_at' => (string)$file->created_at,
+                'version' => $file->version,
+                'type' => 'file'
+            ];
+        };
+
+        $folderItems = [];
+        foreach ($folders as &$folder) {
+            $files  = [];
+            foreach ($folder->files->groupBy("title") as $fileItems) {
+                $item = $fileResourceFunction($fileItems->first());
+                $item['children'] = [];
+
+                foreach ($fileItems as $fileItem) {
+                    $item['children'][] = $fileResourceFunction($fileItem);
+                }
+
+                $files[] = $item;
+            }
+
+            $folderItems[] = [
+                'id' => $folder->id,
+                'name' => $folder->name,
+                'parent_id' => $folder->parent_id,
+                'type' => 'folder',
+                'files' => $files,
+            ];
+        }
+
+        return $this->success([
+            'data' => make_tree($folderItems)
+        ]);
+    }
 }

+ 5 - 0
app/Models/Folder.php

@@ -17,4 +17,9 @@ class Folder extends Model
     {
         static::addGlobalScope(new CompanyScope);
     }
+
+    public function files()
+    {
+        return $this->hasMany(File::class)->orderByDesc("version");
+    }
 }

+ 2 - 0
routes/api.php

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