Browse Source

Detect file naming rules when creating a container

moell 5 months ago
parent
commit
a5174ba33b

+ 2 - 0
app/Http/Controllers/API/ContainerController.php

@@ -94,6 +94,8 @@ class ContainerController extends Controller
             $request->get("file_uuid"),
         );
 
+        $service->fileNameNamingRuleCheckByContainer($request->library_id, $request->naming_rule_id);
+
         if ($request->has("naming_rule_id") && $request->get("naming_rule_id") > 0) {
             $keys = $customFieldRepo->keysByGroup($request->get("naming_rule_id"));
             $formData['naming_rules'] = $request->only($keys);

+ 38 - 0
app/Services/File/FileAssociationService.php

@@ -2,9 +2,13 @@
 
 namespace App\Services\File;
 
+use App\Exceptions\ValidationException;
 use App\Models\Enums\FileObjectType;
 use App\Models\Enums\FileSource;
 use App\Models\File;
+use App\Models\Library;
+use App\Models\NamingRule;
+use App\Services\NamingRule\NamingRuleCheck;
 use Carbon\Carbon;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Auth;
@@ -47,6 +51,40 @@ class FileAssociationService
         }
     }
 
+    public function fileNameNamingRuleCheckByContainer(int $libraryId, int $namingRuleId = 0)
+    {
+        if (! $namingRuleId) {
+            return;
+        }
+
+        $library = Library::query()->findOrFail($libraryId);
+        $namingRule = NamingRule::query()->findOrFail($namingRuleId);
+
+        $namingRuleCheck = new NamingRuleCheck();
+
+        $code = $namingRuleCheck->getNamingRuleCode($library);
+
+        $errors = [];
+        foreach ($this->files as $file) {
+            $fileName = pathinfo($file->title)['filename'];
+
+            $result = $namingRuleCheck->checkByName($fileName, $namingRule, $code);
+            if (! $result['result']) {
+                $errors[] = [
+                    ...$result,
+                    'name' => $file->title,
+                    'file_id' => $file->id
+                ];
+            }
+        }
+
+        if ($errors) {
+            throw new ValidationException('The file name does not conform to the naming rules', errors:  [
+                'naming_rule' => $errors
+            ]);
+        }
+    }
+
     public function association(string $objectId,)
     {
         if (! $this->files) {

+ 3 - 4
app/Services/NamingRule/NamingRuleCheck.php

@@ -7,6 +7,7 @@ use App\Models\CustomField;
 use App\Models\Enums\CustomFieldType;
 use App\Models\Enums\FileObjectType;
 use App\Models\Enums\LibraryType;
+use App\Models\Library;
 use App\Models\NamingRule;
 use App\Models\Project;
 use Illuminate\Database\Eloquent\Collection;
@@ -33,7 +34,7 @@ class NamingRuleCheck
 
         $fileName = pathinfo($fileName)['filename'];
 
-        $result = $this->parse($fileName, $this->getNamingRuleCode(), $this->object->namingRule->combination_rules);
+        $result = $this->parse($fileName, $this->getNamingRuleCode($this->object->library), $this->object->namingRule->combination_rules);
 
         throw_validation_if(! $result, sprintf("'%s' does not conform to the naming rules", $fileName));
     }
@@ -110,10 +111,8 @@ class NamingRuleCheck
     }
 
 
-    protected function getNamingRuleCode()
+    public function getNamingRuleCode(Library $library)
     {
-        $library = $this->object->library;
-
         $code = match (LibraryType::tryFrom($library->type)) {
             LibraryType::PROJECT => Project::query()->find($library->project_id)?->code,
             LibraryType::ASSET => Asset::query()->find($library->asset_id)?->code,