diff --git a/app/Containers/Science/Actions/GetAcademicJournalAction.php b/app/Containers/Science/Actions/GetAcademicJournalAction.php new file mode 100644 index 0000000..30ef16c --- /dev/null +++ b/app/Containers/Science/Actions/GetAcademicJournalAction.php @@ -0,0 +1,37 @@ +findAcademicJournalBySlugTask->run($slug); + + $seo = $this->seoService->getSeoForModel($journalData); + $groupedIssues = $this->getAcademicJournalIssuesGroupedByYearTask->run($journalData->id); + + return [ + 'journalData' => $journalData, + 'seo' => $seo, + 'groupedIssues' => $groupedIssues, + ]; + } +} diff --git a/app/Containers/Science/Actions/GetAllAcademicJournalsAction.php b/app/Containers/Science/Actions/GetAllAcademicJournalsAction.php new file mode 100644 index 0000000..9329eb0 --- /dev/null +++ b/app/Containers/Science/Actions/GetAllAcademicJournalsAction.php @@ -0,0 +1,27 @@ +getAllAcademicJournalsTask->run(); + $seo = $this->seoService->getSeoForCurrentPage(); + + return [ + 'journals' => AcademicJournalResource::collection($journals), + 'seo' => $seo, + ]; + } +} diff --git a/app/Containers/Science/Tasks/FindAcademicJournalBySlugTask.php b/app/Containers/Science/Tasks/FindAcademicJournalBySlugTask.php new file mode 100644 index 0000000..08ede7c --- /dev/null +++ b/app/Containers/Science/Tasks/FindAcademicJournalBySlugTask.php @@ -0,0 +1,23 @@ +value . $slug, + now()->addWeek(), + function () use ($slug) { + return AcademicJournal::query() + ->where('slug', $slug) + ->firstOrFail(); + } + ); + } +} diff --git a/app/Containers/Science/Tasks/GetAcademicJournalIssuesGroupedByYearTask.php b/app/Containers/Science/Tasks/GetAcademicJournalIssuesGroupedByYearTask.php new file mode 100644 index 0000000..3a74143 --- /dev/null +++ b/app/Containers/Science/Tasks/GetAcademicJournalIssuesGroupedByYearTask.php @@ -0,0 +1,34 @@ +value . 'issues_' . $academicJournalId, + now()->addWeek(), + function () use ($academicJournalId) { + $journalIssues = JournalIssue::where('academic_journal_id', $academicJournalId) + ->get() + ->groupBy('year_publication'); + + $groupedIssues = []; + foreach ($journalIssues as $year => $journalGroup) { + $groupedIssues[] = [ + 'year_publication' => $year, + 'journalIssues' => $journalGroup + ]; + } + + return $groupedIssues; + } + ); + } +} diff --git a/app/Containers/Science/Tasks/GetAllAcademicJournalsTask.php b/app/Containers/Science/Tasks/GetAllAcademicJournalsTask.php new file mode 100644 index 0000000..fe57eb7 --- /dev/null +++ b/app/Containers/Science/Tasks/GetAllAcademicJournalsTask.php @@ -0,0 +1,22 @@ +value . 'list', + now()->addWeek(), + function () { + return AcademicJournal::query()->get(); + } + ); + } +} diff --git a/app/Containers/Science/UI/WEB/Controllers/ClientAcademicJournalController.php b/app/Containers/Science/UI/WEB/Controllers/ClientAcademicJournalController.php index c90e098..1679f85 100644 --- a/app/Containers/Science/UI/WEB/Controllers/ClientAcademicJournalController.php +++ b/app/Containers/Science/UI/WEB/Controllers/ClientAcademicJournalController.php @@ -2,6 +2,8 @@ namespace App\Containers\Science\UI\WEB\Controllers; +use App\Containers\Science\Actions\GetAllAcademicJournalsAction; +use App\Containers\Science\Actions\GetAcademicJournalAction; use App\Containers\Science\Models\AcademicJournal; use App\Containers\Science\Models\JournalIssue; use App\Containers\Science\UI\WEB\Transformers\AcademicJournalResource; @@ -13,71 +15,32 @@ use Inertia\Inertia; class ClientAcademicJournalController extends Controller { - public function __construct(readonly SeoServiceInterface $seoPageProvider){} + public function __construct( + readonly SeoServiceInterface $seoPageProvider, + private readonly GetAllAcademicJournalsAction $getAllAcademicJournalsAction, + private readonly GetAcademicJournalAction $getAcademicJournalAction + ){} public function index(): \Inertia\Response { - $journals = Cache::remember( - CacheKeys::ACADEMIC_JOURNALS_PREFIX->value . 'list', - now()->addWeek(), - function () { - return AcademicJournalResource::collection( - AcademicJournal::query()->get() - ); - } - ); + $result = $this->getAllAcademicJournalsAction->run(); - $seo = $this->seoPageProvider->getSeoForCurrentPage(); - - return Inertia::render('Client/AcademicJournals/Index', compact('journals', 'seo')); + return Inertia::render('Client/AcademicJournals/Index', [ + 'journals' => $result['journals'], + 'seo' => $result['seo'], + ]); } public function show(string $slug): \Inertia\Response { - $journalData = Cache::remember( - CacheKeys::ACADEMIC_JOURNAL_PREFIX->value . $slug, - now()->addWeek(), - function () use ($slug) { - return AcademicJournal::query() - ->where('slug', $slug) - ->firstOrFail(); - } - ); + $result = $this->getAcademicJournalAction->run($slug); - $seo = Cache::remember( - CacheKeys::ACADEMIC_JOURNAL_PREFIX->value . 'seo_' . $slug, - now()->addWeek(), - function () use ($journalData) { - return $this->seoPageProvider->getSeoForModel($journalData); - } - ); + $journal = new AcademicJournalResource($result['journalData']); - $journal = new AcademicJournalResource($journalData); - - - - // Кешируем выпуски журнала, сгруппированные по годам - $journals = Cache::remember( - CacheKeys::ACADEMIC_JOURNAL_PREFIX->value . 'issues_' . $slug, - now()->addWeek(), - function () use ($journal) { - $journalIssues = JournalIssue::where('academic_journal_id', $journal->id) - ->get() - ->groupBy('year_publication'); - - $groupedIssues = []; - foreach ($journalIssues as $year => $journalGroup) { - $groupedIssues[] = [ - 'year_publication' => $year, - 'journalIssues' => $journalGroup - ]; - } - - return $groupedIssues; - } - ); - - - return Inertia::render('Client/AcademicJournals/Show', compact('journal', 'journals', 'seo')); + return Inertia::render('Client/AcademicJournals/Show', [ + 'journal' => $journal, + 'journals' => $result['groupedIssues'], + 'seo' => $result['seo'], + ]); } }