authorizeResource(Document::class); } /** * Display a listing of the resource. * * @param \Illuminate\Http\Request $request * @return \Illuminate\View\View */ public function index(Request $request): \Illuminate\View\View { /** @var \Illuminate\Database\Eloquent\Builder $query */ $query = Document::query(); $tags = Tag::get(); if ($request->search) { $this->searchQuery( $query, $request->search, null, 'title', ); } $searchFields = trans('validation.attributes.title'); /** Search by tags */ $query->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($query); $documentModels = $this->paginate($query); return view('bo.pages.documents.index', [ 'documentModels' => $documentModels, 'searchFields' => $searchFields, 'searchTag' => $request->tag, 'tags' => $tags ]); } /** * Show the form for creating a new resource. * * @param \App\Models\Document $document * @return \Illuminate\View\View */ public function create(Document $document): \Illuminate\View\View { $documentsList = Document::query()->where('lang', LangEnum::fr)->get(); $directories = Directory::getChildrenDirectories(); $tags = Tag::get(); return view('bo.pages.documents.create', [ 'documentModel' => $document, 'documentsList' => $documentsList, 'directories' => $directories, 'tags' => $tags ]); } /** * Store a newly created resource in storage. * * @param \App\Http\Requests\Bo\Documents\StoreDocumentRequest $request * @return \Illuminate\Http\RedirectResponse */ public function store(StoreDocumentRequest $request): \Illuminate\Http\RedirectResponse { 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', ['tenant' => \tenant(), 'document' => $document]) ->with('success', trans( ':model a été créé', ['model' => trans('models.classes.document')] )); } return redirect() ->back() ->with('error', trans( ':model n\'a pas été créé', ['model' => trans('models.classes.document')] )); }); } /** * Show the form for editing the specified resource. * * @param \App\Models\Document $document * @return \Illuminate\View\View */ public function edit(Document $document): \Illuminate\View\View { $documentsList = Document::query()->where('lang', LangEnum::fr)->get(); $directories = Directory::getChildrenDirectories(); $tags = Tag::get(); return view('bo.pages.documents.edit', [ 'documentModel' => $document, 'documentsList' => $documentsList, 'directories' => $directories, 'tags' => $tags ]); } /** * Update the specified resource in storage. * * @param \App\Http\Requests\Bo\Documents\UpdateDocumentRequest $request * @param \App\Models\Document $document * @return \Illuminate\Http\RedirectResponse */ public function update(UpdateDocumentRequest $request, Document $document): \Illuminate\Http\RedirectResponse { 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', ['tenant' => \tenant(), 'document' => $document]) ->with('success', trans( ':model a été mis à jour', ['model' => trans('models.classes.document')] )); } return redirect() ->back() ->with('error', trans( ':model n\'a pas été mis à jour', ['model' => trans('models.classes.document')] )); }); } /** * Remove the specified resource from storage. * * @param \App\Models\Document $document * @return \Illuminate\Http\RedirectResponse */ public function destroy(Document $document): \Illuminate\Http\RedirectResponse { /** @var array */ $previousQueries = []; \parse_str(\parse_url(url()->previous(), \PHP_URL_QUERY), $previousQueries); $document->tags()->sync([]); /** @var \App\Models\Document $documentChild */ foreach ($document->children as $documentChild) { Document::removeDocument($documentChild); $documentChild->deleteOrFail(); } if ($document->deleteOrFail()) { return redirect() ->route('bo.documents.index', array_merge(['tenant' => \tenant()], $previousQueries)) ->with('warning', trans( ':model a bien été supprimé', ['model' => trans('models.classes.document')] )); } return redirect() ->back() ->with('error', trans( ':model n\'a pas été supprimé', ['model' => trans('models.classes.document')] )); } /** * Download the document * * @param string $tenant * @param string $uuid * @return \Symfony\Component\HttpFoundation\BinaryFileResponse */ public function download(string $tenant, string $uuid): \Symfony\Component\HttpFoundation\BinaryFileResponse { $doc = Document::where('uuid', $uuid)->firstOrFail(); $pathToFile = public_path() . Storage::url( sprintf('docs/%s/%s.%s', $tenant, $doc->uuid, $doc->type) ); return response()->download($pathToFile, $doc->path); } /** * @param \App\Http\Requests\Bo\UploadRequest $request * @return \Illuminate\Http\JsonResponse * @throws \Pion\Laravel\ChunkUpload\Exceptions\UploadMissingFileException Bla. */ public function upload(UploadRequest $request) { // 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(), $request->uuid); } // We are in chunk mode, lets send the current progress. $handler = $save->handler(); return response()->json([ "done" => $handler->getPercentageDone(), 'status' => true ]); } /** * @param \Illuminate\Http\UploadedFile $file * @param string|null $uuid * @return \Illuminate\Http\JsonResponse */ protected function saveFile(UploadedFile $file, ?string $uuid): \Illuminate\Http\JsonResponse { /** @var \Illuminate\Filesystem\FilesystemAdapter */ $disk = Storage::disk('docs'); $uuid = $uuid ?: Str::uuid(); /** @var \Illuminate\Http\UploadedFile $file */ $filename = sprintf('%s/%s.%s', \tenant()->getKey(), $uuid, $file->guessExtension()); $disk->putFileAs('', $file, $filename); return response()->json([ 'uid' => $uuid, ]); } }