Browse Source

Task history, task change detector, history converter

moell 11 months ago
parent
commit
43b51117d3

+ 31 - 31
app/Http/Controllers/API/ProjectController.php

@@ -100,43 +100,43 @@ class ProjectController extends Controller
 
         DB::transaction(function () use ($request,$project) {
             $project->fill([
-            ...$request->all(),
-            'company_id' => Auth::user()->company_id,
-            'created_by' => Auth::id(),
-            'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null,
-        ]);
+                ...$request->all(),
+                'company_id' => Auth::user()->company_id,
+                'created_by' => Auth::id(),
+                'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null,
+            ]);
 
-        $project->save();
+            $project->save();
 
-        ActionRepository::createByProject($project, ObjectAction::CREATED);
+            ActionRepository::createByProject($project, ObjectAction::CREATED);
 
-        if ($request->has("assets")) {
-            foreach ($request->get("assets", []) as $assetId) {
-                ProjectAsset::create([
-                    'project_id' => $project->id,
-                    'asset_id' => $assetId,
-                ]);
+            if ($request->has("assets")) {
+                foreach ($request->get("assets", []) as $assetId) {
+                    ProjectAsset::create([
+                        'project_id' => $project->id,
+                        'asset_id' => $assetId,
+                    ]);
+                }
             }
-        }
 
-        if ($request->has("plans")) {
-            foreach ($request->get("plans", []) as $planId) {
-                ProjectPlan::create([
-                    'project_id' => $project->id,
-                    'plan_id' => $planId,
-                ]);
+            if ($request->has("plans")) {
+                foreach ($request->get("plans", []) as $planId) {
+                    ProjectPlan::create([
+                        'project_id' => $project->id,
+                        'plan_id' => $planId,
+                    ]);
+                }
             }
-        }
 
-        TeamMember::create([
-            'project_id' => $project->id,
-            'user_id' => Auth::id(),
-            'role' => Auth::user()->role,
-            'limited' => 1,
-            'join_at' => Carbon::now()->toDateString(),
-            'created_by' => Auth::id(),
-        ]);
-    });
+            TeamMember::create([
+                'project_id' => $project->id,
+                'user_id' => Auth::id(),
+                'role' => Auth::user()->role,
+                'limited' => 1,
+                'join_at' => Carbon::now()->toDateString(),
+                'created_by' => Auth::id(),
+            ]);
+        });
 
         return $this->created();
     }
