From 528a4b24b0d20c49edbe0b152da064442782b5dd Mon Sep 17 00:00:00 2001 From: F4ilji Date: Tue, 22 Jul 2025 18:22:04 +0500 Subject: [PATCH] refactor multiple widget controllers; replace caching logic with action classes for data retrieval, enhancing code clarity and maintainability --- ...GetAdditionalEducationalProgramsAction.php | 17 ++++++++ .../Actions/GetEducationalProgramsAction.php | 17 ++++++++ .../Widget/Actions/GetPageAction.php | 33 +++++++++++++++ .../Widget/Actions/GetPostsAction.php | 17 ++++++++ .../Widget/Actions/GetSinglePostAction.php | 17 ++++++++ .../Widget/Actions/GetSliderBySlugAction.php | 17 ++++++++ .../Widget/Tasks/FindPageByIdTask.php | 20 +++++++++ .../Widget/Tasks/FindPostByIdTask.php | 21 ++++++++++ .../Widget/Tasks/FindSliderBySlugTask.php | 26 ++++++++++++ ...ctiveAdditionalEducationalProgramsTask.php | 27 ++++++++++++ .../Widget/Tasks/GetFilteredPostsTask.php | 30 +++++++++++++ .../GetPublishedEducationalProgramsTask.php | 28 +++++++++++++ ...AdditionalEducationalProgramController.php | 23 +++------- ...ientWidgetEducationalProgramController.php | 23 +++------- .../ClientWidgetPageController.php | 33 ++++----------- .../ClientWidgetPostController.php | 42 ++++++------------- .../ClientWidgetSliderController.php | 21 +++------- .../pageBuilder/blocks/PageItemBlock.vue | 4 +- .../pageBuilder/blocks/PostItemBlock.vue | 14 +++++-- 19 files changed, 320 insertions(+), 110 deletions(-) create mode 100644 app/Containers/Widget/Actions/GetAdditionalEducationalProgramsAction.php create mode 100644 app/Containers/Widget/Actions/GetEducationalProgramsAction.php create mode 100644 app/Containers/Widget/Actions/GetPageAction.php create mode 100644 app/Containers/Widget/Actions/GetPostsAction.php create mode 100644 app/Containers/Widget/Actions/GetSinglePostAction.php create mode 100644 app/Containers/Widget/Actions/GetSliderBySlugAction.php create mode 100644 app/Containers/Widget/Tasks/FindPageByIdTask.php create mode 100644 app/Containers/Widget/Tasks/FindPostByIdTask.php create mode 100644 app/Containers/Widget/Tasks/FindSliderBySlugTask.php create mode 100644 app/Containers/Widget/Tasks/GetActiveAdditionalEducationalProgramsTask.php create mode 100644 app/Containers/Widget/Tasks/GetFilteredPostsTask.php create mode 100644 app/Containers/Widget/Tasks/GetPublishedEducationalProgramsTask.php diff --git a/app/Containers/Widget/Actions/GetAdditionalEducationalProgramsAction.php b/app/Containers/Widget/Actions/GetAdditionalEducationalProgramsAction.php new file mode 100644 index 0000000..76d2d78 --- /dev/null +++ b/app/Containers/Widget/Actions/GetAdditionalEducationalProgramsAction.php @@ -0,0 +1,17 @@ +getActiveAdditionalEducationalProgramsTask->run(); + } +} diff --git a/app/Containers/Widget/Actions/GetEducationalProgramsAction.php b/app/Containers/Widget/Actions/GetEducationalProgramsAction.php new file mode 100644 index 0000000..8b5593f --- /dev/null +++ b/app/Containers/Widget/Actions/GetEducationalProgramsAction.php @@ -0,0 +1,17 @@ +getPublishedEducationalProgramsTask->run(); + } +} diff --git a/app/Containers/Widget/Actions/GetPageAction.php b/app/Containers/Widget/Actions/GetPageAction.php new file mode 100644 index 0000000..ffc5cef --- /dev/null +++ b/app/Containers/Widget/Actions/GetPageAction.php @@ -0,0 +1,33 @@ +findPageByIdTask->run($id); + + if (isset($page->section)) { + $breadcrumbs = [ + 'mainSection' => $page->section->mainSection->title, + 'subSection' => $page->section->title, + 'page' => $page->title, + ]; + } else { + $breadcrumbs = null; + } + + return [ + 'page' => new PageNavigateResource($page), + 'breadcrumbs' => $breadcrumbs + ]; + } +} diff --git a/app/Containers/Widget/Actions/GetPostsAction.php b/app/Containers/Widget/Actions/GetPostsAction.php new file mode 100644 index 0000000..dd2d5d3 --- /dev/null +++ b/app/Containers/Widget/Actions/GetPostsAction.php @@ -0,0 +1,17 @@ +getFilteredPostsTask->run($category_id, $count); + } +} diff --git a/app/Containers/Widget/Actions/GetSinglePostAction.php b/app/Containers/Widget/Actions/GetSinglePostAction.php new file mode 100644 index 0000000..a918f28 --- /dev/null +++ b/app/Containers/Widget/Actions/GetSinglePostAction.php @@ -0,0 +1,17 @@ +findPostByIdTask->run($id); + } +} diff --git a/app/Containers/Widget/Actions/GetSliderBySlugAction.php b/app/Containers/Widget/Actions/GetSliderBySlugAction.php new file mode 100644 index 0000000..0be639e --- /dev/null +++ b/app/Containers/Widget/Actions/GetSliderBySlugAction.php @@ -0,0 +1,17 @@ +findSliderBySlugTask->run($slug); + } +} diff --git a/app/Containers/Widget/Tasks/FindPageByIdTask.php b/app/Containers/Widget/Tasks/FindPageByIdTask.php new file mode 100644 index 0000000..0f4d3bd --- /dev/null +++ b/app/Containers/Widget/Tasks/FindPageByIdTask.php @@ -0,0 +1,20 @@ +addHours(1), function () use ($id) { + return Page::where('id', '=', $id) + ->with('section.pages.section', 'section.mainSection') + ->firstOrFail(); + }); + } +} diff --git a/app/Containers/Widget/Tasks/FindPostByIdTask.php b/app/Containers/Widget/Tasks/FindPostByIdTask.php new file mode 100644 index 0000000..2961c0a --- /dev/null +++ b/app/Containers/Widget/Tasks/FindPostByIdTask.php @@ -0,0 +1,21 @@ +addMinutes(10), function () use ($id) { + return new PostThumbnailResource( + Post::query()->with('category')->find($id)->firstOrFail() + ); + }); + } +} diff --git a/app/Containers/Widget/Tasks/FindSliderBySlugTask.php b/app/Containers/Widget/Tasks/FindSliderBySlugTask.php new file mode 100644 index 0000000..daa90db --- /dev/null +++ b/app/Containers/Widget/Tasks/FindSliderBySlugTask.php @@ -0,0 +1,26 @@ +addHour(), function () use ($slug) { + $slider = Slider::query() + ->where('slug', $slug) + ->where('is_active', true) + ->with(['slides' => function($query) { + $query->where('is_active', true); + }]) + ->firstOrFail(); + + return $slider ?: null; + }); + } +} diff --git a/app/Containers/Widget/Tasks/GetActiveAdditionalEducationalProgramsTask.php b/app/Containers/Widget/Tasks/GetActiveAdditionalEducationalProgramsTask.php new file mode 100644 index 0000000..eda5b04 --- /dev/null +++ b/app/Containers/Widget/Tasks/GetActiveAdditionalEducationalProgramsTask.php @@ -0,0 +1,27 @@ +value . 'search_list', + now()->addDay(), // Кешируем на 1 день + function () { + return AdditionalEducationSearchResource::collection( + AdditionalEducation::query() + ->where('is_active', true) + ->orderBy('title', 'desc') + ->get() + ); + } + ); + } +} diff --git a/app/Containers/Widget/Tasks/GetFilteredPostsTask.php b/app/Containers/Widget/Tasks/GetFilteredPostsTask.php new file mode 100644 index 0000000..04a238f --- /dev/null +++ b/app/Containers/Widget/Tasks/GetFilteredPostsTask.php @@ -0,0 +1,30 @@ +addMinutes(10), function () use ($category_id, $count) { + return PostThumbnailResource::collection( + Post::query() + ->where('status', PostStatus::PUBLISHED) + ->when($category_id, function ($query, $category_id) { + $query->where('category_id', $category_id); + }) + ->with('category') + ->orderBy('publish_at', 'desc') + ->take($count) + ->get() + ); + }); + } +} diff --git a/app/Containers/Widget/Tasks/GetPublishedEducationalProgramsTask.php b/app/Containers/Widget/Tasks/GetPublishedEducationalProgramsTask.php new file mode 100644 index 0000000..a956489 --- /dev/null +++ b/app/Containers/Widget/Tasks/GetPublishedEducationalProgramsTask.php @@ -0,0 +1,28 @@ +value . 'search_list', + now()->addDay(), // Кешируем на 1 день + function () { + return EducationalProgramSearchResource::collection( + EducationalProgram::query() + ->where('status', EducationalProgramStatus::PUBLISHED) + ->orderBy('name', 'desc') + ->get() + ); + } + ); + } +} diff --git a/app/Containers/Widget/UI/API/Controllers/ClientWidgetAdditionalEducationalProgramController.php b/app/Containers/Widget/UI/API/Controllers/ClientWidgetAdditionalEducationalProgramController.php index 1bc9462..ba9f34c 100644 --- a/app/Containers/Widget/UI/API/Controllers/ClientWidgetAdditionalEducationalProgramController.php +++ b/app/Containers/Widget/UI/API/Controllers/ClientWidgetAdditionalEducationalProgramController.php @@ -2,28 +2,17 @@ namespace App\Containers\Widget\UI\API\Controllers; -use App\Containers\AdditionalEducation\Models\AdditionalEducation; -use App\Containers\Search\UI\API\Transformers\AdditionalEducationSearchResource; +use App\Containers\Widget\Actions\GetAdditionalEducationalProgramsAction; use App\Ship\Controllers\Controller; -use App\Ship\Enums\CacheKeys; -use Illuminate\Support\Facades\Cache; class ClientWidgetAdditionalEducationalProgramController extends Controller { + public function __construct( + private readonly GetAdditionalEducationalProgramsAction $getAdditionalEducationalProgramsAction + ) {} + public function index() { - return Cache::remember( - CacheKeys::ADDITIONAL_EDUCATIONAL_PROGRAMS_PREFIX->value . 'search_list', - now()->addDay(), // Кешируем на 1 день - function () { - return AdditionalEducationSearchResource::collection( - AdditionalEducation::query() - ->where('is_active', true) - ->orderBy('title', 'desc') - ->get() - ); - } - ); + return $this->getAdditionalEducationalProgramsAction->run(); } - } diff --git a/app/Containers/Widget/UI/API/Controllers/ClientWidgetEducationalProgramController.php b/app/Containers/Widget/UI/API/Controllers/ClientWidgetEducationalProgramController.php index 3658e0a..1da0fad 100644 --- a/app/Containers/Widget/UI/API/Controllers/ClientWidgetEducationalProgramController.php +++ b/app/Containers/Widget/UI/API/Controllers/ClientWidgetEducationalProgramController.php @@ -2,28 +2,17 @@ namespace App\Containers\Widget\UI\API\Controllers; -use App\Containers\Education\Models\EducationalProgram; -use App\Containers\Search\UI\API\Transformers\EducationalProgramSearchResource; +use App\Containers\Widget\Actions\GetEducationalProgramsAction; use App\Ship\Controllers\Controller; -use App\Ship\Enums\CacheKeys; -use App\Ship\Enums\Education\EducationalProgramStatus; -use Illuminate\Support\Facades\Cache; class ClientWidgetEducationalProgramController extends Controller { + public function __construct( + private readonly GetEducationalProgramsAction $getEducationalProgramsAction + ) {} + public function index() { - return Cache::remember( - CacheKeys::EDUCATION_PROGRAMS_PREFIX->value . 'search_list', - now()->addDay(), // Кешируем на 1 день - function () { - return EducationalProgramSearchResource::collection( - EducationalProgram::query() - ->where('status', EducationalProgramStatus::PUBLISHED) - ->orderBy('name', 'desc') - ->get() - ); - } - ); + return $this->getEducationalProgramsAction->run(); } } diff --git a/app/Containers/Widget/UI/API/Controllers/ClientWidgetPageController.php b/app/Containers/Widget/UI/API/Controllers/ClientWidgetPageController.php index dfb0e80..a55d5e5 100644 --- a/app/Containers/Widget/UI/API/Controllers/ClientWidgetPageController.php +++ b/app/Containers/Widget/UI/API/Controllers/ClientWidgetPageController.php @@ -2,38 +2,19 @@ namespace App\Containers\Widget\UI\API\Controllers; -use App\Containers\AppStructure\Models\Page; -use App\Containers\Widget\UI\API\Transformers\PageNavigateResource; +use App\Containers\Widget\Actions\GetPageAction; use App\Ship\Controllers\Controller; -use Illuminate\Support\Facades\Cache; class ClientWidgetPageController extends Controller { + public function __construct( + private readonly GetPageAction $getPageAction + ) {} + public function single(int $id): \Illuminate\Http\JsonResponse { - $cacheKey = 'page_' . md5($id); + $data = $this->getPageAction->run($id); - // Пытаемся получить данные из кеша - $page = Cache::remember($cacheKey, now()->addHours(1), function () use ($id) { - return Page::where('id', '=', $id) - ->with('section.pages.section', 'section.mainSection') - ->firstOrFail(); - }); - - if (isset($page->section)) { - $breadcrumbs = [ - 'mainSection' => $page->section->mainSection->title, - 'subSection' => $page->section->title, - 'page' => $page->title, - ]; - } else { - $breadcrumbs = null; - } - return response()->json([ - 'data' => [ - 'page' => new PageNavigateResource($page), - 'breadcrumbs' => $breadcrumbs - ], - ], 200); + return response()->json(['data' => $data], 200); } } diff --git a/app/Containers/Widget/UI/API/Controllers/ClientWidgetPostController.php b/app/Containers/Widget/UI/API/Controllers/ClientWidgetPostController.php index a8b1537..d2db405 100644 --- a/app/Containers/Widget/UI/API/Controllers/ClientWidgetPostController.php +++ b/app/Containers/Widget/UI/API/Controllers/ClientWidgetPostController.php @@ -2,44 +2,28 @@ namespace App\Containers\Widget\UI\API\Controllers; -use App\Containers\Article\Enums\PostStatus; -use App\Containers\Article\Models\Post; -use App\Containers\Widget\UI\API\Transformers\PostThumbnailResource; +use App\Containers\Widget\Actions\GetPostsAction; +use App\Containers\Widget\Actions\GetSinglePostAction; use App\Ship\Controllers\Controller; -use Illuminate\Support\Facades\Cache; +use Illuminate\Http\Request; class ClientWidgetPostController extends Controller { - public function index() + public function __construct( + private readonly GetPostsAction $getPostsAction, + private readonly GetSinglePostAction $getSinglePostAction + ) {} + + public function index(Request $request) { - $category_id = request()->input('category'); - $count = request()->input('count', 5); + $category_id = $request->input('category'); + $count = $request->input('count', 5); - $cacheKey = 'posts_' . $category_id . '_' . $count; - - return Cache::remember($cacheKey, now()->addMinutes(10), function () use ($category_id, $count) { - return PostThumbnailResource::collection( - Post::query() - ->where('status', PostStatus::PUBLISHED) - ->when($category_id, function ($query, $category_id) { - $query->where('category_id', $category_id); - }) - ->with('category') - ->orderBy('publish_at', 'desc') - ->take($count) - ->get() - ); - }); + return $this->getPostsAction->run($category_id, $count); } public function single(int $id) { - $cacheKey = 'post_' . $id; - - return Cache::remember($cacheKey, now()->addMinutes(10), function () use ($id) { - return new PostThumbnailResource( - Post::query()->with('category')->find($id)->firstOrFail() - ); - }); + return $this->getSinglePostAction->run($id); } } diff --git a/app/Containers/Widget/UI/API/Controllers/ClientWidgetSliderController.php b/app/Containers/Widget/UI/API/Controllers/ClientWidgetSliderController.php index 6bff15c..2ae2600 100644 --- a/app/Containers/Widget/UI/API/Controllers/ClientWidgetSliderController.php +++ b/app/Containers/Widget/UI/API/Controllers/ClientWidgetSliderController.php @@ -2,26 +2,17 @@ namespace App\Containers\Widget\UI\API\Controllers; -use App\Containers\Widget\Models\Slider; +use App\Containers\Widget\Actions\GetSliderBySlugAction; use App\Ship\Controllers\Controller; -use Illuminate\Support\Facades\Cache; class ClientWidgetSliderController extends Controller { + public function __construct( + private readonly GetSliderBySlugAction $getSliderBySlugAction + ) {} + public function show(string $slug): ?object { - $cacheKey = 'slider_' . $slug; - - return Cache::remember($cacheKey, now()->addHour(), function () use ($slug) { - $slider = Slider::query() - ->where('slug', $slug) - ->where('is_active', true) - ->with(['slides' => function($query) { - $query->where('is_active', true); - }]) - ->firstOrFail(); - - return $slider ?: null; - }); + return $this->getSliderBySlugAction->run($slug); } } diff --git a/resources/js/componentss/shared/builder/pageBuilder/blocks/PageItemBlock.vue b/resources/js/componentss/shared/builder/pageBuilder/blocks/PageItemBlock.vue index 09f7bb6..0d71cce 100644 --- a/resources/js/componentss/shared/builder/pageBuilder/blocks/PageItemBlock.vue +++ b/resources/js/componentss/shared/builder/pageBuilder/blocks/PageItemBlock.vue @@ -1,6 +1,4 @@