123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <?php
- namespace App\Http\Resources\API;
- use App\Models\Enums\ApprovalObjectType;
- use App\Models\Enums\ObjectApprovalStatus;
- use App\Models\File;
- use App\Models\User;
- use Illuminate\Http\Request;
- use Illuminate\Http\Resources\Json\ResourceCollection;
- use Illuminate\Support\Collection;
- use Illuminate\Support\Facades\Auth;
- 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();
- $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;
- }
- }
|