From 7be66ef9675a04774dc3e243d2cb1f1c25567c01 Mon Sep 17 00:00:00 2001 From: Sparclex Date: Tue, 25 Sep 2018 12:09:46 +0300 Subject: [PATCH] add configuration file ignore non creation fields fix issue with belongsTo fields --- src/CardServiceProvider.php | 8 +++++++- src/ImportController.php | 40 ++++++++++++++++++++++--------------- src/ImportHandler.php | 39 +++++++++--------------------------- src/ImportNovaRequest.php | 34 +++++++++++++++++++++++++++++++ src/config.php | 19 ++++++++++++++++++ 5 files changed, 93 insertions(+), 47 deletions(-) create mode 100644 src/ImportNovaRequest.php create mode 100644 src/config.php diff --git a/src/CardServiceProvider.php b/src/CardServiceProvider.php index d484eae0a8..53c83ec0b6 100644 --- a/src/CardServiceProvider.php +++ b/src/CardServiceProvider.php @@ -20,6 +20,10 @@ public function boot() $this->routes(); }); + $this->publishes([ + __DIR__ . '/config.php' => config_path('sparclex-nova-import-card.php'), + ]); + Nova::serving(function (ServingNova $event) { Nova::script('nova-import-card', __DIR__.'/../dist/js/card.js'); Nova::style('nova-import-card', __DIR__.'/../dist/css/card.css'); @@ -49,6 +53,8 @@ protected function routes() */ public function register() { - // + $this->mergeConfigFrom( + __DIR__ . '/config.php', 'sparclex-nova-import-card' + ); } } diff --git a/src/ImportController.php b/src/ImportController.php index 772d1aee20..802ef8a161 100644 --- a/src/ImportController.php +++ b/src/ImportController.php @@ -4,6 +4,7 @@ use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\DB; use Laravel\Nova\Actions\Action; use Laravel\Nova\Http\Requests\NovaRequest; @@ -14,29 +15,36 @@ class ImportController extends Controller public function handle(NovaRequest $request) { $resource = $request->newResource(); - $rules = $resource->availableFields($request)->mapWithKeys(function($field) use($request) { - return $field->getCreationRules($request); - })->mapWithKeys(function($rule, $key) { - return ["*.".$key => $rule]; - }); - $fileReader = $resource::$importFileReader ?? CsvFileReader::class; - $importHandler = $resource::$importHandler ?? ImportHandler::class; + $fileReader = $resource::$importFileReader ?? config('sparclex-nova-import-card.file_reader'); + $data = $this->validate($request, [ 'file' => 'required|file|mimes:' . $fileReader::mimes() ]); - $fileReader = new $fileReader($data['file']); $data = $fileReader->read(); $fileReader->afterRead(); - $importHandler = new $importHandler($data); - $importHandler->validate($rules->toArray()); + $this->validateFields($data, $request, $resource); + + DB::transaction(function() use($resource, $data) { + $importHandler = $resource::$importHandler ?? config('sparclex-nova-import-card.import_handler'); + (new $importHandler($data))->handle($resource); + }); - if($error = $importHandler->handle($resource->resource)) { - return Action::danger($error); - } else { - return Action::message(__('Import successful')); - } + return Action::message(__('Import successful')); + } + + /** + * @param $data + * @param NovaRequest $request + * @param $resource + */ + protected function validateFields($data, $request, $resource): void + { + $rules = collect($resource::rulesForCreation($request))->mapWithKeys(function($rule, $key) { + return ["*.".$key => $rule]; + }); + $this->getValidationFactory()->make($data, $rules->toArray())->validate(); } -} \ No newline at end of file +} diff --git a/src/ImportHandler.php b/src/ImportHandler.php index e099715bc9..a309d4d403 100644 --- a/src/ImportHandler.php +++ b/src/ImportHandler.php @@ -3,7 +3,7 @@ namespace Sparclex\NovaImportCard; use Illuminate\Contracts\Validation\Factory; -use Illuminate\Support\Facades\DB; +use Laravel\Nova\Http\Requests\NovaRequest; /** * Imports the uploaded data which was extracted by the @@ -37,41 +37,20 @@ public function __construct(array $data) * @param $model * @return string|null error message */ - public function handle($model) + public function handle($resource) { $data = $this->data; - try { - DB::beginTransaction(); - foreach ($data as $entry) { - foreach ($entry as $attribute => $value) { - $model->{$attribute} = $value; - } - $model->save(); - $model = $model->newInstance(); - } - DB::commit(); - } catch (\Exception $e) { - DB::rollBack(); - return $e->getMessage(); + foreach ($data as $entry) { + [$model, $callbacks] = $resource::fill( + new ImportNovaRequest($entry), $resource::newModel() + ); + $model->save(); + collect($callbacks)->each->__invoke(); } - return null; - } - - /** - * Validates the uploaded data - * - * @param $rules resource field creation rules - */ - public function validate($rules) - { - - $this->getValidationFactory()->make( - $this->data, $rules - )->validate(); } public function getValidationFactory() { return app(Factory::class); } -} \ No newline at end of file +} diff --git a/src/ImportNovaRequest.php b/src/ImportNovaRequest.php new file mode 100644 index 0000000000..4f67bb7c06 --- /dev/null +++ b/src/ImportNovaRequest.php @@ -0,0 +1,34 @@ +data = $data; + } + + /** + * Retrieve an input item from the request. + * + * @param string|null $key + * @param string|array|null $default + * @return string|array|null + */ + public function input($key = null, $default = null) + { + if (!$key) { + return $this->data; + } + if (!isset($this->data[$key])) { + return $default; + } + return $this->data[$key]; + } +} diff --git a/src/config.php b/src/config.php new file mode 100644 index 0000000000..442373f565 --- /dev/null +++ b/src/config.php @@ -0,0 +1,19 @@ + Sparclex\NovaImportCard\CsvFileReader::class, + + /** + * An import handler stores the output of the file reader into the database + * + * This is the default import handler used, when there is no static variable $importHandler + * present in the resource class + */ + 'import_handler' => Sparclex\NovaImportCard\ImportHandler::class +];