diff --git a/app/Containers/InstituteStructure/Actions/FindDepartmentBySlugAction.php b/app/Containers/InstituteStructure/Actions/FindDepartmentBySlugAction.php new file mode 100644 index 0000000..d29d301 --- /dev/null +++ b/app/Containers/InstituteStructure/Actions/FindDepartmentBySlugAction.php @@ -0,0 +1,40 @@ +getFacultyBySlugOnlyTask->run($facultySlug); + + $departments = $this->getActiveDepartmentsByFacultyIdTask->run($faculty->id); + + $departmentModel = $this->getDepartmentBySlugTask->run($departmentSlug, $cacheKey); + + $department = new DepartmentResource($departmentModel); + + $directions = $this->groupProgramsByDirectionTask->run($department->programs); + + return compact('department', 'departments', 'directions', 'departmentModel'); + } +} diff --git a/app/Containers/InstituteStructure/Actions/FindFacultyBySlugAction.php b/app/Containers/InstituteStructure/Actions/FindFacultyBySlugAction.php new file mode 100644 index 0000000..41c38c3 --- /dev/null +++ b/app/Containers/InstituteStructure/Actions/FindFacultyBySlugAction.php @@ -0,0 +1,18 @@ +getFacultyBySlugTask->run($slug); + } +} diff --git a/app/Containers/InstituteStructure/Actions/ListFacultiesAction.php b/app/Containers/InstituteStructure/Actions/ListFacultiesAction.php new file mode 100644 index 0000000..4ee959f --- /dev/null +++ b/app/Containers/InstituteStructure/Actions/ListFacultiesAction.php @@ -0,0 +1,18 @@ +getActiveFacultiesTask->run(); + } +} diff --git a/app/Containers/InstituteStructure/Tasks/GetActiveDepartmentsByFacultyIdTask.php b/app/Containers/InstituteStructure/Tasks/GetActiveDepartmentsByFacultyIdTask.php new file mode 100644 index 0000000..dc9a3d2 --- /dev/null +++ b/app/Containers/InstituteStructure/Tasks/GetActiveDepartmentsByFacultyIdTask.php @@ -0,0 +1,28 @@ +value . 'active_' . $facultyId, + now()->addDay(), + function () use ($facultyId) { + return DepartmentPreviewResource::collection( + Department::query() + ->where('is_active', true) + ->where('faculty_id', $facultyId) + ->get() + ); + } + ); + } +} diff --git a/app/Containers/InstituteStructure/Tasks/GetActiveFacultiesTask.php b/app/Containers/InstituteStructure/Tasks/GetActiveFacultiesTask.php new file mode 100644 index 0000000..e21e0b2 --- /dev/null +++ b/app/Containers/InstituteStructure/Tasks/GetActiveFacultiesTask.php @@ -0,0 +1,27 @@ +value . 'active_list', + now()->addDay(), // Кешируем на 1 день + function () { + return FacultyPreviewResource::collection( + Faculty::query() + ->where('is_active', true) + ->get() + ); + } + ); + } +} diff --git a/app/Containers/InstituteStructure/Tasks/GetDepartmentBySlugTask.php b/app/Containers/InstituteStructure/Tasks/GetDepartmentBySlugTask.php new file mode 100644 index 0000000..8792dab --- /dev/null +++ b/app/Containers/InstituteStructure/Tasks/GetDepartmentBySlugTask.php @@ -0,0 +1,34 @@ +value . $cacheKey, + now()->addDay(), + function () use ($departmentSlug) { + return Department::query() + ->where('slug', $departmentSlug) + ->where('is_active', true) + ->with([ + 'faculty', + 'workers' => fn ($query) => $query->orderBy('sort', 'asc'), + 'teachers' => fn ($query) => $query->orderBy('sort', 'asc'), + 'programs' => fn ($query) => $query->orderBy('sort', 'asc'), + 'workers.userDetail', + 'teachers.userDetail', + 'programs.directionStudy', + 'seo' + ]) + ->firstOrFail(); + } + ); + } +} diff --git a/app/Containers/InstituteStructure/Tasks/GetFacultyBySlugOnlyTask.php b/app/Containers/InstituteStructure/Tasks/GetFacultyBySlugOnlyTask.php new file mode 100644 index 0000000..627ee29 --- /dev/null +++ b/app/Containers/InstituteStructure/Tasks/GetFacultyBySlugOnlyTask.php @@ -0,0 +1,23 @@ +value . $facultySlug, + now()->addDay(), + function () use ($facultySlug) { + return Faculty::query() + ->where('slug', $facultySlug) + ->firstOrFail(); + } + ); + } +} diff --git a/app/Containers/InstituteStructure/Tasks/GetFacultyBySlugTask.php b/app/Containers/InstituteStructure/Tasks/GetFacultyBySlugTask.php new file mode 100644 index 0000000..e4a67b1 --- /dev/null +++ b/app/Containers/InstituteStructure/Tasks/GetFacultyBySlugTask.php @@ -0,0 +1,28 @@ +value . $slug, + now()->addDay(), + function () use ($slug) { + return Faculty::where('slug', $slug) + ->where('is_active', true) + ->with(['departments.faculty', + 'workers' => fn ($query) => $query->orderBy('sort', 'asc'), + 'workers.userDetail', + 'seo' + ]) + ->firstOrFail(); + } + ); + } +} diff --git a/app/Containers/InstituteStructure/Tasks/GroupProgramsByDirectionTask.php b/app/Containers/InstituteStructure/Tasks/GroupProgramsByDirectionTask.php new file mode 100644 index 0000000..352e0b5 --- /dev/null +++ b/app/Containers/InstituteStructure/Tasks/GroupProgramsByDirectionTask.php @@ -0,0 +1,16 @@ +groupBy(function ($program) { + return $program->directionStudy->code . " " . $program->directionStudy->name; // Используем имя направления как ключ + }); + } +} diff --git a/app/Containers/InstituteStructure/UI/WEB/Controllers/ClientDepartmentController.php b/app/Containers/InstituteStructure/UI/WEB/Controllers/ClientDepartmentController.php index 3cd9a60..a2575f4 100644 --- a/app/Containers/InstituteStructure/UI/WEB/Controllers/ClientDepartmentController.php +++ b/app/Containers/InstituteStructure/UI/WEB/Controllers/ClientDepartmentController.php @@ -2,92 +2,29 @@ namespace App\Containers\InstituteStructure\UI\WEB\Controllers; -use App\Containers\InstituteStructure\Models\Department; -use App\Containers\InstituteStructure\Models\Faculty; -use App\Containers\InstituteStructure\UI\WEB\Transformers\DepartmentPreviewResource; +use App\Containers\InstituteStructure\Actions\FindDepartmentBySlugAction; use App\Containers\InstituteStructure\UI\WEB\Transformers\DepartmentResource; use App\Ship\Contracts\SeoServiceInterface; use App\Ship\Controllers\Controller; -use App\Ship\Enums\CacheKeys; -use Illuminate\Database\Eloquent\Collection; -use Illuminate\Support\Facades\Cache; use Inertia\Inertia; class ClientDepartmentController extends Controller { - public function __construct(readonly SeoServiceInterface $seoPageProvider){} + public function __construct( + readonly SeoServiceInterface $seoPageProvider, + private readonly FindDepartmentBySlugAction $findDepartmentBySlugAction + ) { + } - public function show(string $facultySlug, string $departmentSlug) + public function show(string $facultySlug, string $departmentSlug): \Inertia\Response { - // Ключ для кеширования - $cacheKey = "{$facultySlug}_{$departmentSlug}"; + $data = $this->findDepartmentBySlugAction->run($facultySlug, $departmentSlug); - // Кешируем факультет - $faculty = Cache::remember( - CacheKeys::FACULTY_PREFIX->value . $facultySlug, - now()->addDay(), - function () use ($facultySlug) { - return Faculty::query() - ->where('slug', $facultySlug) - ->first(); - } - ); - - - - // Кешируем список активных кафедр факультета - $departments = Cache::remember( - CacheKeys::DEPARTMENTS_PREFIX->value . 'active_' . $faculty->id, - now()->addDay(), - function () use ($faculty) { - return DepartmentPreviewResource::collection( - Department::query() - ->where('is_active', true) - ->where('faculty_id', $faculty->id) - ->get() - ); - } - ); - - $departmentModel = Cache::remember( - CacheKeys::DEPARTMENT_PREFIX->value . $cacheKey, - now()->addDay(), - function () use ($departmentSlug) { - return Department::query() - ->where('slug', $departmentSlug) - ->where('is_active', true) - ->with([ - 'faculty', - 'workers' => fn ($query) => $query->orderBy('sort', 'asc'), - 'teachers' => fn ($query) => $query->orderBy('sort', 'asc'), - 'programs' => fn ($query) => $query->orderBy('sort', 'asc'), - 'workers.userDetail', - 'teachers.userDetail', - 'programs.directionStudy', - 'seo' - ]) - ->firstOrFail(); - } - ); - - $seo = Cache::remember( - CacheKeys::DEPARTMENT_PREFIX->value . 'seo_' . $cacheKey, - now()->addDay(), - function () use ($departmentModel) { - return $this->seoPageProvider->getSeoForModel($departmentModel); - } - ); - - $department = new DepartmentResource($departmentModel); - - $directions = Cache::remember( - CacheKeys::DEPARTMENT_PREFIX->value . 'directions_' . $cacheKey, - now()->addDay(), - function () use ($department) { - return $this->groupProgramsByDirection($department->programs); - } - ); + $seo = $this->seoPageProvider->getSeoForModel($data['departmentModel']); + $department = $data['department']; + $departments = $data['departments']; + $directions = $data['directions']; return Inertia::render('Client/Departments/Show', compact( 'department', @@ -96,13 +33,4 @@ class ClientDepartmentController extends Controller 'seo', )); } - - - private function groupProgramsByDirection(Collection $programs): Collection - { - // Группируем программы по имени направления - return $programs->groupBy(function ($program) { - return $program->directionStudy->code . " " . $program->directionStudy->name; // Используем имя направления как ключ - }); - } } diff --git a/app/Containers/InstituteStructure/UI/WEB/Controllers/ClientFacultyController.php b/app/Containers/InstituteStructure/UI/WEB/Controllers/ClientFacultyController.php index a437b2c..6cfe0fa 100644 --- a/app/Containers/InstituteStructure/UI/WEB/Controllers/ClientFacultyController.php +++ b/app/Containers/InstituteStructure/UI/WEB/Controllers/ClientFacultyController.php @@ -2,85 +2,40 @@ namespace App\Containers\InstituteStructure\UI\WEB\Controllers; - -use App\Containers\InstituteStructure\Models\Faculty; -use App\Containers\InstituteStructure\UI\WEB\Transformers\FacultyPreviewResource; +use App\Containers\InstituteStructure\Actions\FindFacultyBySlugAction; +use App\Containers\InstituteStructure\Actions\ListFacultiesAction; use App\Containers\InstituteStructure\UI\WEB\Transformers\FacultyResource; use App\Ship\Contracts\SeoServiceInterface; use App\Ship\Controllers\Controller; -use App\Ship\Enums\CacheKeys; -use Illuminate\Http\Request; -use Illuminate\Support\Facades\Cache; use Inertia\Inertia; - class ClientFacultyController extends Controller { - public function __construct(readonly SeoServiceInterface $seoPageProvider){} + public function __construct( + readonly SeoServiceInterface $seoPageProvider, + private readonly ListFacultiesAction $listFacultiesAction, + private readonly FindFacultyBySlugAction $findFacultyBySlugAction + ) { + } - - public function index(Request $request) + public function index(): \Inertia\Response { - $faculties = Cache::remember( - CacheKeys::FACULTIES_PREFIX->value . 'active_list', - now()->addDay(), // Кешируем на 1 день - function () { - return FacultyPreviewResource::collection( - Faculty::query() - ->where('is_active', true) - ->get() - ); - } - ); + $faculties = $this->listFacultiesAction->run(); $seo = $this->seoPageProvider->getSeoForCurrentPage(); return Inertia::render('Client/Faculties/Index', compact('faculties', 'seo')); } - - public function show(string $slug) + public function show(string $slug): \Inertia\Response { - // Кешируем список факультетов - $faculties = Cache::remember( - CacheKeys::FACULTIES_PREFIX->value . 'active_list', - now()->addDay(), - function () { - return FacultyPreviewResource::collection( - Faculty::query() - ->where('is_active', true) - ->get() - ); - } - ); + $faculties = $this->listFacultiesAction->run(); - // Кешируем данные конкретного факультета - $faculty = Cache::remember( - CacheKeys::FACULTY_PREFIX->value . $slug, - now()->addDay(), - function () use ($slug) { - return Faculty::where('slug', $slug) - ->where('is_active', true) - ->with(['departments.faculty', - 'workers' => fn ($query) => $query->orderBy('sort', 'asc'), - 'workers.userDetail', - 'seo' - ]) - ->firstOrFail(); - } - ); - - $seo = Cache::remember( - CacheKeys::FACULTY_PREFIX->value . "SEO_" . $slug, - now()->addDay(), - function () use ($faculty) { - return $this->seoPageProvider->getSeoForModel($faculty); - } - ); - - $faculty = new FacultyResource($faculty); + $facultyData = $this->findFacultyBySlugAction->run($slug); + $seo = $this->seoPageProvider->getSeoForModel($facultyData); + $faculty = new FacultyResource($facultyData); return Inertia::render('Client/Faculties/Show', compact('faculty', 'faculties', 'seo')); }