Browse Source

文件夹支持object_type和object_id

moell 10 months ago
parent
commit
630ce348cb

+ 13 - 6
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\FolderDetailResource;
+use App\Models\Enums\FolderObjectType;
 use App\Models\Folder;
 use App\Models\Library;
 use Illuminate\Http\Request;
@@ -41,10 +42,16 @@ class FolderController extends Controller
      */
     public function store(CreateRequest $request)
     {
-        $library = Library::query()->findOrFail($request->library_id);
+        $folderObjectType = FolderObjectType::from($request->object_type);
+
+        $object = $folderObjectType->modelBuilderAllowed()->findOrFail($request->object_id);
+
+        $objectWhere = [
+            'object_type' => $folderObjectType->value, 'object_id' => $object->id
+        ];
 
         $parentFolder = $request->parent_id > 0
-            ? Folder::query()->where("library_id", $library->id)->findOrFail($request->parent_id)
+            ? Folder::query()->where($objectWhere)->findOrFail($request->parent_id)
             : null;
 
         $names = [];
@@ -63,7 +70,7 @@ class FolderController extends Controller
             $isUpdate = isset($item['id']) && $item['id'];
 
             $count = Folder::query()
-                ->where("library_id", $library->id)
+                ->where($objectWhere)
                 ->where("parent_id", $request->parent_id)
                 ->when($isUpdate, function ($query) use ($item) {
                     return $query->where("id", "!=", $item['id']);
@@ -71,12 +78,12 @@ class FolderController extends Controller
                 ->where("name", $item['name'])
                 ->count();
             if ($count > 0) {
-                return $this->badRequest("Folder names must be unique");
+                return $this->badRequest(sprintf("Folder '%s' must be unique", $item['name']));
             }
 
             if ($isUpdate) {
                 $folder = Folder::query()
-                    ->where("library_id", $library->id)
+                    ->where($objectWhere)
                     ->where("parent_id", $request->parent_id)
                     ->find($item['id']);
                 if (! $folder) {
@@ -101,7 +108,7 @@ class FolderController extends Controller
             } else {
                 $folder = Folder::query()->create([
                     'company_id' => Auth::user()->company_id,
-                    'library_id' => $library->id,
+                    ...$objectWhere,
                     'parent_id' => $request->parent_id,
                     ...$data
                 ]);

+ 7 - 1
app/Http/Requests/API/Folder/CreateRequest.php

@@ -2,7 +2,9 @@
 
 namespace App\Http\Requests\API\Folder;
 
+use App\Models\Enums\FolderObjectType;
 use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Validation\Rules\Enum;
 
 class CreateRequest extends FormRequest
 {
@@ -22,7 +24,11 @@ class CreateRequest extends FormRequest
     public function rules(): array
     {
         return [
-            "library_id" => "required",
+            "object_type" => [
+                "required",
+                new Enum(FolderObjectType::class),
+            ],
+            "object_id" => "required|numeric",
             "parent_id" => "required|numeric",
             "items" => "required",
         ];

+ 24 - 0
app/Models/Enums/FolderObjectType.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Models\Enums;
+
+use App\Models\Container;
+
+enum FolderObjectType: string
+{
+    case CONTAINER = "container";
+
+    public function modelBuilder(): \Illuminate\Database\Eloquent\Builder
+    {
+        return match ($this) {
+            self::CONTAINER => Container::query(),
+        };
+    }
+
+    public function modelBuilderAllowed(string $id = null): \Illuminate\Database\Eloquent\Builder
+    {
+        return match ($this) {
+            self::CONTAINER => Container::query()->allowed($id),
+        };
+    }
+}

+ 37 - 0
database/migrations/2024_04_21_101437_add_object_type_and_object_id_to_floders_table.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('folders', function (Blueprint $table) {
+            $table->string('object_type', 30)->after("company_id");
+            $table->integer('object_id')->default(0)->after("object_type");
+            $table->dropColumn(["library_id"]);
+            $table->dropIndex(['company_id', 'library_id']);
+            $table->index(['object_type', 'object_id']);
+            $table->index(['company_id']);
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('folders', function (Blueprint $table) {
+            $table->dropColumn(['object_type', 'object_id']);
+            $table->integer("library_id");
+            $table->index(['company_id', 'library_id']);
+            $table->dropIndex(['object_type', 'object_id']);
+            $table->dropIndex(['company_id']);
+        });
+    }
+};