From bf21022eda7f3b944909e1ff129c148d0f7ccfe6 Mon Sep 17 00:00:00 2001 From: F4ilji Date: Mon, 7 Apr 2025 20:37:22 +0500 Subject: [PATCH] add clear cache to edu programs, fix relationships bugs --- app/Enums/BudgetEducation.php | 4 +- app/Enums/CacheKeys.php | 3 ++ .../ClientAdditionalEducationController.php | 7 +-- .../Controllers/ClientProgramController.php | 15 ++---- app/Observers/AdmissionCampaignObserver.php | 49 +++++++++++++++++++ app/Providers/AppServiceProvider.php | 9 ++++ .../Cache/AdmissionCampaignCacheService.php | 41 ++++++++++++++++ resources/js/Enum/BudgetEducation.js | 21 ++++++++ resources/js/Enum/EducationForm.js | 2 +- resources/js/Pages/Client/Programs/Index.vue | 4 +- resources/js/Pages/Client/Programs/Show.vue | 11 +++-- 11 files changed, 143 insertions(+), 23 deletions(-) create mode 100644 app/Observers/AdmissionCampaignObserver.php create mode 100644 app/Services/App/Cache/AdmissionCampaignCacheService.php create mode 100644 resources/js/Enum/BudgetEducation.js diff --git a/app/Enums/BudgetEducation.php b/app/Enums/BudgetEducation.php index e31bcdf..214e442 100644 --- a/app/Enums/BudgetEducation.php +++ b/app/Enums/BudgetEducation.php @@ -7,8 +7,8 @@ use Filament\Support\Contracts\HasColor; enum BudgetEducation: int implements HasLabel, HasColor { - case budget_quantity_position = 1; // Очная форма обучения - case non_budget_quantity_position = 2; // Заочная форма обучения + case budget_quantity_position = 1; + case non_budget_quantity_position = 2; public static function fromName(string $name): ?self { return match ($name) { diff --git a/app/Enums/CacheKeys.php b/app/Enums/CacheKeys.php index 46c590d..ba5ed26 100644 --- a/app/Enums/CacheKeys.php +++ b/app/Enums/CacheKeys.php @@ -8,6 +8,9 @@ enum CacheKeys: string { case RECENT_POSTS_PREFIX = 'recent_posts_'; case POSTS_PREFIX = 'posts_'; case EDUCATION_PROGRAM_PREFIX = 'education_program_'; + case ADMISSION_CAMPAIGNS_PREFIX = 'admission_campaigns_'; + case DIRECTION_STUDIES = 'direction_studies_'; + case ADMISSION_PLANS = 'admission_plans_'; case EDUCATION_PROGRAMS_PREFIX = 'education_programs_'; case ADDITIONAL_EDUCATIONAL_PROGRAM_PREFIX = 'additional_education_program_'; case ADDITIONAL_EDUCATIONAL_PROGRAMS_PREFIX = 'additional_education_programs_'; diff --git a/app/Http/Controllers/ClientAdditionalEducationController.php b/app/Http/Controllers/ClientAdditionalEducationController.php index 749f53d..7d5a6fb 100644 --- a/app/Http/Controllers/ClientAdditionalEducationController.php +++ b/app/Http/Controllers/ClientAdditionalEducationController.php @@ -28,11 +28,7 @@ class ClientAdditionalEducationController extends Controller public function index(Request $request): \Inertia\Response { - $cacheKey = md5(serialize([ - 'direction' => $request->input('direction'), - 'form' => $request->input('form'), - 'category' => $request->input('category'), - ])); + $cacheKey = md5(serialize($request->all())); // Основные данные (кешируются) $directionAdditionalEducations = Cache::remember( @@ -53,6 +49,7 @@ class ClientAdditionalEducationController extends Controller now()->addDay(), function () use ($request) { $query = AdditionalEducationCategory::query() + ->has('additionalEducations') ->WithActivePrograms() ->where('is_active', true) ->when($request->direction, function ($q, $direction) use ($request) { diff --git a/app/Http/Controllers/ClientProgramController.php b/app/Http/Controllers/ClientProgramController.php index 034e37c..362bddb 100644 --- a/app/Http/Controllers/ClientProgramController.php +++ b/app/Http/Controllers/ClientProgramController.php @@ -6,21 +6,14 @@ use App\Enums\BudgetEducation; use App\Enums\CacheKeys; use App\Enums\FormEducation; use App\Enums\LevelEducational; -use App\Http\Resources\CampaignDegreeResource; -use App\Http\Resources\ClientNavigationResource; use App\Http\Resources\DirectionStudyResource; use App\Http\Resources\EducationalProgramFullResource; -use App\Http\Resources\MainSectionResource; use App\Models\AdmissionCampaign; -use App\Models\AdmissionPlan; -use App\Models\CampaignDegree; use App\Models\DirectionStudy; use App\Models\EducationalProgram; -use App\Models\MainSection; use App\Services\App\Seo\SeoPageProvider; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; -use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; use Inertia\Inertia; @@ -36,7 +29,7 @@ class ClientProgramController extends Controller $cacheKeyBudgets = 'education_budgets_list'; $cacheKeySeo = 'education_programs_seo'; - $activeCampaign = Cache::remember('active_admission_campaign', now()->addDay(), function () { + $activeCampaign = Cache::remember(CacheKeys::ADMISSION_CAMPAIGNS_PREFIX->value, now()->addDay(), function () { return AdmissionCampaign::where('status', 1)->first(); }); @@ -58,13 +51,14 @@ class ClientProgramController extends Controller $seo = Cache::remember($cacheKeySeo, now()->addDay(), function () { return $this->seoPageProvider->getSeoForCurrentPage(); }); + ; - $naprs = Cache::remember($cacheKey, now()->addHours(1), function () use ($request, $activeCampaign) { + $naprs = Cache::remember($cacheKey, now()->addHours(), function () use ($request, $activeCampaign) { return DirectionStudyResource::collection( DirectionStudy::query() ->withAdmissionCampaignByYear($activeCampaign->academic_year) ->withActivePrograms() - ->with('programs.admission_plans') +// ->with('programs.admission_plans') ->when($request->input('level'), fn($q, $level) => $q->where('lvl_edu', LevelEducational::fromName($level)->value)) ->when($request->input('form'), fn($q, $form) => @@ -77,6 +71,7 @@ class ClientProgramController extends Controller ); }); + $data = [ 'naprs' => $naprs, 'campaignName' => $this->getAdmissionCampaignName(), diff --git a/app/Observers/AdmissionCampaignObserver.php b/app/Observers/AdmissionCampaignObserver.php new file mode 100644 index 0000000..08d5041 --- /dev/null +++ b/app/Observers/AdmissionCampaignObserver.php @@ -0,0 +1,49 @@ +admissionCampaignCacheService->clearAllCacheByModel(); + } + + /** + * Handle the Post "updated" event. + */ + public function updated() + { + $this->admissionCampaignCacheService->clearAllCacheByModel(); + } + + /** + * Очистка кеша при удалении поста. + */ + public function deleted() + { + $this->admissionCampaignCacheService->clearAllCacheByModel(); + } + + /** + * Handle the Post "restored" event. + */ + public function restored(): void + { + // + } + + /** + * Handle the Post "force deleted" event. + */ + public function forceDeleted(): void + { + // + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 5e56104..2fdd20c 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -4,8 +4,11 @@ namespace App\Providers; use App\Models\AcademicJournal; use App\Models\AdditionalEducation; +use App\Models\AdmissionCampaign; +use App\Models\AdmissionPlan; use App\Models\ContactWidget; use App\Models\Department; +use App\Models\DirectionStudy; use App\Models\Division; use App\Models\EducationalProgram; use App\Models\Event; @@ -21,8 +24,11 @@ use App\Models\SubSection; use App\Models\User; use App\Observers\AcademicJournalObserver; use App\Observers\AdditionalEducationObserver; +use App\Observers\AdmissionCampaignObserver; +use App\Observers\AdmissionPlanObserver; use App\Observers\ContactWidgetObserver; use App\Observers\DepartmentObserver; +use App\Observers\DirectionStudyObserver; use App\Observers\DivisionObserver; use App\Observers\EducationalProgramObserver; use App\Observers\EventObserver; @@ -93,6 +99,9 @@ class AppServiceProvider extends ServiceProvider Schedule::observe(ScheduleObserver::class); ContactWidget::observe(ContactWidgetObserver::class); PageReferenceList::observe(PageReferenceListObserver::class); + AdmissionPlan::observe(AdmissionCampaignObserver::class); + AdmissionCampaign::observe(AdmissionCampaignObserver::class); + DirectionStudy::observe(AdmissionCampaignObserver::class); } private static function setLocaleTime() : void { diff --git a/app/Services/App/Cache/AdmissionCampaignCacheService.php b/app/Services/App/Cache/AdmissionCampaignCacheService.php new file mode 100644 index 0000000..13e4063 --- /dev/null +++ b/app/Services/App/Cache/AdmissionCampaignCacheService.php @@ -0,0 +1,41 @@ +clearCacheByPrefix(CacheKeys::ADMISSION_CAMPAIGNS_PREFIX->value.'*'); + $this->clearCacheByPrefix(CacheKeys::DIRECTION_STUDIES->value.'*'); + $this->clearCacheByPrefix(CacheKeys::ADMISSION_PLANS->value.'*'); + $this->clearCacheByPrefix(CacheKeys::EDUCATION_PROGRAM_PREFIX->value.'*'); + $this->clearCacheByPrefix('education_'.'*'); + } + + public function getCachedData(string $key) + { + return Cache::get($key); + } + + public function cacheData(string $key, $data, int $ttl = null): void + { + Cache::put($key, $data, $ttl ?? self::DEFAULT_TTL); + } +} \ No newline at end of file diff --git a/resources/js/Enum/BudgetEducation.js b/resources/js/Enum/BudgetEducation.js new file mode 100644 index 0000000..d7b9300 --- /dev/null +++ b/resources/js/Enum/BudgetEducation.js @@ -0,0 +1,21 @@ +class EducationForm { + static BUDGET_QUANTITY_POSITION = { value: 1, label: 'Бюджетные места', color: 'info', name: 'BUDGET_QUANTITY_POSITION' }; + static NON_BUDGET_QUANTITY_POSITION = { value: 2, label: 'С оплатой обучения', color: 'primary', name: 'NON_BUDGET_QUANTITY_POSITION' }; + + // Метод для получения статуса по имени + static fromName(name) { + return this[name] || null; + } + + static fromValue(value) { + return Object.values(this).find(item => item.value == value) || null; + } + + + // Метод для получения имени + getName() { + return this.name; + } +} + +export default EducationForm; \ No newline at end of file diff --git a/resources/js/Enum/EducationForm.js b/resources/js/Enum/EducationForm.js index 85d8f3d..7e2227d 100644 --- a/resources/js/Enum/EducationForm.js +++ b/resources/js/Enum/EducationForm.js @@ -9,7 +9,7 @@ class EducationForm { } static fromValue(value) { - return Object.values(this).find(item => item.value === value) || null; + return Object.values(this).find(item => item.value == value) || null; } diff --git a/resources/js/Pages/Client/Programs/Index.vue b/resources/js/Pages/Client/Programs/Index.vue index 6d289ef..b0e3798 100644 --- a/resources/js/Pages/Client/Programs/Index.vue +++ b/resources/js/Pages/Client/Programs/Index.vue @@ -102,9 +102,9 @@ export default {
- + - +
diff --git a/resources/js/Pages/Client/Programs/Show.vue b/resources/js/Pages/Client/Programs/Show.vue index ed224d0..5c81335 100644 --- a/resources/js/Pages/Client/Programs/Show.vue +++ b/resources/js/Pages/Client/Programs/Show.vue @@ -9,6 +9,7 @@ import MetaTags from "@/componentss/shared/SEO/MetaTags.vue"; import BasicTitle from "@/componentss/ui/titles/BasicTitle.vue"; import ProgramItemBreadcrumbs from "@/componentss/features/educationalPrograms/components/ProgramItemBreadcrumbs.vue"; import ProgramTitle from "@/componentss/features/educationalPrograms/components/ProgramTitle.vue"; +import BudgetEducation from "@/Enum/BudgetEducation.js"; export default { @@ -16,6 +17,9 @@ export default { computed: { EducationForm() { return EducationForm + }, + BudgetForm() { + return BudgetEducation } }, components: { @@ -112,9 +116,10 @@ export default {