*/ public function toArray(Request $request): array { $groupObjects = $this->getGroupObjects(); $containerFiles = $this->getContainerFiles(); $items = []; foreach ($this->resource as $approval) { $usersId=make_array_list($approval->users??''); $approvalUsers=User::query()->whereIn('id', $usersId)->get(); $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), 'display_id' => $approval->display_id, 'approval_user' => UserProfileResource::collection($approvalUsers), 'object' => [ 'id' => $approval->object_id, 'name' => data_get($groupObjects, sprintf("%s.%s", $approval->object_type, $approval->object_id)), ], 'sub_objects' => $this->getSubContainerFiles($containerFiles, $approval->sub_object_ids), 'file_copied' => $approval->file_copied, 'copy_file_permission' => $approval->object_type == ApprovalObjectType::CONTAINER_FILE->value && $approval->last_action_user_id == Auth::id() && $approval->status == ObjectApprovalStatus::APPROVED->value, ]; } return $items; } protected function getSubContainerFiles(Collection $files, ?array $fileIds = null) { if (! $fileIds) { return []; } $items = []; foreach ($fileIds as $fileId) { if ($files->has($fileId)) { $items[] = $files->get($fileId); } } return FileSimpleResource::collection($items); } protected function getContainerFiles(): \Illuminate\Database\Eloquent\Collection|\Illuminate\Support\Collection|array { $result = $this->resource->where("object_type", ApprovalObjectType::CONTAINER_FILE->value)->pluck("sub_object_ids"); $files = collect([]); $fileIds = []; foreach ($result as $item) { if (is_array($item)) { $fileIds = [...$fileIds, ...$item]; } } if (! $fileIds) { return $files; } return File::query()->whereIn("id", $fileIds)->get()->keyBy("id"); } 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; } }