2 커밋 df976efab9 ... 54922421fd

작성자 SHA1 메시지 날짜
  peterguo 54922421fd set-latest 5 일 전
  peterguo be551edcbd fix npe 5 일 전

+ 12 - 0
app/Http/Controllers/API/FileController.php

@@ -392,4 +392,16 @@ class FileController extends Controller
         $fileService->update($id, $request->all());
         return $this->noContent();
     }
+
+
+    // 设置为最新版本
+    public function setLatestVersion(
+        Request $request,
+        FileService $fileService,
+        string $id
+    ): Response
+    {
+        $fileService->setLatestVersion($id);
+        return $this->noContent();
+    }
 }

+ 1 - 1
app/Http/Resources/API/FileByObjectResource.php

@@ -33,7 +33,7 @@ class FileByObjectResource extends JsonResource
             'object_type'=>$this->object_type,
             'object_id'=>$this->object_id,
             'approval_status'=>$this->approval_status,
-            'naming_rule' => new NamingRuleSimpleResource($this->namingRule),
+            'naming_rule' => $this->namingRule ? new NamingRuleSimpleResource($this->namingRule) : null,
             'naming_rules' => $this->naming_rules,
             'doc_stage' => $this->doc_stage,
             'doc_type' => $this->doc_type,

+ 27 - 0
app/Services/File/FileService.php

@@ -29,4 +29,31 @@ class FileService
 
         $file->save();
     }
+
+    public function setLatestVersion(string $id): void
+    {
+        $file = File::query()->findOrFail($id);
+        if ($file->is_latest_version) {
+            return;
+        }
+        $file->is_latest_version = true;
+
+        $oldLatestVersionFile = File::query()
+            ->where(fn($query) => $file->source_file_id ? $query->where('id', $file->source_file_id) : $query->where('source_file_id', $file->id))
+            ->where('is_latest_version', true)
+            ->first();
+
+        if ($oldLatestVersionFile) {
+            $oldLatestVersionFile->is_latest_version = false;
+            $changes = ModelChangeDetector::detector(ActionObjectType::CONTAINER_FILE, $oldLatestVersionFile);
+            ActionRepository::create($oldLatestVersionFile->id, ActionObjectType::CONTAINER_FILE, ObjectAction::EDITED_FILE, null, null, [], $changes);
+
+            $oldLatestVersionFile->save();
+        }
+
+        $changes = ModelChangeDetector::detector(ActionObjectType::CONTAINER_FILE, $file);
+        ActionRepository::create($id, ActionObjectType::CONTAINER_FILE, ObjectAction::EDITED_FILE, null, null, [], $changes);
+
+        $file->save();
+    }
 }

+ 4 - 2
app/Services/History/Detector/FileDetector.php

@@ -15,7 +15,8 @@ class FileDetector extends DetectorAbstract
             'version',
             'doc_stage',
             'doc_type',
-            'naming_rules'
+            'naming_rules',
+            'is_latest_version',
         ];
     }
 
@@ -28,7 +29,8 @@ class FileDetector extends DetectorAbstract
             'version',
             'doc_stage',
             'doc_type',
-            'naming_rules'
+            'naming_rules',
+            'is_latest_version',
         ];
     }
 

+ 3 - 0
app/Services/History/ModelChangeDetector.php

@@ -56,6 +56,9 @@ class ModelChangeDetector
         $items = [];
         $oldArr = $model->getOriginal($field);
         $newArr = $model->$field;
+        if (!is_array($newArr) || !is_object($newArr)) {
+            return [];
+        }
         foreach ($newArr as $field => $newValue) {
             $oldValue = $oldArr[$field] ?? null;
             $diff = text_diff($oldValue ?? '', $newValue ?? '');

+ 2 - 0
routes/api.php

@@ -310,6 +310,8 @@ Route::middleware((function() {
             Route::apiResource("file", API\FileController::class)->only([
                 'update'
             ]);
+            Route::patch("file/{fileId}/set-latest", [API\FileController::class, "setLatestVersion"])->name("file.set-latest");
+
 
 
             Route::get("bim/multiple-views", [API\BimController::class, "multipleViews"])->name("bim.multiple-views");