111 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace BookStack\Exports\Controllers;
 | 
						|
 | 
						|
use BookStack\Exceptions\ZipImportException;
 | 
						|
use BookStack\Exceptions\ZipValidationException;
 | 
						|
use BookStack\Exports\ImportRepo;
 | 
						|
use BookStack\Http\Controller;
 | 
						|
use BookStack\Uploads\AttachmentService;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
 | 
						|
class ImportController extends Controller
 | 
						|
{
 | 
						|
    public function __construct(
 | 
						|
        protected ImportRepo $imports,
 | 
						|
    ) {
 | 
						|
        $this->middleware('can:content-import');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 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()
 | 
						|
    {
 | 
						|
        $imports = $this->imports->getVisibleImports();
 | 
						|
 | 
						|
        $this->setPageTitle(trans('entities.import'));
 | 
						|
 | 
						|
        return view('exports.import', [
 | 
						|
            'imports' => $imports,
 | 
						|
            'zipErrors' => session()->pull('validation_errors') ?? [],
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Upload, validate and store an import file.
 | 
						|
     */
 | 
						|
    public function upload(Request $request)
 | 
						|
    {
 | 
						|
        $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');
 | 
						|
    }
 | 
						|
}
 |