Browse Source

Supports validation when tasks use custom fields

moell 1 year ago
parent
commit
298c595109

+ 7 - 2
app/Http/Requests/API/Task/CreateOrUpdateRequest.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Requests\API\Task;
 
+use App\Http\Requests\CustomFieldRuleHelper;
 use App\Http\Requests\RuleHelper;
 use App\Models\Enums\TaskACL;
 use App\Models\User;
@@ -12,7 +13,7 @@ use Illuminate\Validation\Rules\Enum;
 
 class CreateOrUpdateRequest extends FormRequest
 {
-    use RuleHelper;
+    use RuleHelper, CustomFieldRuleHelper;
 
     /**
      * Determine if the user is authorized to make this request.
@@ -29,7 +30,7 @@ class CreateOrUpdateRequest extends FormRequest
      */
     public function rules(): array
     {
-        return [
+        $rules =  [
             'project_id' => [
                 'required',
                 Rule::exists('projects', 'id')->where($this->userCompanyWhere()),
@@ -62,5 +63,9 @@ class CreateOrUpdateRequest extends FormRequest
             'whitelist' => $this->usersCompanyRules(),
             'mailto' => $this->usersCompanyRules(),
         ];
+
+        $taskRules = $this->customFieldRuleByGroup("task", ['doc_type', 'task_type', 'doc_stage']);
+
+        return [...$rules, ...$taskRules];
     }
 }

+ 49 - 0
app/Http/Requests/CustomFieldRuleHelper.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Http\Requests;
+
+use App\Models\CustomField;
+use App\Models\Enums\CustomFieldType;
+use Illuminate\Validation\Rule;
+
+trait CustomFieldRuleHelper
+{
+    protected function customFieldRuleByGroup(string $group, array $keys = []): array
+    {
+        $customFields = CustomField::query()->where("group", $group)->whereIn("key", $keys)->get();
+
+        $rules = [];
+        foreach ($customFields as $customField) {
+            $rule = $this->customFieldToRule($customField);
+            if (! $rule) {
+                continue;
+            }
+
+            $rules[$customField->key]= $rule;
+        }
+
+        return $rules;
+    }
+
+    protected function customFieldToRule(CustomField $customField): array
+    {
+        $rule = [];
+        if ($customField->required  == 1) {
+            $rule[] = "required";
+        }
+
+        $typeRule = match (CustomFieldType::tryFrom($customField->type)) {
+            CustomFieldType::TEXT => "string|max:255",
+            CustomFieldType::TEXTAREA => "string",
+            CustomFieldType::SELECT => $customField->options ? Rule::in(array_column($customField->options, "value")) : "",
+            CustomFieldType::NUMBER => "numeric",
+            default => ""
+        };
+
+        if ($typeRule) {
+            $rule[] = $typeRule;
+        }
+
+        return $rule;
+    }
+}