findOrFail($id); $fileObjectType = FileObjectType::from($file->object_type); $object = $fileObjectType->modelBuilderAllowed($file->object_id)->find($file->object_id); if (!$object) { return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id)); } ActionRepository::create($id, ActionObjectType::CONTAINER_FILE, ObjectAction::DOWNLOAD); return new FileDownloadResource($file); } public function changeName(Request $request, string $id) { $isAction = $request->input('is_action', null); $result = ($isAction === '0') ? true : ($isAction === '1' ? false : false); $file = File::query()->findOrFail($id); $fileObjectType = FileObjectType::from($file->object_type); $object = $fileObjectType->modelBuilderAllowed($file->object_id, $result)->find($file->object_id); if (!$object) { return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id)); } File::query()->where('title', $file->title) ->where('object_type', $file->object_type) ->where("object_id", $file->object_id) ->update(['title' => $request->get('title')]); ActionRepository::createByFile($file->object_id, $file->object_type, ObjectAction::EDITED_FILE); return $this->noContent(); } public function destroy(Request $request, string $id) { $isAction = $request->input('is_action', null); $result = ($isAction === '0') ? true : ($isAction === '1' ? false : false); $file = File::query()->findOrFail($id); $fileObjectType = FileObjectType::from($file->object_type); $object = $fileObjectType->modelBuilderAllowed($file->object_id, $result)->find($file->object_id); if (!$object) { return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id)); } $files = File::query() ->where('title', $file->title) ->where('object_type', $file->object_type) ->where("object_id", $file->object_id) ->where("folder_id", $file->folder_id) ->get(); File::query()->whereIn("id", $files->pluck("id")->toArray())->delete(); ActionRepository::createByFile($file->object_id, $file->object_type, ObjectAction::DELETED_FILE); Storage::delete($files->pluck("pathname")->toArray()); $filesSize = $files->sum("size"); $company = Auth::user()->company; $company->decrement("used_storage_capacity", $filesSize); $company->save(); return $this->noContent(); } public function downloadZip(DownloadZipRequest $request, DownloadService $service) { return $this->success([ 'data' => $service->downloadByIds($request->get("ids")), ]); } public function downloadAllLatest(DownloadService $service, string $objectType, string $objectId) { return $this->success([ 'data' => $service->downloadAllLatest($objectType, $objectId), ]); } public function downloadShareFile(DownloadService $service, string $uuid) { return $this->success([ 'data' => $service->downloadShareFile($uuid), ]); } /** * 文件上传 * * @param FileUploadRequest $request * @return FileUploadSuccessResource|\Illuminate\Http\JsonResponse */ public function upload(FileUploadRequest $request) { set_time_limit(0); $uploadedFiles = (new FilesUploadService($request))->upload(); if ($request->object_id !== null) { ActionRepository::createByFile($request->object_id, $request->object_type, ObjectAction::UPLOADED); } return $this->success([ 'data' => $uploadedFiles ]); } /** * 模型上传 * @param \App\Http\Requests\API\File\FileUploadRequest $request * @return */ public function modelUpload(FileUploadRequest $request) { set_time_limit(0); $uploadedFiles = (new FilesUploadService($request))->uploadModels(); if ($request->object_id !== null) { ActionRepository::createByFile($request->object_id, $request->object_type, ObjectAction::UPLOADED); } return FileUploadSuccessResource::collection($uploadedFiles); } public function companyUpload(FileUploadRequest $request) { set_time_limit(0); $uploadedFiles = (new CompanyUploadService($request))->upload(); return $this->success([ 'data' => $uploadedFiles ]); } /** * 文件夹上传 * * @param KeepDirectoryUploadRequest $request * @return FileUploadSuccessResource|\Illuminate\Http\JsonResponse */ public function keepDirectoryUpload(KeepDirectoryUploadRequest $request) { set_time_limit(0); $uploadedFiles = (new KeepDirectoryUploadService($request))->upload(); if ($request->object_id !== null) { ActionRepository::createByFile($request->object_id, $request->object_type, ObjectAction::UPLOADED); } return $this->success([ 'data' => $uploadedFiles ]); } public function uploadProgress(string $requestId) { return $this->success([ 'data' => ProgressBar::queryByRequestId($requestId), ]); } public function byObject(string $objectType, string $objectId) { $fileObjectType = FileObjectType::from($objectType); $fileObjectType->modelBuilderAllowed($objectId)->findOrFail($objectId); $files = File::query() ->with(['createdBy']) ->where('object_type', $objectType) ->where('object_id', $objectId) ->orderByDesc("version") ->where("source", 1) ->get(); $items = []; foreach ($files->groupBy("title") as $fileItems) { $item = (new FileByObjectResource($fileItems->first()))->toArray(request()); $item['extraField'] = 'parent' . '_' . $item['id']; $item['children'] = []; foreach ($fileItems as $fileItem) { $resource = (new FileByObjectResource($fileItem))->toArray(request()); $resource['extraField'] = 'children' . '_' . $resource['id']; $item['children'][] = $resource; } $items[] = $item; } return $this->success([ 'data' => $items ]); } /** * 文件隐藏 * * @param string $id * @param FileHideService $service * @return Response */ public function hide(string $id, FileHideService $service) { $service->hide($id); return $this->noContent(); } public function bimView(string $id) { $file = File::query()->where('is_bim', 1)->findOrFail($id); $fileObjectType = FileObjectType::from($file->object_type); $object = $fileObjectType->modelBuilderAllowed($file->object_id)->find($file->object_id); if (!$object) { return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id)); } $bimFile = $file->bimFile; if ($bimFile->convert_status !== BimFileConvertStatus::DONE->value) { return $this->badRequest("BIM is in the process of conversion. Please wait a moment"); } switch ($bimFile->bim_driver) { case BIMDriverEnum::GLENDALE->value: $result = (new BimService)->getGlendaleBimInfo($file->bimFile); break; default: $result = []; break; } return $this->success([ 'data' => [ 'bim_driver' => $bimFile->bim_driver, 'bim_view' => $result, ] ]); } /** * 获取上传COS临时密钥 */ public function getCOSToken(FileUploadRequest $request, Cos $cos) { $pathPrefix = cos_upload_prefix(Auth::user()->company_id, $request['object_type'] ?? ''); $data = $cos->getTempKeys($pathPrefix); return $this->successData($data); } /** * 容器下的所有模型列表 */ public function models(Request $request) { $inputArr = $this->validate($request, [ 'model_type' => 'array', 'container_id' => 'int', 'library_id' => 'int', 'asset_id' => 'int', 'project_id' => 'int', 'folder_id' => 'int', 'keyword' => '', ]); $containerId = (int) ($inputArr['container_id'] ?? 0); $libraryId = (int) ($inputArr['library_id'] ?? 0); $assetId = (int) ($inputArr['asset_id'] ?? 0); $projectId = (int) ($inputArr['project_id'] ?? 0); $folderId = (int) ($inputArr['folder_id'] ?? 0); $pageSize = (int) $request->get('page_size', 10); $keyword = $inputArr['keyword'] ?? ''; $modelTypeArr = $inputArr['model_type'] ?? []; if (empty($modelTypeArr)) { $modelTypeArr = [BimFileModelType::BIM->value, BimFileModelType::CAD->value]; } $files = File::query() ->where('is_bim', 1) ->where('is_latest_version', 1) ->folderId($folderId) ->projectId($projectId) ->assetId($assetId) ->containerId($containerId) ->containerLibraryId($libraryId) ->keyword($keyword) ->with(['bimFile', 'createdBy']) ->whereHas('bimFile', function ($query) use ($modelTypeArr) { return $query->modelType($modelTypeArr)->where('convert_status', BimFileConvertStatus::DONE->value); }) ->latest('id') ->paginate($pageSize); return FileSimpleResource::collection($files); } // 模型历史记录 public function modelHistory(Request $request) { $inputArr = $this->validate($request, [ 'file_id' => 'required|int', ]); $fileId = (int) ($inputArr['file_id'] ?? 0); $pageSize = (int) $request->get('page_size', 10); $file = File::query()->findOrFail($fileId); if (!empty($file->source_file_id)) { $files = File::query() ->with(['bimFile', 'createdBy']) ->where('is_bim', 1) ->where('object_type', $file->object_type) ->where('object_id', $file->object_id) ->where('folder_id', $file->folder_id) ->where('source_file_id', $file->source_file_id) ->orWhere('id', $file->source_file_id) ->latest('version') ->paginate($pageSize); } else { $files[] = $file; } return FileSimpleResource::collection($files); } // 文件详情 public function detail(int $fileId) { $file = File::findOrFail($fileId); return new FileByObjectResource($file); } public function update( Request $request, FileService $fileService, string $id ): Response { $fileService->update($id, $request->all()); return $this->noContent(); } }