3 declare(strict_types=1);
5 namespace BookStack\Exports\Controllers;
7 use BookStack\Exceptions\ZipImportException;
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;
13 use Illuminate\Http\JsonResponse;
15 class ImportApiController extends Controller
17 public function __construct(
18 protected ImportRepo $imports,
20 $this->middleware('can:content-import');
24 * List existing imports visible to the user.
26 public function list(): JsonResponse
28 $imports = $this->imports->getVisibleImports();
30 return response()->json([
31 'status' => 'success',
32 'imports' => $imports,
37 * Upload, validate and store an import file.
39 public function upload(Request $request): JsonResponse
41 $this->validate($request, [
42 'file' => ['required', ...AttachmentService::getFileValidationRules()]
45 $file = $request->file('file');
48 $import = $this->imports->storeFromUpload($file);
49 } catch (ZipValidationException $exception) {
50 return response()->json([
52 'message' => 'Validation failed',
53 'errors' => $exception->errors,
57 return response()->json([
58 'status' => 'success',
64 * Show details of a pending import.
66 public function read(int $id): JsonResponse
68 $import = $this->imports->findVisible($id);
70 return response()->json([
71 'status' => 'success',
73 'data' => $import->decodeMetadata(),
78 * Run the import process.
80 public function create(int $id, Request $request): JsonResponse
82 $import = $this->imports->findVisible($id);
85 if ($import->type === 'page' || $import->type === 'chapter') {
86 $data = $this->validate($request, [
87 'parent' => ['required', 'string'],
89 $parent = $data['parent'];
93 $entity = $this->imports->runImport($import, $parent);
94 } catch (ZipImportException $exception) {
95 return response()->json([
97 'message' => 'Import failed',
98 'errors' => $exception->errors,
102 return response()->json([
103 'status' => 'success',
109 * Delete a pending import.
111 public function delete(int $id): JsonResponse
113 $import = $this->imports->findVisible($id);
114 $this->imports->deleteImport($import);
116 return response()->json([
117 'status' => 'success',
118 'message' => 'Import deleted successfully',