Browse Source

approval list

moell 8 months ago
parent
commit
b4dc3298d7

+ 3 - 16
app/Http/Controllers/API/ApprovalController.php

@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
 use App\Http\Requests\API\Approval\ActionRequest;
 use App\Http\Requests\API\Approval\CreateOrUpdateRequest;
 use App\Http\Resources\API\ActionByApprovalLogResource;
+use App\Http\Resources\API\ApprovalCollection;
 use App\Http\Resources\API\ApprovalFlowDetailResource;
 use App\Http\Resources\API\UserProfileResource;
 use App\Models\Action;
@@ -29,23 +30,9 @@ class ApprovalController extends Controller
      */
     public function index(Request $request)
     {
-        $approvals = Approval::query()->filter($request->all())->orderByDesc("created_at")->paginate();
+        $approvals = Approval::with(['createdBy'])->filter($request->all())->orderByDesc("created_at")->paginate();
 
-        $items = [];
-        foreach ($approvals as $approval) {
-            $items[] = [
-                'id' => $approval->id,
-                'status' => $approval->status,
-                'object_type' => $approval->object_type,
-                'object_id' => $approval->object_id,
-                'node_level' => $approval->node_level,
-                'created_by' => new UserProfileResource($approval->createdBy),
-            ];
-        }
-
-        return $this->success([
-            'data' => $items
-        ]);
+        return new ApprovalCollection($approvals);
     }
 
     /**

+ 58 - 0
app/Http/Resources/API/ApprovalCollection.php

@@ -0,0 +1,58 @@
+<?php
+
+namespace App\Http\Resources\API;
+
+use App\Models\Enums\ApprovalObjectType;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\ResourceCollection;
+
+class ApprovalCollection extends ResourceCollection
+{
+    public function __construct($resource)
+    {
+        parent::__construct($resource);
+    }
+
+    /**
+     * Transform the resource collection into an array.
+     *
+     * @return array<int|string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        $groupObjects = $this->getGroupObjects();
+
+        $items = [];
+        foreach ($this->resource as $approval) {
+            $items[] = [
+                'id' => $approval->id,
+                'status' => $approval->status,
+                'object_type' => $approval->object_type,
+                'object_id' => $approval->object_id,
+                'node_level' => $approval->node_level,
+                'created_by' => new UserProfileResource($approval->createdBy),
+                'object' => [
+                    'id' => $approval->object_id,
+                    'name' => data_get($groupObjects, sprintf("%s.%s", $approval->object_type, $approval->object_id)),
+                ]
+            ];
+        }
+
+        return $items;
+    }
+
+    protected function getGroupObjects(): array
+    {
+        $groupObjects = [];
+
+        foreach(collect($this->resource->items())->groupBy("object_type") as $objectType => $items) {
+            $approvalObjectType = ApprovalObjectType::from($objectType);
+            $groupObjects[$objectType] = $approvalObjectType
+                ->modelBuilder()
+                ->whereIn("id", array_column($items->toArray(), "object_id"))
+                ->pluck($approvalObjectType->nameField(), "id");
+        };
+
+        return $groupObjects;
+    }
+}

+ 1 - 1
app/ModelFilters/ApprovalFilter.php

@@ -19,7 +19,7 @@ class ApprovalFilter extends ModelFilter
 
     public function setup()
     {
-        $tab = $this->query['tab'] ?? null;
+        $tab = $this->input['tab'] ?? null;
 
         $this->where(function ($query) use ($tab) {
             return match ($tab) {

+ 1 - 0
app/Models/Enums/ApprovalObjectType.php

@@ -61,6 +61,7 @@ enum ApprovalObjectType: string
     public function nameField(): string
     {
         return match ($this) {
+            self::REQUIREMENT => "title",
             default => "name",
         };
     }