diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index b264951..06424a6 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -2,9 +2,7 @@ namespace App\Exceptions; -use Exception; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; -use Throwable; class Handler extends ExceptionHandler { @@ -26,31 +24,4 @@ class Handler extends ExceptionHandler 'password', 'password_confirmation', ]; - - /** - * Report or log an exception. - * - * @param \Throwable $exception - * @return void - * - * @throws \Throwable - */ - public function report(Throwable $exception) - { - parent::report($exception); - } - - /** - * Render an exception into an HTTP response. - * - * @param \Illuminate\Http\Request $request - * @param \Throwable $exception - * @return \Symfony\Component\HttpFoundation\Response - * - * @throws \Throwable - */ - public function render($request, Throwable $exception) - { - return parent::render($request, $exception); - } } diff --git a/app/Factories/Rules/ProviderConfigurationRuleFactory.php b/app/Factories/Rules/ProviderConfigurationRuleFactory.php new file mode 100644 index 0000000..c54e1c8 --- /dev/null +++ b/app/Factories/Rules/ProviderConfigurationRuleFactory.php @@ -0,0 +1,48 @@ +delete(); - return redirect(route('provider-show', [ + return $this->redirector->route('provider-show', [ 'category_code' => $configuration->category_code, 'provider_code' => $configuration->provider_code, 'configuration_deleted' => 1 - ])); + ]); } } diff --git a/app/Http/Controllers/Web/ProviderConfigurationStoreController.php b/app/Http/Controllers/Web/ProviderConfigurationStoreController.php index 251707a..c16380f 100644 --- a/app/Http/Controllers/Web/ProviderConfigurationStoreController.php +++ b/app/Http/Controllers/Web/ProviderConfigurationStoreController.php @@ -7,10 +7,10 @@ use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\InteractsWithRegistry; use App\Http\Controllers\Traits\TransformsArrayDot; -use App\Http\Requests\StoreProviderConfiguration; +use App\Http\Requests\ProviderConfigurationStoreRequest; use App\Services\ProviderConfigurationService; -use Illuminate\Http\Request; -use Illuminate\Validation\ValidationException; +use Illuminate\Http\RedirectResponse; +use Illuminate\Routing\Redirector; use Upmind\ProvisionBase\Registry\Registry; class ProviderConfigurationStoreController extends Controller @@ -18,24 +18,26 @@ class ProviderConfigurationStoreController extends Controller use InteractsWithRegistry; use TransformsArrayDot; - public function __invoke(StoreProviderConfiguration $request, Registry $registry) + public function __construct( + private readonly ProviderConfigurationService $service, + private readonly Redirector $redirector + ) { + } + + public function __invoke(ProviderConfigurationStoreRequest $request, Registry $registry): RedirectResponse { + /** @var \Upmind\ProvisionBase\Registry\Data\ProviderRegister $provider */ $provider = $this->getProvider($registry, $request); - try { - $service = new ProviderConfigurationService(); - $configuration = $service->create( - $provider, - $request->get('name'), - $this->undot($request->get('field_values', [])) - ); - } catch (ValidationException $e) { - return redirect()->back()->withErrors($e->errors()); - } - - return redirect(route('provider-configuration-show', [ + $configuration = $this->service->create( + $provider, + $request->post('name'), + $this->undot($request->post('field_values', [])) + ); + + return $this->redirector->route('provider-configuration-show', [ 'configuration' => $configuration, 'created' => 1, - ])); + ]); } } diff --git a/app/Http/Controllers/Web/ProviderConfigurationUpdateController.php b/app/Http/Controllers/Web/ProviderConfigurationUpdateController.php index dd17cff..86db43c 100644 --- a/app/Http/Controllers/Web/ProviderConfigurationUpdateController.php +++ b/app/Http/Controllers/Web/ProviderConfigurationUpdateController.php @@ -5,34 +5,36 @@ namespace App\Http\Controllers\Web; use App\Http\Controllers\Controller; -use App\Http\Controllers\Traits\InteractsWithRegistry; use App\Http\Controllers\Traits\TransformsArrayDot; +use App\Http\Requests\ProviderConfigurationUpdateRequest; use App\Models\ProviderConfiguration; use App\Services\ProviderConfigurationService; -use Illuminate\Http\Request; -use Illuminate\Validation\ValidationException; +use Illuminate\Http\RedirectResponse; +use Illuminate\Routing\Redirector; class ProviderConfigurationUpdateController extends Controller { - use InteractsWithRegistry; use TransformsArrayDot; - public function __invoke(Request $request, ProviderConfiguration $configuration) - { - try { - $service = new ProviderConfigurationService(); - $service->update( - $configuration, - $request->get('name'), - $this->undot($request->get('field_values', [])) - ); - } catch (ValidationException $e) { - return redirect()->back()->withErrors($e->errors(), 'field_values'); - } + public function __construct( + private readonly ProviderConfigurationService $service, + private readonly Redirector $redirector + ) { + } + + public function __invoke( + ProviderConfigurationUpdateRequest $request, + ProviderConfiguration $configuration + ): RedirectResponse { + $configuration = $this->service->update( + $configuration, + $request->post('name'), + $this->undot($request->post('field_values', [])) + ); - return redirect(route('provider-configuration-show', [ + return $this->redirector->route('provider-configuration-show', [ 'configuration' => $configuration, - 'updated' => 1 - ])); + 'updated' => 1, + ]); } } diff --git a/app/Http/Requests/ProviderConfigurationStoreRequest.php b/app/Http/Requests/ProviderConfigurationStoreRequest.php new file mode 100644 index 0000000..bf86734 --- /dev/null +++ b/app/Http/Requests/ProviderConfigurationStoreRequest.php @@ -0,0 +1,48 @@ +> + * + * @throws \InvalidArgumentException + */ + public function rules(Registry $registry): array + { + return [ + 'name' => [ + 'required', + 'string', + 'max:255' + ], + 'field_values' => [ + 'array', + 'nullable', + ProviderConfigurationRuleFactory::create([ + 'registry' => $registry, + // We don't really expect these to be any other than strings. + 'category_code' => (string) $this->route('category_code'), + 'provider_code' => (string) $this->route('provider_code'), + ]), + ], + ]; + } +} diff --git a/app/Http/Requests/ProviderConfigurationUpdateRequest.php b/app/Http/Requests/ProviderConfigurationUpdateRequest.php new file mode 100644 index 0000000..a83b656 --- /dev/null +++ b/app/Http/Requests/ProviderConfigurationUpdateRequest.php @@ -0,0 +1,51 @@ +> + * + * @throws \InvalidArgumentException + */ + public function rules(Registry $registry): array + { + /** @var \App\Models\ProviderConfiguration $configuration */ + $configuration = $this->route('configuration'); + + return [ + 'name' => [ + 'required', + 'string', + 'max:255' + ], + 'field_values' => [ + 'array', + 'nullable', + ProviderConfigurationRuleFactory::create([ + 'registry' => $registry, + // Pass category_code and provider_code from the configuration model + 'category_code' => $configuration->category_code, + 'provider_code' => $configuration->provider_code, + ]), + ], + ]; + } +} diff --git a/app/Http/Requests/StoreProviderConfiguration.php b/app/Http/Requests/StoreProviderConfiguration.php deleted file mode 100644 index e7ac3ea..0000000 --- a/app/Http/Requests/StoreProviderConfiguration.php +++ /dev/null @@ -1,34 +0,0 @@ -|string> - */ - public function rules(): array - { - return [ - 'name' => [ - 'required', - 'string', - 'max:255' - ] - ]; - } -} diff --git a/app/Rules/ProviderConfigurationRule.php b/app/Rules/ProviderConfigurationRule.php new file mode 100644 index 0000000..d48d2f2 --- /dev/null +++ b/app/Rules/ProviderConfigurationRule.php @@ -0,0 +1,59 @@ +registry = $registry; + $this->categoryCode = $categoryCode; + $this->providerCode = $providerCode; + } + + /** + * Run the validation rule. + * + * @param \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString $fail + * @throws \Illuminate\Validation\ValidationException + */ + public function validate(string $attribute, mixed $value, Closure $fail): void + { + $provider = $this->registry->getProvider($this->categoryCode, $this->providerCode); + + if ($provider === null) { + $fail(sprintf( + 'The provision %s provider %s is not installed.', + $this->categoryCode, + $this->providerCode + )); + } + + $rules = $provider->getConstructor()->getParameter()->getRules()->expand(); + + $this->validator->setRules($rules); + $this->validator->setData($value); + + $this->validator->validate(); + } + + public function setValidator(Validator $validator): ProviderConfigurationRule|static + { + $this->validator = $validator; + + return $this; + } +} diff --git a/app/Services/ProviderConfigurationService.php b/app/Services/ProviderConfigurationService.php index 692110b..d3dc22a 100644 --- a/app/Services/ProviderConfigurationService.php +++ b/app/Services/ProviderConfigurationService.php @@ -5,23 +5,15 @@ namespace App\Services; use App\Models\ProviderConfiguration; -use App\Models\ProvisionRequest; -use Illuminate\Support\Facades\Validator; -use Illuminate\Validation\ValidationException; use Upmind\ProvisionBase\Registry\Data\ProviderRegister; class ProviderConfigurationService { - /** - * @throws ValidationException If the given configuration data is invalid - */ public function create( ProviderRegister $provider, string $name, array $data ): ProviderConfiguration { - $this->validateData($provider, $data); - $configuration = new ProviderConfiguration(); $configuration->name = $name; $configuration->category_code = $provider->getCategory()->getIdentifier(); @@ -32,43 +24,15 @@ public function create( return $configuration; } - /** - * @throws ValidationException If the given configuration data is invalid - */ public function update( ProviderConfiguration $configuration, string $name, array $data ): ProviderConfiguration { - $this->validateData($configuration->getProvider(), $data); - $configuration->name = $name; $configuration->data = $data; $configuration->save(); return $configuration; } - - public function delete(ProviderConfiguration $configuration) - { - $requestService = new ProvisionRequestService(); - ProvisionRequest::where('configuration_id', $configuration->id) - ->chunk(20, function ($requests) use ($requestService) { - foreach ($requests as $request) { - $requestService->delete($request); - } - }); - - $configuration->delete(); - } - - /** - * @throws ValidationException If the given configuration data is invalid - */ - protected function validateData(ProviderRegister $provider, array $data): void - { - $rules = $provider->getConstructor()->getParameter()->getRules()->expand(); - - Validator::make($data, $rules)->validate(); - } }