search) { $this->searchQuery( $documents, $request->search, null, 'title', ); } $searchFields = trans('Titre'); /** Search by tags */ $documents->when($request->tag, function ($query) use ($request) { $query->whereHas('tags', function (Builder $query) use ($request) { $query->where('id', $request->tag); }); }); /** Sort columns with a query */ $this->sortQuery($documents); /** @var integer $pagination Items per page */ if ($request->pagination) { // FIXME: Add pagination validation. Cache::forever('pagination', intval($request->pagination)); } $documents = $documents->paginate(intval(Cache::get('pagination')) ?? config('pagination.default')); return view('bo.pages.documents.index', [ 'documents' => $documents, 'searchFields' => $searchFields, 'searchTag' => $request->tag, 'tags' => $tags ]); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { $documents = Document::where('lang', \App\Enums\Documents\LangEnum::fr())->get(); $directories = Directory::getChildrenDirectories(); $tags = Tag::get(); return view('bo.pages.documents.create', compact('documents', 'directories', 'tags')); } /** * Store a newly created resource in storage. * * @param \App\Http\Requests\Bo\Documents\StoreDocumentRequest $request * @return \Illuminate\Http\Response */ public function store(StoreDocumentRequest $request) { return DB::transaction(function () use ($request) { $document = new Document(); $document->fill($request->validated()); if ($document->saveOrFail()) { $document->tags()->sync(collect($request->tags)->pluck('id')); return redirect() ->route('bo.documents.edit', $document) ->with('success', trans( ':model a été créé', ['model' => Str::singular(trans('models.classes.documents'))] )); } return redirect() ->back() ->with('error', trans( ':model n\'a pas été créé', ['model' => Str::singular(trans('models.classes.documents'))] )); }); } /** * Show the form for editing the specified resource. * * @param \App\Models\Document $document * @return \Illuminate\Http\Response */ public function edit(Document $document) { $documents = Document::where('lang', \App\Enums\Documents\LangEnum::fr())->get(); $directories = Directory::getChildrenDirectories(); $tags = Tag::get(); return view('bo.pages.documents.edit', [ 'documents' => $documents, 'documentModel' => $document, 'directories' => $directories, 'tags' => $tags ]); } /** * Update the specified resource in storage. * * @param \App\Http\Requests\Bo\Document\UpdateDocumentRequest $request * @param \App\Models\Document $document * @return \Illuminate\Http\Response */ public function update(UpdateDocumentRequest $request, Document $document) { return DB::transaction(function () use ($request, $document) { $document->fill($request->validated()); $document->tags()->sync(collect($request->tags)->pluck('id')); if ($document->saveOrFail()) { return redirect() ->route('bo.documents.edit', $document) ->with('success', trans( ':model a été mis à jour', ['model' => Str::singular(trans('models.classes.documents'))] )); } return redirect() ->back() ->with('error', trans( ':model n\'a pas été mis à jour', ['model' => Str::singular(trans('models.classes.documents'))] )); }); } /** * Remove the specified resource from storage. * * @param \App\Models\Document $document * @return \Illuminate\Http\Response */ public function destroy(Document $document) { $document->tags()->sync([]); foreach ($document->children as $documentChild) { Document::removeDocument($documentChild); $documentChild->deleteOrFail(); } if ($document->deleteOrFail()) { return redirect() ->route('bo.documents.index') ->with('warning', trans( ':model a bien été supprimé', ['model' => Str::singular(trans('models.classes.documents'))] )); } return redirect() ->back() ->with('error', trans( ':model n\'a pas été supprimé', ['model' => Str::singular(trans('models.classes.documents'))] )); } /** * Download the document * * @param mixed $uuid * @return \Symfony\Component\HttpFoundation\BinaryFileResponse */ public function download(mixed $uuid) { $doc = Document::where('uuid', $uuid)->firstOrFail(); $pathToFile = public_path() . Storage::url('docs/' . $doc->uuid . '.' . $doc->type); return response()->download($pathToFile, $doc->path); } /** * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse * @throws \Pion\Laravel\ChunkUpload\Exceptions\UploadMissingFileException Bla. */ public function upload(Request $request) { if (isset($request->uuid)) { $uuid = $request->uuid; } else { $uuid = false; } // Create the file receiver. $receiver = new FileReceiver("file", $request, HandlerFactory::classFromRequest($request)); // Check if the upload is success, throw exception or return response you need. if ($receiver->isUploaded() === false) { throw new UploadMissingFileException(); } // Receive the file. $save = $receiver->receive(); // Check if the upload has finished (in chunk mode it will send smaller files). if ($save->isFinished()) { // Save the file and return any response you need, current example uses `move` function. // If you are not using move, you need to manually delete the file: unlink($save->getFile()->getPathname()). return $this->saveFile($save->getFile(), $uuid); } // We are in chunk mode, lets send the current progress. /** @var AbstractHandler $handler */ $handler = $save->handler(); return response()->json([ "done" => $handler->getPercentageDone(), 'status' => true ]); } /** * @param \Illuminate\Http\UploadedFile $file * @param mixed $uuid * @return \Illuminate\Http\JsonResponse * @throws \Illuminate\Contracts\Container\BindingResolutionException Bla. */ protected function saveFile(UploadedFile $file, mixed $uuid) { if ($uuid === false) { $uuid = sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); } $finalPath = storage_path('app/public/docs/'); // Move the file name. $file->move($finalPath, $uuid . '.' . $file->getClientOriginalExtension()); return response()->json([ 'uid' => $uuid, ]); } }