VersionFileTreeByObjectService.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. namespace App\Services\Folder;
  3. use App\Models\Enums\FolderObjectType;
  4. use App\Models\File;
  5. use App\Models\Folder;
  6. use Illuminate\Database\Eloquent\Collection;
  7. class VersionFileTreeByObjectService {
  8. protected FolderObjectType $folderObjectType;
  9. protected $object;
  10. protected array $objectWhere = [];
  11. protected array $fileWhere = [];
  12. protected int $objectVersion = 0;
  13. protected array $fileIds = [];
  14. protected array $folderIds = [];
  15. public function __construct(protected array $queryData, string $objectType, string $objectId)
  16. {
  17. $this->folderObjectType = FolderObjectType::from($objectType);
  18. $this->object = $this->folderObjectType->modelBuilderAllowed()->findOrFail($objectId);
  19. $this->objectWhere = ['object_type' => $objectType, 'object_id' => $objectId,];
  20. $this->fileWhere = [];
  21. if (($this->queryData['show_hide'] ?? null) != 1) {
  22. $this->fileWhere['is_hide'] = 0;
  23. }
  24. $this->objectVersion = $this->queryData['object_version'] ?? 0;
  25. }
  26. public function versionFileTreeByObject()
  27. {
  28. $this->containerDataLoad();
  29. $folders = $this->queryFolders();
  30. $nodes = [];
  31. foreach ($folders as &$folder) {
  32. $nodes[] = [
  33. 'id' => $folder->id,
  34. 'node_id' => $folder->id,
  35. 'name' => $folder->name,
  36. 'parent_id' => $folder->parent_id,
  37. 'type' => 'folder',
  38. ];
  39. $this->filesFormat($folder->files, $folder->id, $nodes);
  40. }
  41. $topFiles = $this->queryTopFiles();
  42. $this->filesFormat($topFiles, 0, $nodes);
  43. return make_tree($nodes);
  44. }
  45. protected function queryTopFiles()
  46. {
  47. return File::query()->where($this->objectWhere)
  48. ->where("source", 1)
  49. ->where("folder_id", 0)
  50. ->when($this->fileWhere, fn($query) => $query->where($this->fileWhere))
  51. ->when($this->fileIds, fn($query) => $query->whereIn("id", $this->fileIds))
  52. ->where(fn($query) => $query->where($this->fileWhere)->when($this->fileIds, fn($query) => $query->whereIn("id", $this->fileIds)))
  53. ->orderByDesc("version")
  54. ->get();
  55. }
  56. protected function queryFolders()
  57. {
  58. return Folder::query()
  59. ->with([
  60. 'files' => fn($query) => $query->when($this->fileWhere, fn($query) => $query->where($this->fileWhere))
  61. ->when($this->fileIds, fn($query) => $query->whereIn("id", $this->fileIds)),
  62. 'files.createdBy'
  63. ])
  64. ->when($this->folderIds, fn($query) => $query->whereIn("id", $this->folderIds))
  65. ->where($this->objectWhere)
  66. ->get(['id', 'name', 'parent_id']);
  67. }
  68. protected function filesFormat(Collection $files, $firstId, &$nodes)
  69. {
  70. foreach ($files->groupBy("title") as $fileItems) {
  71. $item = $this->fileResourceFormat($fileItems->first(), $firstId, false);
  72. $nodes[] = $item;
  73. foreach ($fileItems as $fileItem) {
  74. $nodes[] = $this->fileResourceFormat($fileItem, $item['id'], true);
  75. }
  76. }
  77. }
  78. protected function fileResourceFormat(File $file, $parentId, bool $isChildrenFile)
  79. {
  80. return [
  81. 'id' => sprintf($isChildrenFile ? "children_%s" : "file_%s", $file->id),
  82. 'node_id' => $file->id,
  83. 'parent_id' => $parentId,
  84. 'title' => $file->title,
  85. 'extension' => $file->extension,
  86. 'size' => $file->size,
  87. 'created_by' => $file->createdBy ? [
  88. 'id' => $file->createdBy->id,
  89. 'name' => $file->createdBy->name,
  90. 'username' => $file->createdBy->username,
  91. ] : [],
  92. 'created_at' => (string)$file->created_at,
  93. 'version' => $file->version,
  94. 'type' => 'file',
  95. 'hide' => $file->hide_object_version == 0 ? (bool)$file->is_hide : $file->is_hide && $file->hide_object_version <= $this->objectVersion
  96. ];
  97. }
  98. protected function containerDataLoad(): void
  99. {
  100. if ($this->folderObjectType != FolderObjectType::CONTAINER) {
  101. return;
  102. }
  103. $containerContent = $this->object->content($this->queryData['object_version'] ?? $this->object->version)->first();
  104. throw_validation_if(! $containerContent, "The current version does not exist");
  105. $this->fileIds = explode(",", $containerContent->files);
  106. if ($this->fileIds) {
  107. $containerFolders = File::query()->whereIn("id", $this->fileIds)->pluck("folder_id")->filter()->unique();
  108. Folder::query()->whereIn("id", $containerFolders->toArray())->pluck("path")->each(function ($item) {
  109. $this->folderIds = [...$this->folderIds, ...explode(",", trim($item, ","))];
  110. });
  111. }
  112. if (! $this->objectVersion) {
  113. $this->objectVersion = $this->object->version;
  114. }
  115. }
  116. }