Migrate backend to Porto architecture and fix minor bugs

- Fully transitioned the backend to the Porto architectural pattern
- Improved code organization and maintainability
- Fixed minor bugs and inconsistencies
This commit is contained in:
F4ilji
2025-05-12 08:47:43 +05:00
parent 76deaf75f3
commit c01016a154
620 changed files with 16218 additions and 6073 deletions
+60
View File
@@ -0,0 +1,60 @@
<?php
namespace App\Ship\Enums;
enum CacheKeys: string {
case USER_PREFIX = 'person_';
case POST_PREFIX = 'post_';
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_';
case ACADEMIC_JOURNAL_PREFIX = 'academic_journal_';
case ACADEMIC_JOURNALS_PREFIX = 'academic_journals_';
case CATEGORIES_PREFIX = 'categories_';
case CONTACT_WIDGET_PREFIX = 'contact_widget_';
case CONTACT_WIDGETS_PREFIX = 'contact_widgets_';
// Department
case DEPARTMENT_PREFIX = 'department_';
case DEPARTMENTS_PREFIX = 'departments_';
// Division
case DIVISION_PREFIX = 'division_';
case DIVISIONS_PREFIX = 'divisions_';
// Event
case EVENT_PREFIX = 'event_';
case EVENTS_PREFIX = 'events_';
// Faculty
case FACULTY_PREFIX = 'faculty_';
case FACULTIES_PREFIX = 'faculties_';
// Navigation
case NAVIGATION_PREFIX = 'navigation';
// Page
case PAGE_PREFIX = 'page_';
case PAGE_DATA_PREFIX = 'page_data_';
case PAGE_REFERENCE_LIST_PREFIX = 'page_reference_list_';
case PAGE_REFERENCE_LISTS_PREFIX = 'page_reference_lists_';
// Schedule
case SCHEDULE_PREFIX = 'schedule_';
case SCHEDULES_PREFIX = 'schedules_';
// Slider
case SLIDER_PREFIX = 'slider_';
// Tag
case TAG_IDS_PREFIX = 'tag_ids_';
case TAGS_PREFIX = 'tags_';
case TAG_CONTENT_PREFIX = 'tag_content_';
}
@@ -0,0 +1,31 @@
<?php
namespace App\Ship\Enums\Education;
use Filament\Support\Contracts\HasLabel;
use Filament\Support\Contracts\HasColor;
enum AdmissionCampaignStatus: int implements HasLabel, HasColor
{
case ACTIVE = 1;
case ARCHIVED = 2;
case HIDDEN = 3;
public function getLabel(): ?string
{
return match ($this) {
self::ACTIVE => 'Активная',
self::ARCHIVED => 'Архивная',
self::HIDDEN => 'Скрытая',
};
}
public function getColor(): string|array|null
{
return match ($this) {
self::ACTIVE => 'success',
self::ARCHIVED => 'gray',
self::HIDDEN => 'danger',
};
}
}
@@ -0,0 +1,72 @@
<?php
namespace App\Ship\Enums\Education;
use Filament\Support\Contracts\HasLabel;
use Filament\Support\Contracts\HasColor;
enum BudgetEducation: int implements HasLabel, HasColor
{
case MAIN_QUOTA = 1;
case TARGET_QUOTA = 2;
case SPECIAL_QUOTA = 3;
case PAID_EDUCATION = 4;
case OTHER_SOURCES = 5;
case SEPARATE_QUOTA = 6;
case COMBINED_QUOTA_ALL = 7;
case COMBINED_QUOTA_TARGET_SPECIAL = 8;
case COMBINED_QUOTA_TARGET_SEPARATE = 9;
case COMBINED_QUOTA_SPECIAL_SEPARATE = 10;
case DETAILED_TARGET_QUOTA = 11;
public static function fromName(string $name): ?self {
return match ($name) {
'MAIN_QUOTA' => self::MAIN_QUOTA,
'TARGET_QUOTA' => self::TARGET_QUOTA,
'SPECIAL_QUOTA' => self::SPECIAL_QUOTA,
'PAID_EDUCATION' => self::PAID_EDUCATION,
'OTHER_SOURCES' => self::OTHER_SOURCES,
'SEPARATE_QUOTA' => self::SEPARATE_QUOTA,
'COMBINED_QUOTA_ALL' => self::COMBINED_QUOTA_ALL,
'COMBINED_QUOTA_TARGET_SPECIAL' => self::COMBINED_QUOTA_TARGET_SPECIAL,
'COMBINED_QUOTA_TARGET_SEPARATE' => self::COMBINED_QUOTA_TARGET_SEPARATE,
'COMBINED_QUOTA_SPECIAL_SEPARATE' => self::COMBINED_QUOTA_SPECIAL_SEPARATE,
'DETAILED_TARGET_QUOTA' => self::DETAILED_TARGET_QUOTA,
default => null,
};
}
public function getLabel(): ?string
{
return match ($this) {
self::MAIN_QUOTA => 'Основные места',
self::TARGET_QUOTA => 'Целевая квота',
self::SPECIAL_QUOTA => 'Особая квота',
self::PAID_EDUCATION => 'С оплатой обучения',
self::OTHER_SOURCES => 'За счёт иных средств',
self::SEPARATE_QUOTA => 'Отдельная квота',
self::COMBINED_QUOTA_ALL => 'Совмещенная квота (целевая, особая и отдельная квоты)',
self::COMBINED_QUOTA_TARGET_SPECIAL => 'Совмещенная квота (целевая и особая квоты)',
self::COMBINED_QUOTA_TARGET_SEPARATE => 'Совмещенная квота (целевая и отдельная квоты)',
self::COMBINED_QUOTA_SPECIAL_SEPARATE => 'Совмещенная квота (особая и отдельная квоты)',
self::DETAILED_TARGET_QUOTA => 'Детализированная целевая квота',
};
}
public function getColor(): string|array|null
{
return match ($this) {
self::MAIN_QUOTA => 'primary',
self::TARGET_QUOTA => 'info',
self::SPECIAL_QUOTA => 'danger',
self::PAID_EDUCATION => 'warning',
self::OTHER_SOURCES => 'gray',
self::SEPARATE_QUOTA => 'success',
self::COMBINED_QUOTA_ALL => 'indigo',
self::COMBINED_QUOTA_TARGET_SPECIAL => 'violet',
self::COMBINED_QUOTA_TARGET_SEPARATE => 'fuchsia',
self::COMBINED_QUOTA_SPECIAL_SEPARATE => 'pink',
self::DETAILED_TARGET_QUOTA => 'amber',
};
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Ship\Enums\Education;
use Filament\Support\Contracts\HasLabel;
use Filament\Support\Contracts\HasColor;
enum EducationalProgramStatus: int implements HasLabel, HasColor
{
case PUBLISHED = 1; // Опубликована. Отображается в публичной части сайта
case IN_PROGRESS = 2; // На стадии заполнения. Отображается только в редакторе
case ARCHIVED = 3; // Архивная. Отображается только в разделе Абитуриенту и в таблице сведений о трудоустройстве выпускников
case REFERENCE = 4; // Справочная. Отображается только в разделе "Образование" и других
case NOT_IMPLEMENTED = 5; // Не реализуется. Отображается только в справочнике образовательных программ
case LICENSE_PENDING = 6; // Представлена к лицензированию. Отображается только в разделе "Образование"
public function getLabel(): ?string
{
return match ($this) {
self::PUBLISHED => 'Опубликована. Отображается в публичной части сайта',
self::IN_PROGRESS => 'На стадии заполнения. Отображается только в редакторе',
self::ARCHIVED => 'Архивная. Отображается только в разделе Абитуриенту и в таблице сведений о трудоустройстве выпускников',
self::REFERENCE => 'Справочная. Отображается только в разделе "Образование" и других',
self::NOT_IMPLEMENTED => 'Не реализуется. Отображается только в справочнике образовательных программ',
self::LICENSE_PENDING => 'Представлена к лицензированию. Отображается только в разделе "Образование"',
};
}
public function getColor(): string|array|null
{
return match ($this) {
self::PUBLISHED => 'success',
self::IN_PROGRESS => 'warning',
self::ARCHIVED => 'secondary',
self::REFERENCE => 'info',
self::NOT_IMPLEMENTED => 'danger',
self::LICENSE_PENDING => 'primary',
};
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Ship\Enums\Education;
use Filament\Support\Contracts\HasLabel;
use Filament\Support\Contracts\HasColor;
enum FormEducation: int implements HasLabel, HasColor
{
case FULL_TIME = 1; // Очная форма обучения
case FULL_PART_TIME = 2; // Заочная форма обучения
case PART_TIME = 3; // Заочная форма обучения
public static function fromName(string $name): ?self {
return match ($name) {
'FULL_TIME' => self::FULL_TIME,
'FULL_PART_TIME' => self::FULL_PART_TIME,
'PART_TIME' => self::PART_TIME,
default => null,
};
}
public function getLabel(): ?string
{
return match ($this) {
self::FULL_TIME => 'Очная форма обучения',
self::FULL_PART_TIME => 'Очно-заочная форма обучения',
self::PART_TIME => 'Заочная форма обучения',
};
}
public function getColor(): string|array|null
{
return match ($this) {
self::FULL_TIME => 'success', // Цвет для очной формы
self::PART_TIME => 'warning', // Цвет для заочной формы
self::FULL_PART_TIME => 'info',
};
}
}
@@ -0,0 +1,128 @@
<?php
namespace App\Ship\Enums\Education;
use Filament\Support\Contracts\HasLabel;
use Filament\Support\Contracts\HasColor;
enum LevelEducational: int implements HasLabel, HasColor
{
case PREPARATION_OF_QUALIFIED_WORKERS = 1; // Подготовка квалифицированных рабочих, служащих
case MIDDLE_LEVEL_SPECIALIST_TRAINING = 2; // Программа подготовки специалистов среднего звена
case BACHELOR = 3; // Бакалавриат
case MASTER = 4; // Магистратура
case SPECIALIST = 5; // Специалитет
case POSTGRADUATE = 6; // Аспирантура
case ADJUNCTURE = 7; // Адъюнктура
case RESIDENCY = 8; // Ординатура
case INTERNSHIP = 9; // Ассистентура - стажировка
case PROFESSIONAL_TRAINING = 10; // Профессиональная подготовка по профессиям рабочих, должностям служащих
case RETRAINING = 11; // Переподготовка рабочих, служащих
case ADVANCED_TRAINING = 12; // Повышение квалификации рабочих, служащих
case ADDITIONAL_GENERAL_DEVELOPMENT_PROGRAM = 13; // Дополнительная общеразвивающая программа
case ADDITIONAL_PREPROFESSIONAL_PROGRAM = 14; // Дополнительная предпрофессиональная программа
case ADDITIONAL_PREPROFESSIONAL_ART_PROGRAM = 15; // Дополнительная предпрофессиональная программа в сфере искусств
case PROFESSIONAL_ADVANCEMENT = 16; // Повышение квалификации
case PROFESSIONAL_RETRAINING = 17; // Профессиональная переподготовка
case PRESCHOOL_EDUCATION = 18; // Дошкольное образование
case PRIMARY_GENERAL_EDUCATION = 19; // Начальное общее образование
case BASIC_GENERAL_EDUCATION = 20; // Основное общее образование
case SECONDARY_GENERAL_EDUCATION = 21; // Среднее общее образование
case INTERNSHIP_PROGRAM = 22; // Интернатура
case ADDITIONAL_PREPROFESSIONAL_SPORT_PROGRAM = 23; // Дополнительная предпрофессиональная программа в сфере физической культуры и спорта
case BASIC_HIGHER_EDUCATION = 24; // Базовое высшее образование
case SPECIALIZED_HIGHER_EDUCATION = 25; // Специализированное высшее образование
public static function fromName(string $name): ?self {
return match ($name) {
'PREPARATION_OF_QUALIFIED_WORKERS' => self::PREPARATION_OF_QUALIFIED_WORKERS,
'MIDDLE_LEVEL_SPECIALIST_TRAINING' => self::MIDDLE_LEVEL_SPECIALIST_TRAINING,
'BACHELOR' => self::BACHELOR,
'MASTER' => self::MASTER,
'SPECIALIST' => self::SPECIALIST,
'POSTGRADUATE' => self::POSTGRADUATE,
'ADJUNCTURE' => self::ADJUNCTURE,
'RESIDENCY' => self::RESIDENCY,
'INTERNSHIP' => self::INTERNSHIP,
'PROFESSIONAL_TRAINING' => self::PROFESSIONAL_TRAINING,
'RETRAINING' => self::RETRAINING,
'ADVANCED_TRAINING' => self::ADVANCED_TRAINING,
'ADDITIONAL_GENERAL_DEVELOPMENT_PROGRAM' => self::ADDITIONAL_GENERAL_DEVELOPMENT_PROGRAM,
'ADDITIONAL_PREPROFESSIONAL_PROGRAM' => self::ADDITIONAL_PREPROFESSIONAL_PROGRAM,
'ADDITIONAL_PREPROFESSIONAL_ART_PROGRAM' => self::ADDITIONAL_PREPROFESSIONAL_ART_PROGRAM,
'PROFESSIONAL_ADVANCEMENT' => self::PROFESSIONAL_ADVANCEMENT,
'PROFESSIONAL_RETRAINING' => self::PROFESSIONAL_RETRAINING,
'PRESCHOOL_EDUCATION' => self::PRESCHOOL_EDUCATION,
'PRIMARY_GENERAL_EDUCATION' => self::PRIMARY_GENERAL_EDUCATION,
'BASIC_GENERAL_EDUCATION' => self::BASIC_GENERAL_EDUCATION,
'SECONDARY_GENERAL_EDUCATION' => self::SECONDARY_GENERAL_EDUCATION,
'INTERNSHIP_PROGRAM' => self::INTERNSHIP_PROGRAM,
'ADDITIONAL_PREPROFESSIONAL_SPORT_PROGRAM' => self::ADDITIONAL_PREPROFESSIONAL_SPORT_PROGRAM,
'BASIC_HIGHER_EDUCATION' => self::BASIC_HIGHER_EDUCATION,
'SPECIALIZED_HIGHER_EDUCATION' => self::SPECIALIZED_HIGHER_EDUCATION,
default => null,
};
}
public function getLabel(): ?string
{
return match ($this) {
self::PREPARATION_OF_QUALIFIED_WORKERS => 'Подготовка квалифицированных рабочих, служащих',
self::MIDDLE_LEVEL_SPECIALIST_TRAINING => 'Среднее профессиональное образование',
self::BACHELOR => 'Бакалавриат',
self::MASTER => 'Магистратура',
self::SPECIALIST => 'Специалитет',
self::POSTGRADUATE => 'Аспирантура',
self::ADJUNCTURE => 'Адъюнктура',
self::RESIDENCY => 'Ординатура',
self::INTERNSHIP => 'Ассистентура - стажировка',
self::PROFESSIONAL_TRAINING => 'Профессиональная подготовка по профессиям рабочих, должностям служащих',
self::RETRAINING => 'Переподготовка рабочих, служащих',
self::ADVANCED_TRAINING => 'Повышение квалификации рабочих, служащих',
self::ADDITIONAL_GENERAL_DEVELOPMENT_PROGRAM => 'Дополнительная общеразвивающая программа',
self::ADDITIONAL_PREPROFESSIONAL_PROGRAM => 'Дополнительная предпрофессиональная программа',
self::ADDITIONAL_PREPROFESSIONAL_ART_PROGRAM => 'Дополнительная предпрофессиональная программа в сфере искусств',
self::PROFESSIONAL_ADVANCEMENT => 'Повышение квалификации',
self::PROFESSIONAL_RETRAINING => 'Профессиональная переподготовка',
self::PRESCHOOL_EDUCATION => 'Дошкольное образование',
self::PRIMARY_GENERAL_EDUCATION => 'Начальное общее образование',
self::BASIC_GENERAL_EDUCATION => 'Основное общее образование',
self::SECONDARY_GENERAL_EDUCATION => 'Среднее общее образование',
self::INTERNSHIP_PROGRAM => 'Интернатура',
self::ADDITIONAL_PREPROFESSIONAL_SPORT_PROGRAM => 'Дополнительная предпрофессиональная программа в сфере физической культуры и спорта',
self::BASIC_HIGHER_EDUCATION => 'Базовое высшее образование',
self::SPECIALIZED_HIGHER_EDUCATION => 'Специализированное высшее образование',
};
}
public function getColor(): string|array|null
{
return match ($this) {
self::PREPARATION_OF_QUALIFIED_WORKERS => 'info',
self::MIDDLE_LEVEL_SPECIALIST_TRAINING => 'primary',
self::BACHELOR => 'success',
self::MASTER => 'success',
self::SPECIALIST => 'warning',
self::POSTGRADUATE => 'warning',
self::ADJUNCTURE => 'secondary',
self::RESIDENCY => 'secondary',
self::INTERNSHIP => 'light',
self::PROFESSIONAL_TRAINING => 'info',
self::RETRAINING => 'danger',
self::ADVANCED_TRAINING => 'success',
self::ADDITIONAL_GENERAL_DEVELOPMENT_PROGRAM => 'info',
self::ADDITIONAL_PREPROFESSIONAL_PROGRAM => 'info',
self::ADDITIONAL_PREPROFESSIONAL_ART_PROGRAM => 'info',
self::PROFESSIONAL_ADVANCEMENT => 'success',
self::PROFESSIONAL_RETRAINING => 'danger',
self::PRESCHOOL_EDUCATION => 'success',
self::PRIMARY_GENERAL_EDUCATION => 'success',
self::BASIC_GENERAL_EDUCATION => 'success',
self::SECONDARY_GENERAL_EDUCATION => 'success',
self::INTERNSHIP_PROGRAM => 'light',
self::ADDITIONAL_PREPROFESSIONAL_SPORT_PROGRAM => 'info',
self::BASIC_HIGHER_EDUCATION => 'success',
self::SPECIALIZED_HIGHER_EDUCATION => 'success',
};
}
}