Procházet zdrojové kódy

Task creation and update support naming rules, custom field validation and data saving.

moell před 1 rokem
rodič
revize
dfd5c96076

+ 23 - 6
app/Http/Controllers/API/TaskController.php

@@ -6,7 +6,10 @@ use App\Http\Controllers\Controller;
 use App\Http\Requests\API\Task\CreateOrUpdateRequest;
 use App\Http\Resources\API\TaskDetailResource;
 use App\Http\Resources\API\TaskResource;
+use App\Models\CustomField;
+use App\Models\NamingRule;
 use App\Models\Task;
+use App\Repositories\CustomFieldRepository;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 
@@ -28,14 +31,21 @@ class TaskController extends Controller
     /**
      * Store a newly created resource in storage.
      */
-    public function store(CreateOrUpdateRequest $request)
+    public function store(CreateOrUpdateRequest $request, CustomFieldRepository $customFieldRepo)
     {
-        Task::create([
+        $formData = [
             ...$request->all(),
             'company_id' => Auth::user()->company_id,
             'created_by' => Auth::id(),
             'whitelist' => $request->whitelist ? sprintf(",%s", implode(',', $request->whitelist)) : null,
-        ]);
+        ];
+
+        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);
+        }
+
+        Task::create($formData);
 
         return $this->created();
     }
@@ -53,13 +63,20 @@ class TaskController extends Controller
     /**
      * Update the specified resource in storage.
      */
-    public function update(CreateOrUpdateRequest $request, string $id)
+    public function update(CreateOrUpdateRequest $request, string $id, CustomFieldRepository $customFieldRepo)
     {
         $task = Task::query()->findOrFail($id);
 
-        $task->fill([...$request->all(),
+        $formData = [...$request->all(),
             'whitelist' => $request->whitelist ? sprintf(",%s", implode(',', $request->whitelist)) : null,
-        ]);
+        ];
+
+        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);
+        }
+
+        $task->fill($formData);
         $task->save();
 
         return $this->noContent();

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

@@ -3,9 +3,9 @@
 namespace App\Http\Requests\API\Task;
 
 use App\Http\Requests\CustomFieldRuleHelper;
+use App\Http\Requests\NamingRuleHelper;
 use App\Http\Requests\RuleHelper;
 use App\Models\Enums\TaskACL;
-use App\Models\User;
 use Illuminate\Foundation\Http\FormRequest;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Validation\Rule;
@@ -13,7 +13,7 @@ use Illuminate\Validation\Rules\Enum;
 
 class CreateOrUpdateRequest extends FormRequest
 {
-    use RuleHelper, CustomFieldRuleHelper;
+    use RuleHelper, CustomFieldRuleHelper, NamingRuleHelper;
 
     /**
      * Determine if the user is authorized to make this request.
@@ -66,6 +66,14 @@ class CreateOrUpdateRequest extends FormRequest
 
         $taskRules = $this->customFieldRuleByGroup("task", ['doc_type', 'task_type', 'doc_stage']);
 
+        if ($this->has("naming_rule_id") && $this->get("naming_rule_id") > 0) {
+            $this->namingRuleCheck($this->get("naming_rule_id"));
+
+            $namingRules = $this->customFieldRuleByGroup($this->get("naming_rule_id"));
+
+            $rules = [...$rules, ... $namingRules];
+        }
+
         return [...$rules, ...$taskRules];
     }
 }

+ 6 - 1
app/Http/Requests/CustomFieldRuleHelper.php

@@ -10,7 +10,12 @@ trait CustomFieldRuleHelper
 {
     protected function customFieldRuleByGroup(string $group, array $keys = []): array
     {
-        $customFields = CustomField::query()->where("group", $group)->whereIn("key", $keys)->get();
+        $customFields = CustomField::query()
+            ->where("group", $group)
+            ->when(count($keys) > 0, function ($query) use ($keys) {
+                return $query->whereIn("key", $keys);
+            })
+            ->get();
 
         $rules = [];
         foreach ($customFields as $customField) {

+ 25 - 0
app/Http/Requests/NamingRuleHelper.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace App\Http\Requests;
+
+use App\Models\NamingRule;
+use Illuminate\Support\Facades\Auth;
+
+trait NamingRuleHelper
+{
+    protected function namingRuleCheck($namingRuleId): void
+    {
+        $namingRule = NamingRule::query()->where([
+            'company_id' => 0,
+            'global' => 1,
+            'status' => 1,
+        ])->orWhere([
+            'company_id' => Auth::user()->company_id,
+            'status' => 1
+        ])->find($namingRuleId);
+
+        if (! $namingRule) {
+            throw new \Exception("The current naming rule has no permission to use");
+        }
+    }
+}

+ 1 - 1
app/Models/Task.php

@@ -18,7 +18,7 @@ class Task extends Model
 
     protected $casts = [
         'mailto' => 'array',
-        'custom_fields' => 'array',
+        'naming_rules' => 'array',
     ];
 
     protected static function booted(): void

+ 13 - 0
app/Repositories/CustomFieldRepository.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Repositories;
+
+use App\Models\CustomField;
+
+class CustomFieldRepository
+{
+    public function keysByGroup(string $group): array
+    {
+        return CustomField::query()->where("group", $group)->pluck("key")->toArray();
+    }
+}

+ 28 - 0
database/migrations/2024_03_08_231302_rename_custom_fields_to_naming_rule_table.php

@@ -0,0 +1,28 @@
+<?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('tasks', function (Blueprint $table) {
+            $table->renameColumn("custom_fields", "naming_rules");
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('tasks', function (Blueprint $table) {
+            $table->renameColumn("naming_rules", "custom_fields");
+        });
+    }
+};