ApprovalCollection.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace App\Http\Resources\API;
  3. use App\Models\Enums\ApprovalObjectType;
  4. use App\Models\Enums\ObjectApprovalStatus;
  5. use App\Models\File;
  6. use App\Models\User;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Http\Resources\Json\ResourceCollection;
  9. use Illuminate\Support\Collection;
  10. use Illuminate\Support\Facades\Auth;
  11. class ApprovalCollection extends ResourceCollection
  12. {
  13. public function __construct($resource)
  14. {
  15. parent::__construct($resource);
  16. }
  17. /**
  18. * Transform the resource collection into an array.
  19. *
  20. * @return array<int|string, mixed>
  21. */
  22. public function toArray(Request $request): array
  23. {
  24. $groupObjects = $this->getGroupObjects();
  25. $containerFiles = $this->getContainerFiles();
  26. $items = [];
  27. foreach ($this->resource as $approval) {
  28. $usersId=make_array_list($approval->users??'');
  29. $approvalUsers=User::query()->whereIn('id', $usersId)->get();
  30. $items[] = [
  31. 'id' => $approval->id,
  32. 'status' => $approval->status,
  33. 'object_type' => $approval->object_type,
  34. 'object_id' => $approval->object_id,
  35. 'node_level' => $approval->node_level,
  36. 'created_by' => new UserProfileResource($approval->createdBy),
  37. 'display_id' => $approval->display_id,
  38. 'approval_user' => UserProfileResource::collection($approvalUsers),
  39. 'object' => [
  40. 'id' => $approval->object_id,
  41. 'name' => data_get($groupObjects, sprintf("%s.%s", $approval->object_type, $approval->object_id)),
  42. ],
  43. 'sub_objects' => $this->getSubContainerFiles($containerFiles, $approval->sub_object_ids),
  44. 'file_copied' => $approval->file_copied,
  45. 'copy_file_permission' => $approval->object_type == ApprovalObjectType::CONTAINER_FILE->value
  46. && $approval->last_action_user_id == Auth::id()
  47. && $approval->status == ObjectApprovalStatus::APPROVED->value,
  48. ];
  49. }
  50. return $items;
  51. }
  52. protected function getSubContainerFiles(Collection $files, ?array $fileIds = null)
  53. {
  54. if (! $fileIds) {
  55. return [];
  56. }
  57. $items = [];
  58. foreach ($fileIds as $fileId) {
  59. if ($files->has($fileId)) {
  60. $items[] = $files->get($fileId);
  61. }
  62. }
  63. return FileSimpleResource::collection($items);
  64. }
  65. protected function getContainerFiles(): \Illuminate\Database\Eloquent\Collection|\Illuminate\Support\Collection|array
  66. {
  67. $result = $this->resource->where("object_type", ApprovalObjectType::CONTAINER_FILE->value)->pluck("sub_object_ids");
  68. $files = collect([]);
  69. $fileIds = [];
  70. foreach ($result as $item) {
  71. if (is_array($item)) {
  72. $fileIds = [...$fileIds, ...$item];
  73. }
  74. }
  75. if (! $fileIds) {
  76. return $files;
  77. }
  78. return File::query()->whereIn("id", $fileIds)->get()->keyBy("id");
  79. }
  80. protected function getGroupObjects(): array
  81. {
  82. $groupObjects = [];
  83. foreach(collect($this->resource->items())->groupBy("object_type") as $objectType => $items) {
  84. $approvalObjectType = ApprovalObjectType::from($objectType);
  85. $groupObjects[$objectType] = $approvalObjectType
  86. ->modelBuilder()
  87. ->whereIn("id", array_column($items->toArray(), "object_id"))
  88. ->pluck($approvalObjectType->nameField(), "id");
  89. };
  90. return $groupObjects;
  91. }
  92. }