@@ -408,7 +408,7 @@ class ProjectController extends Controller
     {
         $project = Project::allowed($projectId)->find($projectId);
         if (is_null($project)){
-        return   $this->badRequest('project does not exist');
+            return   $this->badRequest('project does not exist');
         }
         $assetsIds = $request->assets;
         DB::transaction(function () use ($projectId,$assetsIds) {

+ 24 - 20
app/Http/Controllers/API/TaskController.php

@@ -9,12 +9,16 @@ 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\Enums\ActionObjectType;
+use App\Models\Enums\ObjectAction;
 use App\Models\NamingRule;
 use App\Models\Project;
 use App\Models\Requirement;
 use App\Models\RequirementGroup;
 use App\Models\Task;
+use App\Repositories\ActionRepository;
 use App\Repositories\CustomFieldRepository;
+use App\Services\History\ModelChangeDetector;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Validator;
@@ -41,23 +45,17 @@ class TaskController extends Controller
      */
     public function store(CreateOrUpdateRequest $request, CustomFieldRepository $customFieldRepo)
     {
-        $asset_id=null;
-        $requirement_group_id=null;
-
-        if ($request->has('requirement_id')){
-            $requirementId=$request->get('requirement_id');
-            $requirement=Requirement::query()->findOrFail($requirementId);
-            $asset_id=$requirement->asset_id;
-            $requirement_group_id=$requirement->requirement_group_id;
-        }
+        $requirement = $request->has('requirement_id')
+            ? Requirement::query()->findOrFail($request->get("requirement_id"))
+            : null;
 
         $formData = [
             ...$request->all(),
             'company_id' => Auth::user()->company_id,
             'created_by' => Auth::id(),
             'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null,
-            'asset_id' => $asset_id,
-            'requirement_group_id'=>$requirement_group_id,
+            'asset_id' => $requirement?->asset_id,
+            'requirement_group_id'=> $requirement?->requirement_group_id,
         ];
 
         if ($request->has("naming_rule_id") && $request->get("naming_rule_id") > 0) {
@@ -65,7 +63,9 @@ class TaskController extends Controller
             $formData['naming_rules'] = $request->only($keys);
         }
 
-        Task::create($formData);
+        $task = Task::create($formData);
+
+        ActionRepository::createByTask($task, ObjectAction::CREATED);
 
         return $this->created();
     }
@@ -86,17 +86,14 @@ class TaskController extends Controller
     public function update(CreateOrUpdateRequest $request, string $id, CustomFieldRepository $customFieldRepo)
     {
         $task = Task::query()->allowed($id)->findOrFail($id);
-        $asset_id=null;
 
-        if ($requirementId=$request->get('requirement_id')!=$task->requirement_id){
-            $requirementId=$request->get('requirement_id');
-            $requirement=Requirement::query()->findOrFail($requirementId);
-            $asset_id=$requirement->asset_id;
-        }
+        $requirement = $request->has('requirement_id') && $task->requirement_id != $request->get('requirement_id')
+            ? Requirement::query()->findOrFail($request->get("requirement_id"))
+            : null;
 
         $formData = [...$request->all(),
             'whitelist' => $request->whitelist ? sprintf(",%s,", implode(',', $request->whitelist)) : null,
-            '$asset_id' => $asset_id,
+            'asset_id' => $requirement?->asset_id,
         ];
 
         if ($request->has("naming_rule_id") && $request->get("naming_rule_id") > 0) {
@@ -105,8 +102,11 @@ class TaskController extends Controller
         }
 
         $task->fill($formData);
+        $changes = ModelChangeDetector::detector(ActionObjectType::TASK, $task);
         $task->save();
 
+        ActionRepository::createByTask($task, ObjectAction::EDITED, objectChanges: $changes);
+
         return $this->noContent();
     }
 
@@ -119,6 +119,8 @@ class TaskController extends Controller
 
         $task->delete();
 
+        ActionRepository::createByTask($task, ObjectAction::DELETED);
+
         return $this->noContent();
     }
 
@@ -163,13 +165,15 @@ class TaskController extends Controller
                 $item['naming_rules'] = collect($item)->only($keys)->toArray();
             }
 
-            Task::query()->create([
+            $task = Task::query()->create([
                 ...$item,
                 'project_id' => $project->id,
                 'parent_id' => 0,
                 'company_id' => Auth::user()->company_id,
                 'created_by' => Auth::id(),
             ]);
+
+            ActionRepository::createByTask($task, ObjectAction::CREATED);
         }
 
         return $this->noContent();

+ 2 - 0
app/Models/Enums/ActionObjectType.php

@@ -10,6 +10,7 @@ use App\Models\Task;
 use App\Services\History\Detector\DetectorContact;
 use App\Services\History\Detector\ProjectDetector;
 use App\Services\History\Detector\RequirementDetector;
+use App\Services\History\Detector\TaskDetector;
 
 enum ActionObjectType: string
 {
@@ -48,6 +49,7 @@ enum ActionObjectType: string
         return match ($this) {
             ActionObjectType::PROJECT => ProjectDetector::class,
             ActionObjectType::REQUIREMENT => RequirementDetector::class,
+            ActionObjectType::TASK => TaskDetector::class,
             default => null
         };
     }

+ 4 - 2
app/Models/Project.php

@@ -36,8 +36,10 @@ class Project extends Model
         $projectIds = Project::query()->leftJoin("team_members", "projects.id", "=", "team_members.project_id")
             ->filter(request()->query())
             ->when($id, fn($query) => $query->where("projects.id", $id))
-            ->where("team_members.user_id", Auth::id())
-            ->orWhere(fn($query) => $query->where("projects.acl", ProjectACL::CUSTOM->value)->where("whitelist", "like", "%,".Auth::id().",%"))
+            ->where(function ($query) {
+                $query->where("team_members.user_id", Auth::id())
+                    ->orWhere(fn($query) => $query->where("projects.acl", ProjectACL::CUSTOM->value)->where("whitelist", "like", "%,".Auth::id().",%"));
+            })
             ->pluck("projects.id")
             ->unique();
 

+ 4 - 2
app/Models/Task.php

@@ -41,8 +41,10 @@ class Task extends Model
         $taskIds = Task::query()->leftJoin("team_members", "tasks.project_id", "=", "team_members.project_id")
             ->filter(request()->query())
             ->when($id, fn($query) => $query->where("tasks.id", $id))
-            ->where("team_members.user_id", Auth::id())
-            ->orWhere(fn($query) => $query->where("tasks.acl", TaskACL::CUSTOM->value)->where("whitelist", "like", "%,".Auth::id().",%"))
+            ->where(function($query) {
+                $query->where("team_members.user_id", Auth::id())
+                    ->orWhere(fn($query) => $query->where("tasks.acl", TaskACL::CUSTOM->value)->where("whitelist", "like", "%,".Auth::id().",%"));
+            })
             ->pluck("tasks.id")
             ->unique();
 

+ 21 - 1
app/Repositories/ActionRepository.php

@@ -8,6 +8,7 @@ use App\Models\Enums\ObjectAction;
 use App\Models\History;
 use App\Models\Project;
 use App\Models\Requirement;
+use App\Models\Task;
 use App\Services\History\ModelChangeDetector;
 use Carbon\Carbon;
 use Illuminate\Support\Collection;
@@ -73,7 +74,26 @@ class ActionRepository
             $requirement->id,
             ActionObjectType::REQUIREMENT,
             $action,
-            $requirement->id,
+            null,
+            $comment,
+            $extraFields,
+            $objectChanges,
+        );
+    }
+
+    public static function createByTask(
+        Task         $task,
+        ObjectAction $action,
+        string       $comment = null,
+        array        $extraFields = [],
+        array        $objectChanges = [],
+    ): \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Builder
+    {
+        return self::create(
+            $task->id,
+            ActionObjectType::TASK,
+            $action,
+            $task->project_id,
             $comment,
             $extraFields,
             $objectChanges,

+ 10 - 0
app/Services/History/Converter/NamingRuleConverter.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Services\History\Converter;
+
+use App\Models\NamingRule;
+
+class NamingRuleConverter extends ModelConverter
+{
+    protected static string $modelClassName = NamingRule::class;
+}

+ 10 - 0
app/Services/History/Converter/ProjectConverter.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Services\History\Converter;
+
+use App\Models\Project;
+
+class ProjectConverter extends ModelConverter
+{
+    protected static string $modelClassName = Project::class;
+}

+ 10 - 0
app/Services/History/Converter/TaskConverter.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Services\History\Converter;
+
+use App\Models\Task;
+
+class TaskConverter extends ModelConverter
+{
+    protected static string $modelClassName = Task::class;
+}

+ 0 - 1
app/Services/History/Detector/ProjectDetector.php

@@ -2,7 +2,6 @@
 
 namespace App\Services\History\Detector;
 
-use App\Services\History\Converter\ConverterContact;
 use App\Services\History\Converter\CustomFieldSelectConverter;
 use App\Services\History\Converter\ModelEnumConverter;
 use App\Services\History\Converter\WhitelistConverter;

+ 84 - 0
app/Services/History/Detector/TaskDetector.php

@@ -0,0 +1,84 @@
+<?php
+
+namespace App\Services\History\Detector;
+
+use App\Services\History\Converter\CustomFieldSelectConverter;
+use App\Services\History\Converter\EmailConverter;
+use App\Services\History\Converter\ModelEnumConverter;
+use App\Services\History\Converter\NamingRuleConverter;
+use App\Services\History\Converter\ProjectConverter;
+use App\Services\History\Converter\RequirementGroupConverter;
+use App\Services\History\Converter\TaskConverter;
+use App\Services\History\Converter\UserConverter;
+use App\Services\History\Converter\WhitelistConverter;
+
+class TaskDetector extends DetectorAbstract
+{
+    public static function fields(): array
+    {
+        return [
+            'name',
+            'project_id',
+            'requirement_id',
+            'naming_rule_id',
+            'parent_id',
+            'task_type',
+            'doc_stage',
+            'status',
+            'acl',
+            'whitelist',
+            'description',
+            'mailto',
+            'email_subject',
+            'begin',
+            'end',
+            'closed_by',
+            'canceled_by',
+            'approve_by',
+            'finished_by',
+            'review_by',
+            'created_by',
+            'suitability',
+            'state',
+            'asset_group_id',
+        ];
+    }
+
+    public static function diffFields(): array
+    {
+        return [
+            'description',
+        ];
+    }
+
+    public static function arrayFields(): array
+    {
+        return [
+            'mailto',
+        ];
+    }
+
+    public static function converters(): array
+    {
+        return [
+            "whitelist" => new WhitelistConverter(),
+            "acl" => new ModelEnumConverter("project.acl"),
+            "status" => new ModelEnumConverter("project.status"),
+            "type" => new CustomFieldSelectConverter("project", "type"),
+            "requirement_group_id" => new RequirementGroupConverter(),
+            "project_id" => new ProjectConverter(),
+            "reviewed_by" => new UserConverter(),
+            'closed_by' => new UserConverter(),
+            'canceled_by' => new UserConverter(),
+            'approve_by' => new UserConverter(),
+            'finished_by' => new UserConverter(),
+            'review_by' => new UserConverter(),
+            "state" => new CustomFieldSelectConverter("task", "state"),
+            "task_type" => new CustomFieldSelectConverter("task", "task_type"),
+            "doc_stage" => new CustomFieldSelectConverter("task", "doc_stage"),
+            "naming_rule_id" => new NamingRuleConverter(),
+            "parent_id" => new TaskConverter(),
+            "mailto" => new EmailConverter(),
+        ];
+    }
+}

+ 16 - 0
lang/en/model-enums.php

@@ -3,6 +3,8 @@
 use \App\Models\Enums\ProjectStatus;
 use \App\Models\Enums\RequirementStatus;
 use \App\Models\Enums\ProjectACL;
+use \App\Models\Enums\TaskACL;
+use \App\Models\Enums\TaskStatus;
 
 return [
     'project' => [
@@ -28,4 +30,18 @@ return [
             RequirementStatus::CLOSED->value => "Closed",
         ]
     ],
+    'task' => [
+        'status' => [
+            TaskStatus::DOING->value => "In progress",
+            TaskStatus::WAIT->value => "Not Submitted",
+            TaskStatus::DONE->value => "A-Approved & B-Approved w/comment",
+            TaskStatus::PAUSE->value => "C-Amendment & Resubmission Req’d",
+            TaskStatus::CLOSED->value => "D-Rejected",
+            TaskStatus::CANCEL->value => "Cancelled",
+        ],
+        'acl' => [
+            TaskACL::PRIVATE->value => "Private",
+            TaskACL::CUSTOM->value => "Custom",
+        ]
+    ],
 ];