1+ <?php
2+
3+ declare (strict_types=1 );
4+
5+ namespace BookStack \Exports \Controllers ;
6+
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 ;
14+
15+ class ImportApiController extends Controller
16+ {
17+ public function __construct (
18+ protected ImportRepo $ imports ,
19+ ) {
20+ $ this ->middleware ('can:content-import ' );
21+ }
22+
23+ /**
24+ * List existing imports visible to the user.
25+ */
26+ public function list (): JsonResponse
27+ {
28+ $ imports = $ this ->imports ->getVisibleImports ();
29+
30+ return response ()->json ([
31+ 'status ' => 'success ' ,
32+ 'imports ' => $ imports ,
33+ ]);
34+ }
35+
36+ /**
37+ * Upload, validate and store an import file.
38+ */
39+ public function upload (Request $ request ): JsonResponse
40+ {
41+ $ this ->validate ($ request , [
42+ 'file ' => ['required ' , ...AttachmentService::getFileValidationRules ()]
43+ ]);
44+
45+ $ file = $ request ->file ('file ' );
46+
47+ try {
48+ $ import = $ this ->imports ->storeFromUpload ($ file );
49+ } catch (ZipValidationException $ exception ) {
50+ return response ()->json ([
51+ 'status ' => 'error ' ,
52+ 'message ' => 'Validation failed ' ,
53+ 'errors ' => $ exception ->errors ,
54+ ], 422 );
55+ }
56+
57+ return response ()->json ([
58+ 'status ' => 'success ' ,
59+ 'import ' => $ import ,
60+ ], 201 );
61+ }
62+
63+ /**
64+ * Show details of a pending import.
65+ */
66+ public function read (int $ id ): JsonResponse
67+ {
68+ $ import = $ this ->imports ->findVisible ($ id );
69+
70+ return response ()->json ([
71+ 'status ' => 'success ' ,
72+ 'import ' => $ import ,
73+ 'data ' => $ import ->decodeMetadata (),
74+ ]);
75+ }
76+
77+ /**
78+ * Run the import process.
79+ */
80+ public function create (int $ id , Request $ request ): JsonResponse
81+ {
82+ $ import = $ this ->imports ->findVisible ($ id );
83+ $ parent = null ;
84+
85+ if ($ import ->type === 'page ' || $ import ->type === 'chapter ' ) {
86+ $ data = $ this ->validate ($ request , [
87+ 'parent ' => ['required ' , 'string ' ],
88+ ]);
89+ $ parent = $ data ['parent ' ];
90+ }
91+
92+ try {
93+ $ entity = $ this ->imports ->runImport ($ import , $ parent );
94+ } catch (ZipImportException $ exception ) {
95+ return response ()->json ([
96+ 'status ' => 'error ' ,
97+ 'message ' => 'Import failed ' ,
98+ 'errors ' => $ exception ->errors ,
99+ ], 500 );
100+ }
101+
102+ return response ()->json ([
103+ 'status ' => 'success ' ,
104+ 'entity ' => $ entity ,
105+ ]);
106+ }
107+
108+ /**
109+ * Delete a pending import.
110+ */
111+ public function delete (int $ id ): JsonResponse
112+ {
113+ $ import = $ this ->imports ->findVisible ($ id );
114+ $ this ->imports ->deleteImport ($ import );
115+
116+ return response ()->json ([
117+ 'status ' => 'success ' ,
118+ 'message ' => 'Import deleted successfully ' ,
119+ ]);
120+ }
121+ }
0 commit comments