3 declare(strict_types=1);
5 namespace BookStack\Exports\Controllers;
7 use BookStack\Activity\ActivityType;
8 use BookStack\Exceptions\ZipValidationException;
9 use BookStack\Exports\ImportRepo;
10 use BookStack\Http\Controller;
11 use BookStack\Uploads\AttachmentService;
12 use Illuminate\Http\Request;
14 class ImportController extends Controller
16 public function __construct(
17 protected ImportRepo $imports,
19 $this->middleware('can:content-import');
23 * Show the view to start a new import, and also list out the existing
24 * in progress imports that are visible to the user.
26 public function start()
28 $imports = $this->imports->getVisibleImports();
30 $this->setPageTitle(trans('entities.import'));
32 return view('exports.import', [
33 'imports' => $imports,
34 'zipErrors' => session()->pull('validation_errors') ?? [],
39 * Upload, validate and store an import file.
41 public function upload(Request $request)
43 $this->validate($request, [
44 'file' => ['required', ...AttachmentService::getFileValidationRules()]
47 $file = $request->file('file');
49 $import = $this->imports->storeFromUpload($file);
50 } catch (ZipValidationException $exception) {
51 session()->flash('validation_errors', $exception->errors);
52 return redirect('/import');
55 $this->logActivity(ActivityType::IMPORT_CREATE, $import);
57 return redirect($import->getUrl());
61 * Show a pending import, with a form to allow progressing
62 * with the import process.
64 public function show(int $id)
66 $import = $this->imports->findVisible($id);
68 $this->setPageTitle(trans('entities.import_continue'));
70 return view('exports.import-show', [
75 public function run(int $id, Request $request)
77 // TODO - Test access/visibility
78 $import = $this->imports->findVisible($id);
81 if ($import->getType() === 'page' || $import->getType() === 'chapter') {
82 $data = $this->validate($request, [
83 'parent' => ['required', 'string']
85 $parent = $data['parent'];
89 // TODO - Validate again before
90 // TODO - Check permissions before (create for main item, create for children, create for related items [image, attachments])
91 // TODO - Redirect to result
92 // TOOD - Or redirect back with errors
96 * Delete an active pending import from the filesystem and database.
98 public function delete(int $id)
100 $import = $this->imports->findVisible($id);
101 $this->imports->deleteImport($import);
103 $this->logActivity(ActivityType::IMPORT_DELETE, $import);
105 return redirect('/import');