DownloadService.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace App\Services\File;
  3. use App\Http\Resources\API\FileDownloadResource;
  4. use App\Models\Enums\FileObjectType;
  5. use App\Models\Enums\FolderObjectType;
  6. use App\Models\File;
  7. use App\Models\Folder;
  8. use Illuminate\Support\Collection;
  9. class DownloadService
  10. {
  11. public function downloadByIds(array $ids)
  12. {
  13. $files = File::query()->with(['folder'])->whereIn("id", $ids)->get();
  14. return $this->filesFormat($files);
  15. }
  16. public function downloadAllLatest(string $objectType, string $objectId)
  17. {
  18. $folderObjectType = FolderObjectType::from($objectType);
  19. $object = $folderObjectType->modelBuilderAllowed()->findOrFail($objectId);
  20. $isExternalVersionControl = $this->isExternalVersionControl($folderObjectType);
  21. $fileIds = $isExternalVersionControl ? $this->versionFileIds($folderObjectType, $object) : [];
  22. $files = File::query()->with(['folder'])->where([
  23. 'object_type' => $objectType,
  24. 'object_id' => $objectId,
  25. ])->when(! $isExternalVersionControl, fn($query) => $query->where("is_latest_version", 1))
  26. ->when($fileIds, fn($query) => $query->whereIn("id", $fileIds))
  27. ->orderByDesc("version")
  28. ->get();
  29. $files = $isExternalVersionControl ? $this->getLatestFiles($files, $object) : $files;
  30. return $this->filesFormat($files);
  31. }
  32. protected function isExternalVersionControl(FolderObjectType $folderObjectType)
  33. {
  34. return $folderObjectType == FolderObjectType::CONTAINER && request("object_version", 0) > 0;
  35. }
  36. protected function getLatestFiles(Collection $files, $object)
  37. {
  38. $objectVersion = request('object_version') ?: $object->version;
  39. $items = [];
  40. foreach ($files->groupBy("folder_id") as $folderFiles) {
  41. foreach ($folderFiles as $file) {
  42. $isHide = $file->hide_object_version == 0
  43. ? (bool)$file->is_hide
  44. : $file->is_hide && $file->hide_object_version <= $objectVersion;
  45. if (! $isHide) {
  46. $items[] = $file;
  47. break;
  48. }
  49. }
  50. }
  51. return collect($items);
  52. }
  53. protected function versionFileIds(FolderObjectType $folderObjectType, $object)
  54. {
  55. $fileIds = [];
  56. if ($folderObjectType == FolderObjectType::CONTAINER) {
  57. $containerContent = $object->content(request('object_version') ?: $object->version)->first();
  58. throw_validation_if(! $containerContent, "The current version does not exist");
  59. $fileIds = explode(",", $containerContent->files);
  60. }
  61. return array_unique(array_filter($fileIds));
  62. }
  63. protected function filesFormat(Collection $files)
  64. {
  65. $folderIds = [];
  66. foreach ($files as $file) {
  67. $folderIds = [...$folderIds, ...explode(",", $file->folder?->path)];
  68. }
  69. $folders = Folder::query()->whereIn("id", array_unique(array_filter($folderIds)))->pluck("name", "id");
  70. $items = [];
  71. foreach ($files as $file) {
  72. $object = FileObjectType::from($file->object_type)
  73. ->modelBuilderAllowed($file->object_id)
  74. ->find($file->object_id);
  75. throw_validation_if(! $object, sprintf("File ID: %s, no permission to access", $file->id));
  76. $fileDownloadResource = (new FileDownloadResource($file))->toArray(request());
  77. $folderPath = [];
  78. foreach(array_filter(explode(",", $file->folder?->path)) as $folderId) {
  79. $folderPath[] = $folders->get($folderId);
  80. }
  81. $fileDownloadResource['folder_path'] = "/" . implode('/', $folderPath);
  82. $items[] = $fileDownloadResource;
  83. }
  84. return $items;
  85. }
  86. }