diff --git a/app/Containers/AdditionalEducation/Actions/GetAdditionalEducationBySlugAction.php b/app/Containers/AdditionalEducation/Actions/GetAdditionalEducationBySlugAction.php new file mode 100644 index 0000000..85ca9d6 --- /dev/null +++ b/app/Containers/AdditionalEducation/Actions/GetAdditionalEducationBySlugAction.php @@ -0,0 +1,39 @@ +findAdditionalEducationBySlugTask->run($slug); + $seo = $this->seoPageProvider->getSeoForModel($additionalEducationModel); + + $settingsPage = $request->attributes->get('settings_page') ?? []; + + if (array_key_exists('custom_form', $settingsPage)) { + $form = $settingsPage['custom_form']; + } else { + $form = null; + } + + $additionalEducation = new AdditionalEducationResource($additionalEducationModel); + + return compact( + 'additionalEducation', + 'seo', + 'form', + ); + } +} diff --git a/app/Containers/AdditionalEducation/Actions/GetAllAdditionalEducationsAction.php b/app/Containers/AdditionalEducation/Actions/GetAllAdditionalEducationsAction.php new file mode 100644 index 0000000..603aceb --- /dev/null +++ b/app/Containers/AdditionalEducation/Actions/GetAllAdditionalEducationsAction.php @@ -0,0 +1,43 @@ +getDirectionAdditionalEducationsTask->run($request); + $additionalEducations = $this->getFilteredAdditionalEducationCategoriesTask->run($request); + $categories = $this->getAllAdditionalEducationCategoriesPreviewTask->run(); + $forms_education = $this->buildFormsEducationArrayTask->run(); + $seo = $this->seoPageProvider->getSeoForCurrentPage(); + $filters = $this->buildAdditionalEducationFiltersTask->run($request); + + return compact( + 'directionAdditionalEducations', + 'additionalEducations', + 'filters', + 'forms_education', + 'categories', + 'seo' + ); + } +} diff --git a/app/Containers/AdditionalEducation/Tasks/BuildAdditionalEducationFiltersTask.php b/app/Containers/AdditionalEducation/Tasks/BuildAdditionalEducationFiltersTask.php new file mode 100644 index 0000000..de1ca69 --- /dev/null +++ b/app/Containers/AdditionalEducation/Tasks/BuildAdditionalEducationFiltersTask.php @@ -0,0 +1,46 @@ +category) { + foreach ((array)$request->category as $item) { + $categoriesContent[$item] = (new GetFilteredAdditionalEducationCategoriesTask())->run(new Request(['category' => $item]))->first(); + } + } + + $forms_education = array_reduce( + FormEducation::cases(), + fn ($acc, $case) => $acc + [$case->name => $case->getLabel()], + [] + ); + + return [ + 'direction_filter' => [ + 'type' => 'direction', + 'value' => $request->input('direction'), + 'param' => 'direction' + ], + 'form_education_filter' => [ + 'type' => 'form', + 'value' => $request->input('form'), + 'param' => 'form' + ], + 'category_filter' => [ + 'type' => 'category', + 'value' => $request->input('category'), + 'param' => 'category', + 'content' => $categoriesContent, + ], + ]; + } +} diff --git a/app/Containers/AdditionalEducation/Tasks/BuildFormsEducationArrayTask.php b/app/Containers/AdditionalEducation/Tasks/BuildFormsEducationArrayTask.php new file mode 100644 index 0000000..6ffacb2 --- /dev/null +++ b/app/Containers/AdditionalEducation/Tasks/BuildFormsEducationArrayTask.php @@ -0,0 +1,17 @@ + $acc + [$case->name => $case->getLabel()], + [] + ); + } +} diff --git a/app/Containers/AdditionalEducation/Tasks/FindAdditionalEducationBySlugTask.php b/app/Containers/AdditionalEducation/Tasks/FindAdditionalEducationBySlugTask.php new file mode 100644 index 0000000..bfd158e --- /dev/null +++ b/app/Containers/AdditionalEducation/Tasks/FindAdditionalEducationBySlugTask.php @@ -0,0 +1,20 @@ +value . $slug, + now()->addDay(), + fn() => AdditionalEducation::with('category.direction')->where('slug', $slug)->firstOrFail() + ); + } +} diff --git a/app/Containers/AdditionalEducation/Tasks/GetAllAdditionalEducationCategoriesPreviewTask.php b/app/Containers/AdditionalEducation/Tasks/GetAllAdditionalEducationCategoriesPreviewTask.php new file mode 100644 index 0000000..5f42ee9 --- /dev/null +++ b/app/Containers/AdditionalEducation/Tasks/GetAllAdditionalEducationCategoriesPreviewTask.php @@ -0,0 +1,28 @@ +value . 'categories', + now()->addWeek(), + function () { + return AdditionalEducationCategoryPreviewResource::collection( + AdditionalEducationCategory::query() + ->where('is_active', true) + ->has('additionalEducations') + ->get() + ); + } + ); + } +} diff --git a/app/Containers/AdditionalEducation/Tasks/GetDirectionAdditionalEducationsTask.php b/app/Containers/AdditionalEducation/Tasks/GetDirectionAdditionalEducationsTask.php new file mode 100644 index 0000000..5294884 --- /dev/null +++ b/app/Containers/AdditionalEducation/Tasks/GetDirectionAdditionalEducationsTask.php @@ -0,0 +1,31 @@ +all())); + + return Cache::remember( + CacheKeys::ADDITIONAL_EDUCATIONAL_PROGRAMS_PREFIX->value . 'directions_' . $cacheKey, + now()->addDay(), + function () { + return DirectionAdditionalEducationResource::collection( + DirectionAdditionalEducation::query() + ->where('is_active', true) + ->whereHas('additionalEducationCategories', fn ($q) => $q->whereHas('additionalEducations')) + ->get() + ); + } + ); + } +} diff --git a/app/Containers/AdditionalEducation/Tasks/GetFilteredAdditionalEducationCategoriesTask.php b/app/Containers/AdditionalEducation/Tasks/GetFilteredAdditionalEducationCategoriesTask.php new file mode 100644 index 0000000..625da0c --- /dev/null +++ b/app/Containers/AdditionalEducation/Tasks/GetFilteredAdditionalEducationCategoriesTask.php @@ -0,0 +1,47 @@ +all())); + + return Cache::remember( + CacheKeys::ADDITIONAL_EDUCATIONAL_PROGRAMS_PREFIX->value . $cacheKey, + now()->addDay(), + function () use ($request) { + $query = AdditionalEducationCategory::query() + ->has('additionalEducations') + ->withActivePrograms() + ->where('is_active', true); + + if ($request->has('form')) { + $formValue = FormEducation::fromName($request->form)->value; + $query->whereHas('additionalEducations', fn ($q) => $q->where('form_education', $formValue)) + ->with(['additionalEducations' => fn ($q) => $q->where('form_education', $formValue)]); + } + + if ($request->has('category')) { + $slugs = is_array($request->category) ? $request->category : [$request->category]; + $query->whereIn('slug', $slugs); + } + + if ($request->has('direction')) { + $query->whereHas('direction', fn($q) => $q->where('slug', $request->direction)); + } + + return AdditionalEducationCategoryResource::collection($query->get()); + } + ); + } +} diff --git a/app/Containers/AdditionalEducation/UI/WEB/Controllers/ClientAdditionalEducationController.php b/app/Containers/AdditionalEducation/UI/WEB/Controllers/ClientAdditionalEducationController.php index 661ce31..1e0036a 100644 --- a/app/Containers/AdditionalEducation/UI/WEB/Controllers/ClientAdditionalEducationController.php +++ b/app/Containers/AdditionalEducation/UI/WEB/Controllers/ClientAdditionalEducationController.php @@ -2,160 +2,31 @@ namespace App\Containers\AdditionalEducation\UI\WEB\Controllers; -use App\Containers\AdditionalEducation\Data\Resources\AdditionalEducationCategoryPreviewResource; -use App\Containers\AdditionalEducation\Data\Resources\AdditionalEducationCategoryResource; -use App\Containers\AdditionalEducation\Data\Resources\AdditionalEducationResource; -use App\Containers\AdditionalEducation\Data\Resources\DirectionAdditionalEducationResource; -use App\Containers\AdditionalEducation\Models\AdditionalEducation; -use App\Containers\AdditionalEducation\Models\AdditionalEducationCategory; -use App\Containers\AdditionalEducation\Models\DirectionAdditionalEducation; -use App\Ship\Contracts\SeoServiceInterface; +use App\Containers\AdditionalEducation\Actions\GetAllAdditionalEducationsAction; +use App\Containers\AdditionalEducation\Actions\GetAdditionalEducationBySlugAction; use App\Ship\Controllers\Controller; -use App\Ship\Enums\CacheKeys; -use App\Ship\Enums\Education\FormEducation; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Cache; use Inertia\Inertia; class ClientAdditionalEducationController extends Controller { - public function __construct(readonly SeoServiceInterface $seoPageProvider){} + public function __construct( + readonly GetAllAdditionalEducationsAction $getAllAdditionalEducationsAction, + readonly GetAdditionalEducationBySlugAction $getAdditionalEducationBySlugAction + ){} public function index(Request $request): \Inertia\Response { - $cacheKey = md5(serialize($request->all())); + $data = $this->getAllAdditionalEducationsAction->run($request); - // Основные данные (кешируются) - $directionAdditionalEducations = Cache::remember( - CacheKeys::ADDITIONAL_EDUCATIONAL_PROGRAMS_PREFIX->value . 'directions_' . $cacheKey, - now()->addDay(), - function () { - return DirectionAdditionalEducationResource::collection( - DirectionAdditionalEducation::query() - ->where('is_active', true) - ->whereHas('additionalEducationCategories', fn ($q) => $q->whereHas('additionalEducations')) - ->get() - ); - } - ); - - $additionalEducations = Cache::remember( - CacheKeys::ADDITIONAL_EDUCATIONAL_PROGRAMS_PREFIX->value . $cacheKey, - now()->addDay(), - function () use ($request) { - $query = AdditionalEducationCategory::query() - ->has('additionalEducations') - ->withActivePrograms() - ->where('is_active', true); - - if ($request->has('form')) { - $formValue = FormEducation::fromName($request->form)->value; - $query->whereHas('additionalEducations', fn ($q) => $q->where('form_education', $formValue)) - ->with(['additionalEducations' => fn ($q) => $q->where('form_education', $formValue)]); - } - - if ($request->has('category')) { - $slugs = is_array($request->category) ? $request->category : [$request->category]; - $query->whereIn('slug', $slugs); - } - - if ($request->has('direction')) { - $query->whereHas('direction', fn($q) => $q->where('slug', $request->direction)); - } - - return AdditionalEducationCategoryResource::collection($query->get()); - } - ); - - $categories = Cache::remember( - CacheKeys::ADDITIONAL_EDUCATIONAL_PROGRAMS_PREFIX->value . 'categories', - now()->addWeek(), - function () { - return AdditionalEducationCategoryPreviewResource::collection( - AdditionalEducationCategory::query() - ->where('is_active', true) - ->has('additionalEducations') - ->get() - ); - } - ); - - // Динамические данные (не кешируются) - $categoriesContent = []; - if ($request->category) { - foreach ((array)$request->category as $item) { - $categoriesContent[$item] = new AdditionalEducationCategoryResource( - AdditionalEducationCategory::where('slug', $item)->first() - ); - } - } - - $forms_education = array_reduce( - FormEducation::cases(), - fn ($acc, $case) => $acc + [$case->name => $case->getLabel()], - [] - ); - - $filters = [ - 'direction_filter' => [ - 'type' => 'direction', - 'value' => $request->input('direction'), - 'param' => 'direction' - ], - 'form_education_filter' => [ - 'type' => 'form', - 'value' => $request->input('form'), - 'param' => 'form' - ], - 'category_filter' => [ - 'type' => 'category', - 'value' => $request->input('category'), - 'param' => 'category', - 'content' => $categoriesContent, - ], - ]; - - $seo = $this->seoPageProvider->getSeoForCurrentPage(); - - return Inertia::render('Client/Additional-educations/Index', compact( - 'directionAdditionalEducations', - 'additionalEducations', - 'filters', - 'forms_education', - 'categories', - 'seo' - )); + return Inertia::render('Client/Additional-educations/Index', $data); } - public function show(string $slug): \Inertia\Response + public function show(string $slug, Request $request): \Inertia\Response { - $additionalEducationModel = Cache::remember( - CacheKeys::ADDITIONAL_EDUCATIONAL_PROGRAM_PREFIX->value . $slug, - now()->addDay(), - fn() => AdditionalEducation::with('category.direction')->where('slug', $slug)->firstOrFail() - ); + $data = $this->getAdditionalEducationBySlugAction->run($slug, $request); - $seo = Cache::remember( - CacheKeys::ADDITIONAL_EDUCATIONAL_PROGRAM_PREFIX->value . 'seo_' . $slug, - now()->addDay(), - fn() => $this->seoPageProvider->getSeoForModel($additionalEducationModel) - ); - - $settingsPage = request()->attributes->get('settings_page') ?? []; - - if (array_key_exists('custom_form', $settingsPage)) { - $form = $settingsPage['custom_form']; - } else { - $form = null; - } - - $additionalEducation = new AdditionalEducationResource($additionalEducationModel); - - - return Inertia::render('Client/Additional-educations/Show', compact( - 'additionalEducation', - 'seo', - 'form', - )); - }} + return Inertia::render('Client/Additional-educations/Show', $data); + } +}