X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/a56a28fbb7eaff40a639c2d06f56de255cd654ea..refs/heads/development:/app/Exports/Controllers/ImportController.php diff --git a/app/Exports/Controllers/ImportController.php b/app/Exports/Controllers/ImportController.php index 9eefb0974..b938dac8e 100644 --- a/app/Exports/Controllers/ImportController.php +++ b/app/Exports/Controllers/ImportController.php @@ -1,30 +1,110 @@ middleware('can:content-import'); } - public function start(Request $request) + /** + * Show the view to start a new import, and also list out the existing + * in progress imports that are visible to the user. + */ + public function start() { - // TODO - Show existing imports for user (or for all users if admin-level user) + $imports = $this->imports->getVisibleImports(); + + $this->setPageTitle(trans('entities.import')); - return view('exports.import'); + return view('exports.import', [ + 'imports' => $imports, + 'zipErrors' => session()->pull('validation_errors') ?? [], + ]); } + /** + * Upload, validate and store an import file. + */ public function upload(Request $request) { - // TODO - Read existing ZIP upload and send through validator - // TODO - If invalid, return user with errors - // TODO - Upload to storage - // TODO - Store info/results from validator - // TODO - Send user to next import stage + $this->validate($request, [ + 'file' => ['required', ...AttachmentService::getFileValidationRules()] + ]); + + $file = $request->file('file'); + try { + $import = $this->imports->storeFromUpload($file); + } catch (ZipValidationException $exception) { + return redirect('/import')->with('validation_errors', $exception->errors); + } + + return redirect($import->getUrl()); + } + + /** + * Show a pending import, with a form to allow progressing + * with the import process. + */ + public function show(int $id) + { + $import = $this->imports->findVisible($id); + + $this->setPageTitle(trans('entities.import_continue')); + + return view('exports.import-show', [ + 'import' => $import, + 'data' => $import->decodeMetadata(), + ]); + } + + /** + * Run the import process against an uploaded import ZIP. + */ + public function run(int $id, Request $request) + { + $import = $this->imports->findVisible($id); + $parent = null; + + if ($import->type === 'page' || $import->type === 'chapter') { + session()->setPreviousUrl($import->getUrl()); + $data = $this->validate($request, [ + 'parent' => ['required', 'string'], + ]); + $parent = $data['parent']; + } + + try { + $entity = $this->imports->runImport($import, $parent); + } catch (ZipImportException $exception) { + session()->flush(); + $this->showErrorNotification(trans('errors.import_zip_failed_notification')); + return redirect($import->getUrl())->with('import_errors', $exception->errors); + } + + return redirect($entity->getUrl()); + } + + /** + * Delete an active pending import from the filesystem and database. + */ + public function delete(int $id) + { + $import = $this->imports->findVisible($id); + $this->imports->deleteImport($import); + + return redirect('/import'); } }