FileController.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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. public function downloadAllLatest(DownloadService $service, string $objectType, string $objectId)
  73. {
  74. return $this->success([
  75. 'data' => $service->downloadAllLatest($objectType, $objectId),
  76. ]);
  77. }
  78. public function downloadShareFile(DownloadService $service, string $uuid)
  79. {
  80. return $this->success([
  81. 'data' => $service->downloadShareFile($uuid),
  82. ]);
  83. }
  84. /**
  85. * 文件上传
  86. *
  87. * @param FileUploadRequest $request
  88. * @return FileUploadSuccessResource|\Illuminate\Http\JsonResponse
  89. */
  90. public function upload(FileUploadRequest $request)
  91. {
  92. $uploadedFiles = (new FilesUploadService($request))->upload();
  93. return $this->success([
  94. 'data' => $uploadedFiles
  95. ]);
  96. }
  97. /**
  98. * 文件夹上传
  99. *
  100. * @param KeepDirectoryUploadRequest $request
  101. * @return FileUploadSuccessResource|\Illuminate\Http\JsonResponse
  102. */
  103. public function keepDirectoryUpload(KeepDirectoryUploadRequest $request)
  104. {
  105. $uploadedFiles = (new KeepDirectoryUploadService($request))->upload();
  106. return $this->success([
  107. 'data' => $uploadedFiles
  108. ]);
  109. }
  110. public function byObject(string $objectType, string $objectId)
  111. {
  112. $fileObjectType = FileObjectType::from($objectType);
  113. $fileObjectType->modelBuilderAllowed($objectId)->findOrFail($objectId);
  114. $files = File::query()
  115. ->with(['createdBy'])
  116. ->where('object_type', $objectType)
  117. ->where('object_id', $objectId)
  118. ->orderByDesc("version")
  119. ->where("source", 1)
  120. ->get();
  121. $items = [];
  122. foreach ($files->groupBy("title") as $fileItems) {
  123. $item = (new FileByObjectResource($fileItems->first()))->toArray(request());
  124. $item['children'] = [];
  125. foreach ($fileItems as $fileItem) {
  126. $item['children'][] = new FileByObjectResource($fileItem);
  127. }
  128. $items[] = $item;
  129. }
  130. return $this->success([
  131. 'data' => $items
  132. ]);
  133. }
  134. /**
  135. * 文件隐藏
  136. *
  137. * @param string $id
  138. * @param FileHideService $service
  139. * @return \Illuminate\Http\Response
  140. */
  141. public function hide(string $id, FileHideService $service){
  142. $service->hide($id);
  143. return $this->noContent();
  144. }
  145. }