FileController.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\API\File\DownloadZipRequest;
  5. use App\Http\Requests\API\File\FileUploadRequest;
  6. use App\Http\Requests\API\File\KeepDirectoryUploadRequest;
  7. use App\Http\Resources\API\FileByObjectResource;
  8. use App\Http\Resources\API\FileDownloadResource;
  9. use App\Http\Resources\API\FileUploadSuccessResource;
  10. use App\Models\Enums\FileObjectType;
  11. use App\Models\File;
  12. use App\Models\Folder;
  13. use App\Services\File\DownloadService;
  14. use App\Services\File\FileHideService;
  15. use App\Services\File\Upload\FilesUploadService;
  16. use App\Services\File\Upload\KeepDirectoryUploadService;
  17. use Illuminate\Http\Request;
  18. use Illuminate\Support\Facades\Auth;
  19. use Illuminate\Support\Facades\Storage;
  20. class FileController extends Controller
  21. {
  22. public function download(string $id)
  23. {
  24. $file = File::query()->findOrFail($id);
  25. $fileObjectType = FileObjectType::from($file->object_type);
  26. $object = $fileObjectType->modelBuilderAllowed($file->object_id)->find($file->object_id);
  27. if(! $object){
  28. return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id));
  29. }
  30. return new FileDownloadResource($file);
  31. }
  32. public function changeName(Request $request,string $id)
  33. {
  34. $file = File::query()->findOrFail($id);
  35. $fileObjectType = FileObjectType::from($file->object_type);
  36. $object = $fileObjectType->modelBuilderAllowed($file->object_id)->find($file->object_id);
  37. if(! $object){
  38. return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id));
  39. }
  40. File::query()->where('title',$file->title)
  41. ->where('object_type',$file->object_type)
  42. ->where("object_id", $file->object_id)
  43. ->update(['title' => $request->get('title')]);
  44. return $this->noContent();
  45. }
  46. public function destroy(string $id){
  47. $file = File::query()->findOrFail($id);
  48. $fileObjectType = FileObjectType::from($file->object_type);
  49. $object = $fileObjectType->modelBuilderAllowed($file->object_id)->find($file->object_id);
  50. if(! $object){
  51. return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id));
  52. }
  53. $files = File::query()
  54. ->where('title',$file->title)
  55. ->where('object_type',$file->object_type)
  56. ->where("object_id", $file->object_id)
  57. ->get();
  58. File::query()->whereIn("id", $files->pluck("id")->toArray())->delete();
  59. Storage::delete($files->pluck("pathname")->toArray());
  60. $filesSize = $files->sum("size");
  61. $company = Auth::user()->company;
  62. $company->decrement("used_storage_capacity", $filesSize);
  63. $company->save();
  64. return $this->noContent();
  65. }
  66. public function downloadZip(DownloadZipRequest $request, DownloadService $service)
  67. {
  68. return $this->success([
  69. 'data' => $service->downloadByIds($request->get("ids")),
  70. ]);
  71. }
  72. protected function downloadAllLatest(DownloadService $service, string $objectType, string $objectId)
  73. {
  74. return $this->success([
  75. 'data' => $service->downloadAllLatest($objectType, $objectId),
  76. ]);
  77. }
  78. /**
  79. * 文件上传
  80. *
  81. * @param FileUploadRequest $request
  82. * @return FileUploadSuccessResource|\Illuminate\Http\JsonResponse
  83. */
  84. public function upload(FileUploadRequest $request)
  85. {
  86. $uploadedFiles = (new FilesUploadService($request))->upload();
  87. return $this->success([
  88. 'data' => $uploadedFiles
  89. ]);
  90. }
  91. /**
  92. * 文件夹上传
  93. *
  94. * @param KeepDirectoryUploadRequest $request
  95. * @return \Illuminate\Http\Response
  96. */
  97. public function keepDirectoryUpload(KeepDirectoryUploadRequest $request)
  98. {
  99. (new KeepDirectoryUploadService($request))->upload();
  100. return $this->created();
  101. }
  102. public function byObject(string $objectType, string $objectId)
  103. {
  104. $fileObjectType = FileObjectType::from($objectType);
  105. $fileObjectType->modelBuilderAllowed($objectId)->findOrFail($objectId);
  106. $files = File::query()
  107. ->with(['createdBy'])
  108. ->where('object_type', $objectType)
  109. ->where('object_id', $objectId)
  110. ->orderByDesc("version")
  111. ->where("source", 1)
  112. ->get();
  113. $items = [];
  114. foreach ($files->groupBy("title") as $fileItems) {
  115. $item = (new FileByObjectResource($fileItems->first()))->toArray(request());
  116. $item['children'] = [];
  117. foreach ($fileItems as $fileItem) {
  118. $item['children'][] = new FileByObjectResource($fileItem);
  119. }
  120. $items[] = $item;
  121. }
  122. return $this->success([
  123. 'data' => $items
  124. ]);
  125. }
  126. /**
  127. * 文件隐藏
  128. *
  129. * @param string $id
  130. * @param FileHideService $service
  131. * @return \Illuminate\Http\Response
  132. */
  133. public function hide(string $id, FileHideService $service){
  134. $service->hide($id);
  135. return $this->noContent();
  136. }
  137. }