authorize('viewAny', Slide::class); $pagination = $request->pagination(); $slides = $this->executor->execute( $query, new GetPaginatedSlidesQueryInput( pagination: $pagination, ) ); return view('bo.slides.index', compact('slides')); } public function create(): View { $this->authorize('create', Slide::class); return view('bo.slides.create'); } public function store(StoreSlideRequest $request, CreateSlide $action): RedirectResponse { $this->authorize('create', Slide::class); $period = new DatePeriod( start: $request->filled('date_start') ? new \DateTimeImmutable($request->string('date_start')->value()) : null, end: $request->filled('date_end') ? new \DateTimeImmutable($request->string('date_end')->value()) : null, ); $slide = $this->executor->execute( $action, new CreateSlideInput( title: $request->string('title')->value(), text: $request->filled('text') ? $request->string('text')->value() : null, picture: $this->resolvePicture($request), pictureAlt: $request->filled('picture_alt') ? $request->string('picture_alt')->value() : null, pictureTitle: $request->filled('picture_title') ? $request->string('picture_title')->value() : null, link: $request->filled('link') ? $request->string('link')->value() : null, linkLabel: $request->filled('link_label') ? $request->string('link_label')->value() : null, linkNewTab: $request->boolean('link_new_tab'), connected: $request->boolean('connected'), period: $period, ), ); return to_route('bo.slides.edit', $slide) ->with('success', trans('crud.messages.has_been_created', [ 'model' => Str::ucfirst(trans_choice('models.classes.slides', 1)), ])); } public function edit(Slide $slide): View { $this->authorize('update', $slide); return view('bo.slides.edit', [ 'slide' => SlideDto::fromModel($slide), ]); } public function update(UpdateSlideRequest $request, Slide $slide, UpdateSlide $action): RedirectResponse { $this->authorize('update', $slide); $period = new DatePeriod( start: $request->filled('date_start') ? new \DateTimeImmutable($request->string('date_start')->value()) : null, end: $request->filled('date_end') ? new \DateTimeImmutable($request->string('date_end')->value()) : null, ); $this->executor->execute( $action, new UpdateSlideInput( slide: $slide, title: $request->string('title')->value(), text: $request->filled('text') ? $request->string('text')->value() : null, picture: $this->resolvePicture($request), pictureAlt: $request->filled('picture_alt') ? $request->string('picture_alt')->value() : null, pictureTitle: $request->filled('picture_title') ? $request->string('picture_title')->value() : null, link: $request->filled('link') ? $request->string('link')->value() : null, linkLabel: $request->filled('link_label') ? $request->string('link_label')->value() : null, linkNewTab: $request->boolean('link_new_tab'), connected: $request->boolean('connected'), period: $period, ), ); return to_route('bo.slides.edit', $slide) ->with('success', trans('crud.messages.has_been_updated', [ 'model' => Str::ucfirst(trans_choice('models.classes.slides', 1)), ])); } public function destroy(Slide $slide, DeleteSlide $action): RedirectResponse { $this->authorize('delete', $slide); $this->executor->execute( $action, new DeleteSlideInput(slide: $slide), ); return to_route('bo.slides.index') ->with('warning', trans('crud.messages.has_been_deleted', [ 'model' => Str::ucfirst(trans_choice('models.classes.slides', 1)), ])); } private function resolvePicture(StoreSlideRequest | UpdateSlideRequest $request): UploadedFile | string | null { $file = $request->file('picture'); if ($file instanceof UploadedFile) { return $file; } return $request->has('picture') && is_string($request->input('picture')) ? $request->input('picture') : null; } }