FileController.php 4.9 KB

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