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
@@ -1,10 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class AcademicJournalController extends Controller
{
//
}
@@ -1,41 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\ApplicantQuestion\StoreRequest;
use App\Http\Resources\ApplicantQuestionResource;
use App\Models\ApplicantQuestion;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ApplicantQuestionController extends Controller
{
public function index(Request $request)
{
$applicantQuestions = ApplicantQuestionResource::collection(ApplicantQuestion::query()
->when(request()->input('search'), function ($query, $search) {
$query->whereRaw("LOWER(first_name || ' ' || last_name) LIKE ?", ["%{$search}%"])
->orWhere('email', 'like', "%{$search}%")
->orWhere('phone', 'like', "%{$search}%");
})
->orderBy('id', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = request()->input('search');
return Inertia::render('AdminPanel/ApplicantQuestion/Index', compact('applicantQuestions', 'filters'));
}
public function create()
{
return Inertia::render('AdminPanel/ApplicantQuestion/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
ApplicantQuestion::create($data);
return redirect()->route('admin.applicantQuestion.index');
}
}
@@ -2,9 +2,8 @@
namespace App\Http\Controllers\Auth;
use App\Containers\User\Models\User;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
@@ -1,67 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\CategoryResource;
use App\Http\Resources\PostResource;
use App\Models\AuthorPost;
use App\Models\Category;
use App\Models\Post;
use Illuminate\Http\Request;
use Inertia\Inertia;
class CategoryController extends Controller
{
public function index(Request $request)
{
$categories = CategoryResource::collection(Category::query()
->when(request()->input('search'), function ($query, $search) {
$query->where('title', 'like', "%{$search}%")
->orWhere('title', 'like', "%{$search}%");
})
->orderBy('id', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Categories/Index', compact('categories', 'filters'));
}
public function create()
{
return Inertia::render('AdminPanel/Categories/Create');
}
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|unique:categories|max:50|min:5',
]);
Category::create($data);
return redirect()->route('admin.category.index');
}
public function edit(Category $category)
{
return Inertia::render('AdminPanel/Categories/Edit', compact('category'));
}
public function update(Category $category, Request $request)
{
$data = $request->validate([
'title' => 'required|unique:categories|max:50|min:5',
]);
$category->update($data);
return redirect()->route('admin.category.index');
}
public function destroy(string $id)
{
$category = Category::find($id);
$category->delete();
return redirect()->route('admin.category.index');
}
}
@@ -1,83 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Http\Resources\ClientAcademicJournalListResource;
use App\Models\AcademicJournal;
use App\Models\JournalIssue;
use App\Services\App\Breadcrumb\BreadcrumbService;
use App\Services\App\Seo\SeoPageProvider;
use Illuminate\Support\Facades\Cache;
use Inertia\Inertia;
class ClientAcademicJournalController extends Controller
{
public function __construct(readonly SeoPageProvider $seoPageProvider){}
public function index(): \Inertia\Response
{
$journals = Cache::remember(
CacheKeys::ACADEMIC_JOURNALS_PREFIX->value . 'list',
now()->addWeek(),
function () {
return ClientAcademicJournalListResource::collection(
AcademicJournal::query()->get()
);
}
);
$seo = $this->seoPageProvider->getSeoForCurrentPage();
return Inertia::render('Client/AcademicJournals/Index', compact('journals', '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();
}
);
$seo = Cache::remember(
CacheKeys::ACADEMIC_JOURNAL_PREFIX->value . 'seo_' . $slug,
now()->addWeek(),
function () use ($journalData) {
return $this->seoPageProvider->getSeoForModel($journalData);
}
);
$journal = new ClientAcademicJournalListResource($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'));
}
}
@@ -1,165 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Enums\FormEducation;
use App\Http\Resources\AdditionalEducationCategoryPreviewResource;
use App\Http\Resources\AdditionalEducationCategoryResource;
use App\Http\Resources\AdditionalEducationResource;
use App\Http\Resources\ClientBreadcrumbPage;
use App\Http\Resources\ClientBreadcrumbSection;
use App\Http\Resources\ClientBreadcrumbSubSection;
use App\Http\Resources\DirectionAdditionalEducationResource;
use App\Models\AdditionalEducation;
use App\Models\AdditionalEducationCategory;
use App\Models\DirectionAdditionalEducation;
use App\Models\Page;
use App\Services\App\Breadcrumb\BreadcrumbService;
use App\Services\App\Seo\SeoPageProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Inertia\Inertia;
class ClientAdditionalEducationController extends Controller
{
public function __construct(readonly SeoPageProvider $seoPageProvider){}
public function index(Request $request): \Inertia\Response
{
$cacheKey = md5(serialize($request->all()));
// Основные данные (кешируются)
$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'
));
}
public function show(string $slug): \Inertia\Response
{
$additionalEducationModel = Cache::remember(
CacheKeys::ADDITIONAL_EDUCATIONAL_PROGRAM_PREFIX->value . $slug,
now()->addDay(),
fn() => AdditionalEducation::with('category.direction')->where('slug', $slug)->firstOrFail()
);
$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',
));
}}
@@ -1,107 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Http\Resources\ClientDepartmentPreviewResource;
use App\Http\Resources\DepartmentResource;
use App\Models\Department;
use App\Models\Faculty;
use App\Services\App\Breadcrumb\BreadcrumbService;
use App\Services\App\Seo\SeoPageProvider;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Inertia\Inertia;
class ClientDepartmentController extends Controller
{
public function __construct(readonly SeoPageProvider $seoPageProvider){}
public function show(string $facultySlug, string $departmentSlug)
{
// Ключ для кеширования
$cacheKey = "{$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 ClientDepartmentPreviewResource::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.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);
}
);
return Inertia::render('Client/Departments/Show', compact(
'department',
'departments',
'directions',
'seo',
));
}
private function groupProgramsByDirection(Collection $programs)
{
// Группируем программы по имени направления
$grouped = $programs->groupBy(function ($program) {
return $program->directionStudy->code . " " . $program->directionStudy->name; // Используем имя направления как ключ
});
return $grouped;
}
}
@@ -1,52 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Http\Resources\DivisionResource;
use App\Models\Division;
use App\Services\App\Breadcrumb\BreadcrumbService;
use App\Services\App\Seo\SeoPageProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Inertia\Inertia;
class ClientDivisionController extends Controller
{
public function __construct(readonly SeoPageProvider $seoPageProvider){}
public function index()
{
$divisions = Cache::remember(CacheKeys::DIVISIONS_PREFIX->value . 'list', now()->addDay(), function () {
return DivisionResource::collection(
Division::query()->where('is_active', true)->get()
);
});
$seo = Cache::remember(CacheKeys::DIVISIONS_PREFIX->value . 'seo', now()->addDay(), function () {
return $this->seoPageProvider->getSeoForCurrentPage();
});
return Inertia::render('Client/Divisions/Index', compact('divisions', 'seo'));
}
public function show(string $slug): \Inertia\Response
{
$divisions = Cache::remember(CacheKeys::DIVISIONS_PREFIX->value . 'list', now()->addDay(), function () {
return DivisionResource::collection(
Division::query()->where('is_active', true)->get()
);
});
$divisionData = Cache::remember(CacheKeys::DIVISION_PREFIX->value . $slug, now()->addDay(), function () use ($slug) {
return Division::with(['workers.userDetail', 'seo'])->where('is_active', true)->where('slug', $slug)->firstOrFail();
});
$seo = $this->seoPageProvider->getSeoForModel($divisionData);
$division = new DivisionResource($divisionData);
return Inertia::render('Client/Divisions/Show', compact('divisions', 'division', 'seo'));
}
}
@@ -1,327 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Http\Resources\ClientBreadcrumbPage;
use App\Http\Resources\ClientBreadcrumbSection;
use App\Http\Resources\ClientBreadcrumbSubSection;
use App\Http\Resources\ClientEventCategoryResource;
use App\Http\Resources\ClientEventFullResource;
use App\Http\Resources\ClientEventResource;
use App\Http\Resources\ClientNavigationResource;
use App\Models\Event;
use App\Models\EventCategory;
use App\Models\Page;
use App\Services\App\Breadcrumb\BreadcrumbService;
use App\Services\App\Seo\SeoPageProvider;
use Carbon\Carbon;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Inertia\Inertia;
class ClientEventController extends Controller
{
public function __construct(readonly SeoPageProvider $seoPageProvider){}
public function index(Request $request): \Inertia\Response
{
$currentDate = $this->getCurrentDate($request);
$cacheKey = md5(serialize([$currentDate, $request->all()]));
$events = Cache::remember(
CacheKeys::EVENTS_PREFIX->value . $cacheKey,
now()->addHours(12),
fn() => $this->getEvents($currentDate)
);
$eventDates = Cache::remember(
CacheKeys::EVENTS_PREFIX->value . 'dates_' . $cacheKey,
now()->addHours(12),
fn() => $this->getEventDates($this->getFilters())
);
$categories = Cache::remember(
CacheKeys::EVENTS_PREFIX->value . 'categories',
now()->addDay(),
fn() => ClientEventCategoryResource::collection(EventCategory::has('events')->get())
);
$filters = $this->getFilters();
$seo = $this->seoPageProvider->getSeoForCurrentPage();
return Inertia::render('Client/Events/Index', compact(
'eventDates',
'events',
'currentDate',
'filters',
'categories',
'seo'
));
}
public function show(string $slug): \Inertia\Response
{
$eventModel = Cache::remember(
CacheKeys::EVENT_PREFIX->value . $slug,
now()->addDay(),
function () use ($slug) {
return Event::where('slug', $slug)
->with(['category', 'seo'])
->firstOrFail();
}
);
$seo = Cache::remember(
CacheKeys::EVENT_PREFIX->value . 'seo_' . $slug,
now()->addDay(),
function () use ($eventModel) {
return $this->seoPageProvider->getSeoForModel($eventModel);
}
);
$event = new ClientEventFullResource($eventModel);
return Inertia::render('Client/Events/Show', compact(
'event',
'seo'
));
}
public function archive(Request $request): \Inertia\Response
{
$cacheKey = md5(serialize($request->all()));
$events = Cache::remember(
CacheKeys::EVENTS_PREFIX->value . 'archive_' . $cacheKey,
now()->addDay(),
fn() => $this->getEventsArchive()
);
$categories = Cache::remember(
CacheKeys::EVENTS_PREFIX->value . 'categories',
now()->addDay(),
fn() => ClientEventCategoryResource::collection(EventCategory::has('events')->get())
);
$filters = $this->getFilters();
$seo = $this->seoPageProvider->getSeoForCurrentPage();
return Inertia::render('Client/Events/Archive', compact(
'events',
'filters',
'categories',
'seo'
));
}
private function getCurrentDate(Request $request): array
{
$dateInput = $request->input('date');
// Если дата введена, создаем объект Carbon, иначе получаем ближайшую дату события
if ($dateInput) {
$date = new Carbon($dateInput);
} else {
$nearestEvent = Event::whereDate('event_date_start', '>=', now())
->orderBy('event_date_start', 'asc')
->first();
// Проверяем, найдено ли событие
if ($nearestEvent) {
$date = new Carbon($nearestEvent->event_date_start);
} else {
// Если событий нет, устанавливаем текущую дату
$date = Carbon::now();
}
}
return [
'fullDate' => $date->format('Y-m-j'),
'day' => $date->format('j'),
'month' => $date->getTranslatedMonthName('Do MMMM'),
];
}
private function getEvents(array $currentDate)
{
return ClientEventResource::collection(Event::select('title', 'slug', 'event_date_start', 'event_time_start', 'address', 'is_online', 'category_id')
->whereDate('event_date_start', '=', $currentDate['fullDate'])
->with('category')
->when(request()->input('is_online'), function ($query, $value) {
$this->applyOnlineFilter($query, $value);
})
->when(request()->input('search'), function ($query, $search) {
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
})
->when(request()->input('category'), function ($query) {
$slugs = request()->input('category');
if (is_array($slugs)) {
$query->whereHas('category', function ($query) use ($slugs) {
$query->whereIn('slug', $slugs);
});
}
})
->orderBy('event_time_start', 'asc')
->get());
}
private function getEventsArchive()
{
return ClientEventResource::collection(Event::select('title', 'slug', 'event_date_start', 'event_time_start', 'address', 'is_online', 'category_id')
->whereDate('event_date_start', '<', now())
->with('category')
->when(request()->input('is_online'), function ($query, $value) {
$this->applyOnlineFilter($query, $value);
})
->when(request()->input('search'), function ($query, $search) {
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
})
->when(request()->input('category'), function ($query) {
$slugs = request()->input('category');
if (is_array($slugs)) {
$query->whereHas('category', function ($query) use ($slugs) {
$query->whereIn('slug', $slugs);
});
}
})
->when(request()->input('sort', 'desc'), function ($query, $sort) {
$query->orderBy('event_date_start', $sort);
})
->orderBy('event_time_start', 'asc')
->paginate(6)
->withQueryString());
}
private function getEventDates(array $filters): \Illuminate\Support\Collection
{
// Получаем события с учетом фильтров
$events = Event::select('event_date_start')
->distinct()
->where('event_date_start', '>=', date('Y-m-d'))
->when($filters['is_online_filter']['value'], function ($query, $value) {
if ($value === 'online') {
$query->where('is_online', true);
} elseif ($value === 'offline') {
$query->where('is_online', false);
}
})
->when($filters['category_filter']['value'], function ($query) {
$slugs = request()->input('category');
if (is_array($slugs)) {
$query->whereHas('category', function ($query) use ($slugs) {
$query->whereIn('slug', $slugs);
});
}
})
->orderBy('event_date_start')
->get();
// Получаем массив без ключей
// Извлекаем уникальные даты из событий
return $events->map(function ($event) {
$date = new DateTime($event->event_date_start);
return [
'day' => $date->format('j'),
'dayOfWeek' => $this->getDayOfWeekRussian($date->format('l')),
'date' => $date->format('Y-m-j')
];
})
->groupBy(function ($item) {
return (new DateTime($item['date']))->format('m');
})
->map(function ($group, $month) {
return [
"month" => $this->getMonthNameRussian((int)$month),
"events" => $group->toArray()
];
})
->sortKeys() // Сортируем ключи по возрастанию
->values();
}
private function getFilters(): array
{
$categoriesContent = [];
if (request()->input('category')) {
foreach (request()->input('category') as $item) {
$categoriesContent[$item] = new ClientEventCategoryResource(EventCategory::where('slug', $item)->first());
}
}
return [
'search_filter' => [
'type' => 'search',
'value' => request()->input('search'),
'param' => 'search'
],
'category_filter' => [
'type' => 'category',
'value' => request()->input('category'),
'param' => 'category',
'content' => $categoriesContent,
],
'sortingBy_filter' => [
'type' => 'sort',
'value' => request()->input('sort'),
'param' => 'sort',
],
'is_online_filter' => [
'type' => 'is_online',
'value' => request()->input('is_online'),
'param' => 'is_online',
],
];
}
private function getDayOfWeekRussian(string $dayOfWeek): string
{
$russianDays = [
'Monday' => 'пн',
'Tuesday' => 'вт',
'Wednesday' => 'ср',
'Thursday' => 'чт',
'Friday' => 'пт',
'Saturday' => 'сб',
'Sunday' => 'вс'
];
return $russianDays[$dayOfWeek] ?? '';
}
private function getMonthNameRussian(int $month): string
{
$russianMonths = [
1 => 'Январь',
2 => 'Февраль',
3 => 'Март',
4 => 'Апрель',
5 => 'Май',
6 => 'Июнь',
7 => 'Июль',
8 => 'Август',
9 => 'Сентябрь',
10 => 'Октябрь',
11 => 'Ноябрь',
12 => 'Декабрь'
];
return $russianMonths[$month] ?? '';
}
private function applyOnlineFilter($query, $isOnline): void
{
if ($isOnline === 'online') {
$query->where('is_online', true);
} elseif ($isOnline === 'offline') {
$query->where('is_online', false);
}
}
}
@@ -1,10 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ClientExternalVacancyController extends Controller
{
//
}
@@ -1,81 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Http\Resources\FacultyResource;
use App\Http\Resources\FullFacultyResource;
use App\Models\Faculty;
use App\Services\App\Breadcrumb\BreadcrumbService;
use App\Services\App\Seo\SeoPageProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Inertia\Inertia;
class ClientFacultyController extends Controller
{
public function __construct(readonly SeoPageProvider $seoPageProvider){}
public function index(Request $request)
{
$faculties = Cache::remember(
CacheKeys::FACULTIES_PREFIX->value . 'active_list',
now()->addDay(), // Кешируем на 1 день
function () {
return FacultyResource::collection(
Faculty::query()
->where('is_active', true)
->get()
);
}
);
$seo = $this->seoPageProvider->getSeoForCurrentPage();
return Inertia::render('Client/Faculties/Index', compact('faculties', 'seo'));
}
public function show(string $slug)
{
// Кешируем список факультетов
$faculties = Cache::remember(
CacheKeys::FACULTIES_PREFIX->value . 'active_list',
now()->addDay(),
function () {
return FacultyResource::collection(
Faculty::query()
->where('is_active', true)
->get()
);
}
);
// Кешируем данные конкретного факультета
$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.userDetail', 'seo'])
->firstOrFail();
}
);
$seo = Cache::remember(
CacheKeys::FACULTY_PREFIX->value . "SEO_" . $slug,
now()->addDay(),
function () use ($faculty) {
return $this->seoPageProvider->getSeoForModel($faculty);
}
);
$faculty = new FullFacultyResource($faculty);
return Inertia::render('Client/Faculties/Show', compact('faculty', 'faculties', 'seo'));
}
}
@@ -1,26 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ClientLibraryPostListResource;
use App\Models\LibraryNews;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientLibraryNewsController extends Controller
{
public function index()
{
$posts = ClientLibraryPostListResource::collection(LibraryNews::query()
->where('is_active', true)
->orderBy('id', 'desc')
->paginate(6));
return Inertia::render('Client/Library-news/Index', compact('posts'));
}
public function show(string $slug)
{
$post = new ClientLibraryPostListResource(LibraryNews::query()->where('slug', $slug)->firstOrFail());
return Inertia::render('Client/Library-news/Show', compact('post'));
}
}
@@ -1,158 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Http\Resources\CategoryResource;
use App\Http\Resources\ClientPostListResource;
use App\Http\Resources\ClientTagResource;
use App\Http\Resources\PostResource;
use App\Models\Category;
use App\Models\MainSection;
use App\Models\Page;
use App\Models\Post;
use App\Models\Tag;
use App\Services\App\Breadcrumb\BreadcrumbService;
use App\Services\App\Seo\SeoPageProvider;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Inertia\Inertia;
class ClientPostController extends Controller
{
public function __construct(readonly SeoPageProvider $seoPageProvider){}
public function index(Request $request): \Inertia\Response
{
// Кешируем список тегов
$tagIds = Cache::remember('tag_ids', now()->addHours(), function () {
return DB::table('taggables')
->distinct()
->select('tag_id')
->where('taggable_type', Post::class)
->get()
->pluck('tag_id');
});
$tags = Cache::remember('tags', now()->addHours(1), function () use ($tagIds) {
return \Spatie\Tags\Tag::whereIn('id', $tagIds)->get();
});
$cacheKey = 'posts_' . md5(serialize($request->all()));
$posts = Cache::remember($cacheKey, now()->addHours(1), function () use ($request) {
return ClientPostListResource::collection(Post::query()
->with('category')
->select('title', 'slug', 'authors', 'category_id', 'preview', 'search_data', 'publish_at')
->where('status', '=', 'published')
->where('publish_at', '<', Carbon::now())
->when($request->input('search'), function ($query, $search) {
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
})
->when($request->input('category'), function ($query) use ($request) {
$slugs = $request->input('category');
if (is_array($slugs)) {
$query->whereHas('category', function ($query) use ($slugs) {
$query->whereIn('slug', $slugs);
});
}
})
->when($request->input('tag'), function ($query, $slugs) {
if (is_array($slugs)) {
return $query->withAnyTags($slugs);
}
$slugsArray = explode(',', $slugs);
return $query->withAnyTags($slugsArray);
})
->orderBy('publish_at', $request->input('sort', 'desc'))
->paginate(9)
->withQueryString()
);
});
$categories = Cache::remember('categories', now()->addHours(48), function () {
return CategoryResource::collection(Category::has('posts')->get());
});
$categoriesContent = [];
if ($request->input('category')) {
foreach ($request->input('category') as $item) {
$cacheKey = 'category_content_' . $item;
$categoriesContent[$item] = Cache::remember($cacheKey, now()->addHours(1), function () use ($item) {
return new CategoryResource(Category::where('slug', $item)->first());
});
}
}
// Кешируем контент тегов
$tagsContent = [];
if ($request->input('tag')) {
foreach ($request->input('tag') as $item) {
$cacheKey = 'tag_content_' . $item;
$tagsContent[$item] = Cache::remember($cacheKey, now()->addHours(1), function () use ($item) {
return new ClientTagResource(DB::table('tags')
->where(DB::raw("JSON_UNQUOTE(JSON_EXTRACT(slug, '$.ru'))"), $item)
->first());
});
}
}
$filters = [
'search_filter' => [
'type' => 'search',
'value' => $request->input('search'),
'param' => 'search'
],
'category_filter' => [
'type' => 'category',
'value' => $request->input('category'),
'param' => 'category',
'content' => $categoriesContent,
],
'tag_filter' => [
'type' => 'tag',
'value' => $request->input('tag'),
'param' => 'tag',
'content' => $tagsContent
],
'sortingBy_filter' => [
'type' => 'sort',
'value' => $request->input('sort'),
'param' => 'sort',
],
];
$seo = $this->seoPageProvider->getSeoForCurrentPage();
return Inertia::render('Client/Posts/Index', compact('filters', 'posts', 'categories', 'tags', 'seo'));
}
public function show(Request $request, $slug): \Inertia\Response
{
$postData = Cache::remember(
CacheKeys::POST_PREFIX->value . $slug,
now()->addHours(1),
fn() => Post::where('slug', $slug)
->where('publish_at', '<', Carbon::now())
->firstOrFail()
);
$seo = Cache::remember(
CacheKeys::POST_PREFIX->value . 'seo_' . $slug,
now()->addHours(1),
fn() => $this->seoPageProvider->getSeoForModel($postData)
);
$post = new PostResource($postData);
// Возвращаем ответ с использованием кешированных данных
return Inertia::render('Client/Posts/Show', compact('post', 'seo'));
}
}
@@ -1,175 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\BudgetEducation;
use App\Enums\CacheKeys;
use App\Enums\FormEducation;
use App\Enums\LevelEducational;
use App\Http\Resources\DirectionStudyResource;
use App\Http\Resources\EducationalProgramFullResource;
use App\Models\AdmissionCampaign;
use App\Models\AdmissionPlan;
use App\Models\DirectionStudy;
use App\Models\EducationalProgram;
use App\Services\App\Seo\SeoPageProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
use Inertia\Inertia;
class ClientProgramController extends Controller
{
public function __construct(readonly SeoPageProvider $seoPageProvider){}
public function index(Request $request): \Inertia\Response
{
$cacheKey = CacheKeys::EDUCATION_PROGRAMS_PREFIX->value . md5(serialize($request->all()));
$cacheKeyLevels = 'education_levels_list';
$cacheKeyForms = 'education_forms_list';
$cacheKeyBudgets = 'education_budgets_list';
$cacheKeySeo = 'education_programs_seo';
$activeCampaign = Cache::remember(CacheKeys::ADMISSION_CAMPAIGNS_PREFIX->value, now()->addDay(), function () {
return AdmissionCampaign::where('status', 1)->first();
});
$levelsEducational = Cache::remember($cacheKeyLevels, now()->addDay(), function () {
return EducationalProgram::distinct()->pluck('lvl_edu')
->mapWithKeys(fn($level) => [$level->name => $level->getLabel()]);
});
$formsEdu = Cache::remember($cacheKeyForms, now()->addDay(), function () {
return AdmissionPlan::distinct()
->pluck('contests')
->flatten(1)
->filter(fn ($item) => isset($item['form_education']))
->pluck('form_education')
->unique()
->map(fn ($item) => FormEducation::tryFrom((int)$item))
->filter()
->mapWithKeys(fn ($form) => [$form->name => $form->getLabel()]);
});
$budgetEdu = Cache::remember($cacheKeyBudgets, now()->addDay(), function () {
return AdmissionPlan::distinct()
->pluck('contests')
->flatten(1)
->filter(fn ($item) => isset($item['places']['form_budget']))
->pluck('places.form_budget')
->unique()
->map(fn ($item) => BudgetEducation::tryFrom($item))
->filter()
->mapWithKeys(fn ($form) => [$form->name => $form->getLabel()]);
});
$seo = Cache::remember($cacheKeySeo, now()->addDay(), function () {
return $this->seoPageProvider->getSeoForCurrentPage();
});
$naprs = Cache::remember($cacheKey, now()->addHours(), function () use ($request, $activeCampaign) {
return DirectionStudyResource::collection(
DirectionStudy::query()
->withAdmissionCampaignByYear($activeCampaign->academic_year)
->withActivePrograms()
// ->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) =>
$this->applyFormFilter($q, $form))
->when($request->input('budget'), fn($q, $budget) =>
$this->applyBudgetFilter($q, $budget))
->when($request->input('direction'), fn($q, $slugs) =>
is_array($slugs) ? $q->whereIn('slug', $slugs) : $q)
->get()
);
});
$data = [
'naprs' => $naprs,
'campaignName' => $this->getAdmissionCampaignName(),
'levelsEducational' => $levelsEducational,
'filters' => [
'level_filter' => ['type' => 'level', 'value' => $request->input('level'), 'param' => 'level'],
'budget_filter' => ['type' => 'budget', 'value' => $request->input('budget'), 'param' => 'budget'],
'formEdu_filter' => ['type' => 'form', 'value' => $request->input('form'), 'param' => 'form'],
'direction_filter' => ['type' => 'direction', 'value' => $request->input('direction'), 'param' => 'direction'],
],
'formsEdu' => $formsEdu,
'budgetEdu' => $budgetEdu,
'direction_studies' => DirectionStudy::query()
->withAdmissionCampaignByYear($activeCampaign->academic_year)
->withActivePrograms()
->get(),
'seo' => $seo
];
return Inertia::render('Client/Programs/Index', $data);
}
public function show(string $slug): \Inertia\Response
{
$cacheKeyProgram = CacheKeys::EDUCATION_PROGRAM_PREFIX->value . md5($slug);
$cacheKeySeo = CacheKeys::EDUCATION_PROGRAM_PREFIX->value . 'seo_' . md5($slug);
$cacheKeyForms = 'education_forms_list';
$programModel = Cache::remember($cacheKeyProgram, now()->addHours(1), function () use ($slug) {
return EducationalProgram::query()
->where('slug', $slug)
->with(['admission_plans', 'directionStudy', 'seo'])
->firstOrFail();
});
$formsEdu = Cache::remember($cacheKeyForms, now()->addDay(), function () {
return collect(BudgetEducation::cases())
->mapWithKeys(fn($form) => [$form->value => $form->getLabel()]);
});
$seo = Cache::remember($cacheKeySeo, now()->addHours(1), function () use ($programModel) {
return $this->seoPageProvider->getSeoForModel($programModel);
});
$program = new EducationalProgramFullResource($programModel);
return Inertia::render('Client/Programs/Show', compact('program', 'formsEdu', 'seo'));
}
private function getAdmissionCampaignName(): string
{
$cacheKey = CacheKeys::EDUCATION_PROGRAM_PREFIX->value . 'active_campaign_name';
return Cache::remember($cacheKey, now()->addHours(1), function () {
$campaign = AdmissionCampaign::query()->where('status', 1)->first();
return $campaign->name;
});
}
private function applyFormFilter($query, $form)
{
$formValue = Str::of(FormEducation::fromName($form)->value)->toString();
$query->whereHas('programs.admission_plans', function ($query) use ($formValue) {
$query->whereJsonContains('contests', ['form_education' => $formValue]);
})
->with(['programs' => function ($query) use ($formValue) {
$query->whereHas('admission_plans', function ($q) use ($formValue) {
$q->whereJsonContains('contests', ['form_education' => $formValue]);
});
}]);
}
private function applyBudgetFilter($query, $budget): void
{
$budgetValue = Str::of(BudgetEducation::fromName($budget)->value)->toString();
$query->whereHas('programs.admission_plans', function ($query) use ($budgetValue) {
$query->where('contests', 'like', '%"form_budget":"'.$budgetValue.'"%');
})
->with(['programs' => function ($query) use ($budgetValue) {
$query->whereHas('admission_plans', function ($query) use ($budgetValue) {
$query->where('contests', 'like', '%"form_budget":"'.$budgetValue.'"%');
});
}]);
}
}
@@ -1,83 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\FormEducation;
use App\Http\Resources\ClientEducationalGroupResource;
use App\Http\Resources\ScheduleResource;
use App\Models\EducationalGroup;
use App\Models\Faculty;
use App\Models\Schedule;
use App\Services\App\Seo\SeoPageProvider;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientScheduleController extends Controller
{
public function __construct(readonly SeoPageProvider $seoPageProvider){}
public function index(Request $request)
{
$educationalGroups = ClientEducationalGroupResource::collection(EducationalGroup::query()
->has('schedules')
->when(request()->input('search'), function ($query, $search) {
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
})
->when(request()->input('favorite'), function ($query, $favorite) {
$query->whereHas('schedules', function ($query) use ($favorite) {
$query->whereIn('id', $favorite);
});
})
->when(request()->input('form'), function ($query, $form) {
$query->where('education_form_id', FormEducation::fromName($form)->value);
})
->with('schedules')
->with('faculty')
->orderBy('title')
->get());
$schedulesByFaculty = $educationalGroups->groupBy(function ($group) {
return $group->faculty->title;
});
$schedulesByFaculty = $schedulesByFaculty->toArray();
$forms_education = [];
foreach (FormEducation::cases() as $case) {
$forms_education[$case->name] = $case->getLabel();
}
$filters = [
'form_education_filter' => [
'type' => 'form',
'value' => request()->input('form'),
'param' => 'form'
],
'search_filter' => [
'type' => 'search',
'value' => $request->input('search'),
'param' => 'search'
],
'favorite_filter' => [
'type' => 'favorite',
'value' => $request->input('favorite'),
'param' => 'favorite'
]
];
$seo = $this->seoPageProvider->getSeoForCurrentPage();
// Возвращаем данные в представление
return Inertia::render('Client/Schedules/Index', compact('educationalGroups', 'filters', 'forms_education', 'schedulesByFaculty', 'seo'));
}
public function show($id)
{
$schedule = Schedule::find($id);
return Inertia::render('Client/Schedules/Show', compact('schedule'));
}
}
@@ -1,10 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ClientVacantPositionController extends Controller
{
//
}
@@ -1,26 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ClientVirtualExhibitionListResource;
use App\Models\VirtualExhibition;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientVirtualExhibitionController extends Controller
{
public function index()
{
$exhibitions = ClientVirtualExhibitionListResource::collection(VirtualExhibition::query()
->where('is_active', true)
->orderBy('id', 'desc')
->paginate(6));
return Inertia::render('Client/Library-exhibitions/Index', compact('exhibitions'));
}
public function show(string $slug)
{
$exhibition = new ClientVirtualExhibitionListResource(VirtualExhibition::query()->where('slug', $slug)->firstOrFail());
return Inertia::render('Client/Library-exhibitions/Show', compact('exhibition'));
}
}
@@ -1,32 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Enums\PostStatus;
use App\Http\Resources\AdditionalEducationSearchResource;
use App\Http\Resources\PostThumbnailResource;
use App\Models\AdditionalEducation;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class ClientWidgetAdditionalEducationalProgramController extends Controller
{
public function index()
{
return Cache::remember(
CacheKeys::ADDITIONAL_EDUCATIONAL_PROGRAMS_PREFIX->value . 'search_list',
now()->addDay(), // Кешируем на 1 день
function () {
return AdditionalEducationSearchResource::collection(
AdditionalEducation::query()
->where('is_active', true)
->orderBy('title', 'desc')
->get()
);
}
);
}
}
@@ -1,27 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Http\Resources\ClientContactWidgetResource;
use App\Http\Resources\ClientPageReferenceListResource;
use App\Models\ContactWidget;
use Illuminate\Support\Facades\Cache;
class ClientWidgetContactController extends Controller
{
public function show(string $slug)
{
return Cache::remember(
CacheKeys::CONTACT_WIDGET_PREFIX->value . $slug,
now()->addHours(12), // Кешируем на 12 часов
function () use ($slug) {
return new ClientContactWidgetResource(
ContactWidget::query()
->where('slug', $slug)
->firstOrFail()
);
}
);
}
}
@@ -1,29 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Enums\EducationalProgramStatus;
use App\Http\Resources\EducationalProgramSearchResource;
use App\Models\EducationalProgram;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class ClientWidgetEducationalProgramController extends Controller
{
public function index()
{
return Cache::remember(
CacheKeys::EDUCATION_PROGRAMS_PREFIX->value . 'search_list',
now()->addDay(), // Кешируем на 1 день
function () {
return EducationalProgramSearchResource::collection(
EducationalProgram::query()
->where('status', EducationalProgramStatus::PUBLISHED)
->orderBy('name', 'desc')
->get()
);
}
);
}
}
@@ -1,122 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CustomFormStatus;
use App\Http\Requests\FormResponseRequest;
use App\Http\Resources\ClientFormResource;
use App\Models\CustomForm;
use App\Models\CustomFormResponse;
use App\Rules\UniqueJsonField;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class ClientWidgetFormController extends Controller
{
public function single(string $id)
{
return new ClientFormResource(CustomForm::query()->where('status', CustomFormStatus::PUBLISHED)->where('form_id', $id)->firstOrFail());
}
public function submit(int $id, Request $request)
{
$data = CustomForm::findOrFail($id);
$rules = $this->generateValidationRules($data['columns'], $data['id']);
$messages = $this->generateValidationMessages($data['columns']);
$validateData = Validator::make($request->all(), $rules, $messages);
if ($validateData->fails()) {
return response()->json($validateData->errors(), 422);
}
$this->storeResponse($id, $validateData->validated());
return response()->json([
'message' => $data['send_message'],
'status' => 'ok'
]);
}
private function generateValidationRules(array $columns, int $id): array
{
$rules = [];
foreach ($columns as $column) {
// Извлекаем информацию о поле
$name = $column['data']['name_field'];
$rulesForField = [];
// Проверяем, является ли поле массивом (множественный выбор)
if ($column['type'] === 'multiple_choice') {
$rulesForField[] = 'required'; // Обязательно для множественного выбора
$rulesForField[] = 'array'; // Указывает, что это массив
$rulesForField[] = 'min:1'; // Минимум один элемент
$rules[$name] = $rulesForField; // Правила для каждого элемента массива
} else {
// Обработка обычных полей
if (!empty($column['data']['rules']['required'])) {
$rulesForField[] = 'required';
}
if (!empty($column['data']['rules']['min'])) {
$rulesForField[] = 'min:' . $column['data']['rules']['min'];
}
if (!empty($column['data']['rules']['max'])) {
$rulesForField[] = 'max:' . $column['data']['rules']['max'];
}
if (!empty($column['data']['rules']['unique']) && $column['data']['rules']['unique'] === true) {
$rulesForField[] = new UniqueJsonField($id, $name);
}
$rules[$name] = $rulesForField; // Добавляем правила для обычного поля
}
}
return $rules;
}
private function generateValidationMessages(array $columns): array
{
$messages = [];
foreach ($columns as $column) {
$name = $column['data']['name_field'];
if (!empty($column['data']['rules']['required'])) {
$messages[$name . '.required'] = 'Поле обязательно для заполнения.';
}
if (!empty($column['data']['rules']['min'])) {
$messages[$name . '.min'] = 'Минимальная длина поля должна быть ' . $column['data']['rules']['min'] . ' символов.';
}
if (!empty($column['data']['rules']['max'])) {
$messages[$name . '.max'] = 'Максимальная длина поля должна быть ' . $column['data']['rules']['max'] . ' символов.';
}
if (!empty($column['data']['rules']['unique'])) {
$messages[$name . '.max'] = 'Поле должно быть уникальным';
}
}
return $messages;
}
private function storeResponse(int $id, array $validateData): void
{
CustomFormResponse::create([
'custom_form_id' => $id,
'answers' => $validateData,
]);
}
}
@@ -1,40 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ClientPageNavigateResource;
use App\Http\Resources\PageResource;
use App\Models\Page;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class ClientWidgetPageController extends Controller
{
public function single(int $id): \Illuminate\Http\JsonResponse
{
$cacheKey = 'page_' . md5($id);
// Пытаемся получить данные из кеша
$page = Cache::remember($cacheKey, now()->addHours(1), function () use ($id) {
return Page::where('id', '=', $id)
->with('section.pages.section', 'section.mainSection')
->firstOrFail();
});
if (isset($page->section)) {
$breadcrumbs = [
'mainSection' => $page->section->mainSection->title,
'subSection' => $page->section->title,
'page' => $page->title,
];
} else {
$breadcrumbs = null;
}
return response()->json([
'data' => [
'page' => new ClientPageNavigateResource($page),
'breadcrumbs' => $breadcrumbs
],
], 200);
}
}
@@ -1,27 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Http\Resources\ClientPageReferenceListResource;
use App\Models\PageReferenceList;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class ClientWidgetPageReferenceListController extends Controller
{
public function show(string $slug)
{
return Cache::remember(
CacheKeys::PAGE_REFERENCE_LIST_PREFIX->value . $slug,
now()->addWeek(), // Кешируем на неделю, так как справочники меняются редко
function () use ($slug) {
return new ClientPageReferenceListResource(
PageReferenceList::query()
->where('slug', $slug)
->firstOrFail()
);
}
);
}
}
@@ -1,46 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\PostStatus;
use App\Http\Resources\ClientPostListResource;
use App\Http\Resources\PostThumbnailResource;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class ClientWidgetPostController extends Controller
{
public function index()
{
$category_id = request()->input('category');
$count = request()->input('count', 5);
$cacheKey = 'posts_' . $category_id . '_' . $count;
return Cache::remember($cacheKey, now()->addMinutes(10), function () use ($category_id, $count) {
return PostThumbnailResource::collection(
Post::query()
->where('status', PostStatus::PUBLISHED)
->when($category_id, function ($query, $category_id) {
$query->where('category_id', $category_id);
})
->with('category')
->orderBy('publish_at', 'desc')
->take($count)
->get()
);
});
}
public function single(int $id)
{
$cacheKey = 'post_' . $id;
return Cache::remember($cacheKey, now()->addMinutes(10), function () use ($id) {
return new PostThumbnailResource(
Post::query()->with('category')->find($id)->firstOrFail()
);
});
}
}
@@ -1,26 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Cache;
use App\Models\Slider;
class ClientWidgetSliderController extends Controller
{
public function show(string $slug): ?object
{
$cacheKey = 'slider_' . $slug;
return Cache::remember($cacheKey, now()->addHour(), function () use ($slug) {
$slider = Slider::query()
->where('slug', $slug)
->where('is_active', true)
->with(['slides' => function($query) {
$query->where('is_active', true);
}])
->firstOrFail();
return $slider ?: null;
});
}
}
@@ -1,54 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Department\StoreRequest;
use App\Http\Requests\Department\UpdateRequest;
use App\Http\Resources\DepartmentResource;
use App\Http\Resources\FacultyResource;
use App\Models\Department;
use App\Models\Faculty;
use Illuminate\Http\Request;
use Inertia\Inertia;
class DepartmentController extends Controller
{
public function index()
{
$departments = DepartmentResource::collection(Department::all());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Departments/Index', compact('departments', 'filters'));
}
public function create()
{
$faculties = FacultyResource::collection(Faculty::all());
return Inertia::render('AdminPanel/Departments/Create', compact('faculties'));
}
public function store(StoreRequest $request)
{
$data = $request->validated();
Department::firstOrCreate($data);
return redirect()->route('admin.department.index');
}
public function edit(Department $department)
{
return Inertia::render('AdminPanel/Departments/Edit', compact('department'));
}
public function update(UpdateRequest $request, Department $department)
{
$data = $request->validated();
$department->update($data);
return redirect()->route('admin.department.index');
}
public function destroy(Department $department)
{
$department->delete();
}
}
@@ -1,66 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Division\StoreRequest;
use App\Http\Requests\Division\UpdateRequest;
use App\Http\Resources\DivisionResource;
use App\Http\Resources\UserResource;
use App\Models\Division;
use App\Models\User;
use Illuminate\Http\Request;
use Inertia\Inertia;
class DivisionController extends Controller
{
public function index(Request $request)
{
$divisions = DivisionResource::collection(Division::query()
->when(request()->input('search'), function ($query, $search) {
$query->where('title', 'like', "%{$search}%");
})
->orderBy('id', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Divisions/Index', compact('divisions', 'filters'));
}
public function create()
{
return Inertia::render('AdminPanel/Divisions/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
$data['description'] = json_encode($data['description']);
Division::create($data);
return redirect()->route('admin.division.index');
}
public function edit(Division $division)
{
$division = new DivisionResource($division);
$users = UserResource::collection(User::all());
return Inertia::render('AdminPanel/Divisions/Edit', compact('division', 'users'));
}
public function update(Division $division, UpdateRequest $request)
{
$data = $request->validated();
$data['description'] = json_encode($data['description']);
$division->update($data);
return redirect()->route('admin.division.index');
}
public function destroy(string $id)
{
$category = Division::find($id);
$category->delete();
return redirect()->route('admin.division.index');
}
}
-62
View File
@@ -1,62 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Event\StoreRequest;
use App\Http\Requests\Event\UpdateRequest;
use App\Http\Resources\EventResource;
use App\Models\Event;
use Illuminate\Http\Request;
use Inertia\Inertia;
class EventController extends Controller
{
public function index()
{
$events = EventResource::collection(Event::query()
->when(request()->input('search'), function ($query, $search) {
$query->where('title', 'like', "%{$search}%");
})
->orderBy('id', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Posts/Index', compact('events', 'filters'));
}
public function create()
{
return Inertia::render('AdminPanel/Posts/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
$data['content'] = json_encode($data['content']);
Event::create($data);
return redirect()->route('admin.event.index');
}
public function edit(Event $event)
{
$event = new EventResource($event);
return Inertia::render('AdminPanel/Posts/Edit', compact('event'));
}
public function update(Event $event, UpdateRequest $request)
{
$data = $request->validated();
$data['content'] = json_encode($data['content']);
$event->update($data);
return redirect()->route('admin.event.index');
}
public function destroy(Event $event)
{
$event->delete();
return redirect()->route('admin.event.index');
}
}
@@ -1,52 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Faculty\StoreRequest;
use App\Http\Requests\Faculty\UpdateRequest;
use App\Http\Resources\FacultyResource;
use App\Models\Faculty;
use Illuminate\Http\Request;
use Inertia\Inertia;
class FacultyController extends Controller
{
public function index()
{
$faculties = FacultyResource::collection(Faculty::all());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Faculties/Index', compact('faculties', 'filters'));
}
public function create()
{
return Inertia::render('AdminPanel/Faculties/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
Faculty::firstOrCreate($data);
return redirect()->route('admin.faculty.index');
}
public function edit(Faculty $faculty)
{
return Inertia::render('AdminPanel/Faculties/Edit', compact('faculty'));
}
public function update(UpdateRequest $request, Faculty $faculty)
{
$data = $request->validated();
$faculty->update($data);
return redirect()->route('admin.faculty.index');
}
public function destroy(Faculty $faculty)
{
$faculty->delete();
}
}
@@ -1,37 +0,0 @@
<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class FileUploadController extends Controller
{
public function uploadFile(Request $request)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
if ($file->isValid()) {
// Генерируем уникальное имя файла
$filename = md5(Carbon::now() . '_' . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension();
// Сохраняем файл в папку public/files
$path = Storage::disk('public')->putFileAs('/files', $file, $filename);
// Генерируем полный URL к загруженному файлу с использованием функции asset
$fileUrl = '/storage/' . $path;
// Возвращаем JSON-ответ с заданным форматом
return response()->json([
'success' => 1,
'file' => [
'url' => $fileUrl,
],
]);
}
}
return response()->json(['error' => 'File upload failed'], 400);
}
}
@@ -1,201 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\EducationalProgramStatus;
use App\Enums\PostStatus;
use App\Models\EducationalProgram;
use App\Models\Page;
use App\Models\Post;
use App\Models\Division;
use App\Models\Event; // Добавляем модель Event
use App\Models\AdditionalEducation; // Добавляем модель AdditionalEducation
use App\Models\Faculty; // Добавляем модель Faculty
use App\Models\Department; // Добавляем модель Department
use App\Models\User; // Добавляем модель User
use Spatie\Sitemap\Sitemap;
use Spatie\Sitemap\Tags\Url;
class GenerateSitemapController extends Controller
{
public function index()
{
$sitemap = Sitemap::create();
// Генерация карты сайта для всех моделей
$this->generatePages($sitemap);
$this->generatePosts($sitemap);
$this->generateDivisions($sitemap);
$this->generateEducationPrograms($sitemap); // Добавляем генерацию для EducationProgram
$this->generateEvents($sitemap); // Добавляем генерацию для Event
$this->generateAdditionalEducations($sitemap); // Добавляем генерацию для AdditionalEducation
$this->generateFaculties($sitemap); // Добавляем генерацию для Faculty
$this->generateDepartments($sitemap); // Добавляем генерацию для Department
$this->generateUsers($sitemap); // Добавляем генерацию для User
// Сохраняем карту сайта в файл
$sitemap->writeToFile(public_path('sitemap.xml'));
return 'Sitemap generated successfully!';
}
protected function generatePages(Sitemap $sitemap)
{
$pages = Page::query()
->where('is_visible', true)
->where('code', 200)
->get();
$this->addUrlsToSitemap($sitemap, $pages, function($page) {
return [
'route' => 'page.view',
'params' => ['path' => $page->path],
'lastModificationDate' => $page->updated_at,
'priority' => 0.5,
];
});
}
protected function generatePosts(Sitemap $sitemap)
{
$posts = Post::query()
->where('status', PostStatus::PUBLISHED)
->get();
$this->addUrlsToSitemap($sitemap, $posts, function($post) {
return [
'route' => 'client.post.show',
'params' => ['slug' => $post->slug],
'lastModificationDate' => $post->updated_at,
'priority' => 0.5,
];
});
}
protected function generateDivisions(Sitemap $sitemap)
{
$divisions = Division::query()
->where('is_active', true)
->get();
$this->addUrlsToSitemap($sitemap, $divisions, function($division) {
return [
'route' => 'client.division.show',
'params' => ['slug' => $division->slug],
'lastModificationDate' => $division->updated_at,
'priority' => 0.5,
];
});
}
protected function generateEducationPrograms(Sitemap $sitemap)
{
$programs = EducationalProgram::query()
->where('status', EducationalProgramStatus::PUBLISHED) // Пример условия для активных программ
->get();
$this->addUrlsToSitemap($sitemap, $programs, function($program) {
return [
'route' => 'client.program.show',
'params' => ['slug' => $program->slug],
'lastModificationDate' => $program->updated_at,
'priority' => 0.5,
];
});
}
protected function generateEvents(Sitemap $sitemap)
{
$now = now()->toDateString(); // Текущая дата
$events = Event::query()
->where('event_date_end', '>=', $now) // Только актуальные события
->get();
$this->addUrlsToSitemap($sitemap, $events, function($event) {
return [
'route' => 'client.event.show',
'params' => ['slug' => $event->slug],
'lastModificationDate' => $event->updated_at,
'priority' => 0.5,
];
});
}
protected function generateAdditionalEducations(Sitemap $sitemap)
{
$educations = AdditionalEducation::query()
->where('is_active', true) // Пример условия для активных программ
->get();
$this->addUrlsToSitemap($sitemap, $educations, function($education) {
return [
'route' => 'client.additionalEducation.show',
'params' => ['slug' => $education->slug],
'lastModificationDate' => $education->updated_at,
'priority' => 0.5,
];
});
}
protected function generateFaculties(Sitemap $sitemap)
{
$faculties = Faculty::query()
->where('is_active', true) // Пример условия для активных факультетов
->get();
$this->addUrlsToSitemap($sitemap, $faculties, function($faculty) {
return [
'route' => 'client.faculty.show',
'params' => ['slug' => $faculty->slug],
'lastModificationDate' => $faculty->updated_at,
'priority' => 0.5,
];
});
}
protected function generateDepartments(Sitemap $sitemap)
{
$departments = Department::query()
->where('is_active', true) // Пример условия для активных кафедр
->get();
$this->addUrlsToSitemap($sitemap, $departments, function($department) {
return [
'route' => 'client.department.show',
'params' => ['facultySlug' => $department->faculty->slug, 'departmentSlug' => $department->slug],
'lastModificationDate' => $department->updated_at,
'priority' => 0.5,
];
});
}
protected function generateUsers(Sitemap $sitemap)
{
$users = User::query()
->whereHas('userDetail', function ($q) {
$q->where('is_only_worker', false);
})
->get();
$this->addUrlsToSitemap($sitemap, $users, function($user) {
return [
'route' => 'client.person.show',
'params' => ['slug' => $user->slug],
'lastModificationDate' => $user->updated_at,
'priority' => 0.5,
];
});
}
protected function addUrlsToSitemap(Sitemap $sitemap, $items, callable $callback)
{
foreach ($items as $item) {
$urlData = $callback($item);
$url = route($urlData['route'], $urlData['params']);
$sitemap->add(Url::create($url)
->setLastModificationDate($urlData['lastModificationDate'])
->setPriority($urlData['priority']));
}
}
}
-36
View File
@@ -1,36 +0,0 @@
<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\ImageManagerStatic as ImageTool;
class ImageController extends Controller
{
public function uploadImage(Request $request)
{
if ($request->hasFile('image')) {
$image = $request->file('image');
// Генерируем уникальное имя файла, чтобы избежать конфликтов
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . $image->getClientOriginalExtension();
// Сохраняем изображение в директорию public
ImageTool::configure(['driver' => 'imagick']);
ImageTool::make($image)
->resize(1200, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
})
->save(storage_path('app/public/images/' . $filename));
$path = "/storage/images/" . $filename;
// Генерируем URL для доступа к изображению
return response()->json(['success' => 1, 'file' => ['url' => $path]]);
}
return response()->json(['error' => 'Image upload failed']);
}
}
@@ -1,57 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
class ImportUserController extends Controller
{
public function index()
{
return User::query()->whereHas('userDetail')->with('userDetail')->get();
}
public function test()
{
$response = Http::get('http://crawdad-fresh-bream.ngrok-free.app/api/import/users/')->object();
foreach ($response as $user) {
$userDetail = $user->user_detail;
unset($user->user_detail);
$user = User::create([
'name' => $user->name,
'slug' => $user->slug,
'email' => $user->email,
'email_verified_at' => $user->email_verified_at,
'password' => Md5(Str::random(15)),
'remember_token' => null,
'created_at' => $user->created_at,
'updated_at' => $user->updated_at,
]);
$user->userDetail()->create([
'user_id' => $user->id,
'is_only_worker' => $userDetail->is_only_worker,
'photo' => $userDetail->photo,
'academicTitle' => $userDetail->academicTitle,
'AcademicDegree' => $userDetail->AcademicDegree,
'education' => $userDetail->education,
'awards' => $userDetail->awards,
'professDisciplines' => $userDetail->professDisciplines,
'professionalRetraining' => $userDetail->professionalRetraining,
'professionalDevelopment' => $userDetail->professionalDevelopment,
'workExperience' => $userDetail->workExperience,
'attendedConferences' => $userDetail->attendedConferences,
'participationScienceProjects' => $userDetail->participationScienceProjects,
'publications' => $userDetail->publications,
'contactEmail' => $userDetail->contactEmail,
'contactPhone' => $userDetail->contactPhone,
'search_data' => $userDetail->search_data,
'other' => $userDetail->other,
'created_at' => $userDetail->created_at,
'updated_at' => $userDetail->updated_at,
]);
}
}
}
@@ -1,81 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\PostResource;
use App\Http\Resources\StudentResource;
use App\Http\Resources\UserDetailResource;
use App\Models\Post;
use App\Models\Student;
use App\Models\UserDetail;
use Illuminate\Http\Request;
use Illuminate\Routing\Route;
class LinkToolController extends Controller
{
public function main(Request $request)
{
if ($request->input('url') == \route('client.person.show', ['userDetail' => substr($request->input('url'), -1)])) {
$userDetail = UserDetail::find(substr($request->input('url'), -1));
return response()->json([
'success' => 1,
'link' => Str($request->input('url')),
'meta' => [
'title' => $userDetail->surname . ' '. $userDetail->name . ' '. $userDetail->middleName,
'description' => $userDetail->administrativePosition,
'image' => [
'url' => $userDetail->photo
],
'type' => 'person',
'data' => new UserDetailResource($userDetail),
]
]);
}
if ($request->input('url') == \route('client.post.show', ['slug' => $this->getSlugFromUrl($request->input('url')) ])) {
$post = Post::query()->where('slug', '=', $this->getSlugFromUrl($request->input('url')))->first();
$content = json_decode($post->content);
foreach ($content->blocks as $data) {
if ($data->type === 'paragraph') {
return response()->json([
'success' => 1,
'link' => Str($request->input('url')),
'meta' => [
'title' => $post->title,
'description' => $data->data->text,
'type' => 'post',
'data' => new PostResource($post),
]
]);
}
}
}
if ($request->input('url') == \route('client.student.show', ['student' => substr($request->input('url'), -1)])) {
$student = Student::find(substr($request->input('url'), -1));
return response()->json([
'success' => 1,
'link' => Str($request->input('url')),
'meta' => [
'title' => $student->surname . ' '. $student->name . ' '. $student->middleName,
'description' => $student->position,
'image' => [
'url' => $student->photo
],
'type' => 'student',
'data' => new StudentResource($student),
]
]);
}
return false;
}
private function getSlugFromUrl($url)
{
$path = parse_url($url, PHP_URL_PATH);
$segments = explode('/', $path);
$lastSegment = end($segments);
return $lastSegment;
}
}
+10 -27
View File
@@ -2,36 +2,19 @@
namespace App\Http\Controllers;
use App\Enums\EducationalProgramStatus;
use App\Enums\LevelEducational;
use App\Enums\PostStatus;
use App\Http\Resources\AdditionalEducationResource;
use App\Http\Resources\ClientMainSliderResource;
use App\Http\Resources\ClientNavigationResource;
use App\Http\Resources\EventThumbnailResource;
use App\Http\Resources\MainSectionResource;
use App\Http\Resources\PostResource;
use App\Http\Resources\PostThumbnailResource;
use App\Models\AdditionalEducation;
use App\Models\AdditionalEducationCategory;
use App\Models\AdmissionCampaign;
use App\Models\DirectionStudy;
use App\Models\EducationalProgram;
use App\Models\Event;
use App\Models\MainSection;
use App\Models\MainSlider;
use App\Models\Page;
use App\Models\Post;
use App\Services\Filament\Icon\ArrayToCollectionService;
use App\Services\Vicon\EducationalProgram\EducationalProgramService;
use App\Containers\AdditionalEducation\Models\AdditionalEducation;
use App\Containers\AdditionalEducation\Models\AdditionalEducationCategory;
use App\Containers\AppStructure\Models\Page;
use App\Containers\Article\Enums\PostStatus;
use App\Containers\Article\Models\Post;
use App\Containers\Education\Models\AdmissionCampaign;
use App\Containers\Event\Models\Event;
use App\Containers\Event\UI\WEB\Transformers\EventThumbnailResource;
use App\Containers\Widget\UI\API\Transformers\PostThumbnailResource;
use App\Ship\Enums\Education\LevelEducational;
use Carbon\Carbon;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
class MainController extends Controller
@@ -1,73 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\MainSectionResource;
use App\Models\MainSection;
use App\Models\SubSection;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Inertia\Inertia;
class MainSectionController extends Controller
{
public function index()
{
$mainSections = MainSectionResource::collection(MainSection::paginate(10));
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/MainSection/Index', compact('mainSections', 'filters'));
}
public function create()
{
$subSections = SubSection::query()->where('main_section_id', '=', null)->get();
return Inertia::render('AdminPanel/MainSection/Create', compact('subSections'));
}
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|unique:main_sections|max:50|min:5',
'subSection_ids' => 'array',
'subSection_ids.*' => 'exists:sub_sections,id'
]);
$subSection_ids = $data['subSection_ids'];
unset($data['subSection_ids']);
$mainSection = MainSection::create($data);
SubSection::whereIn('id', $subSection_ids)->update(['main_section_id' => $mainSection->id]);
return redirect()->route('admin.mainSection.index');
}
public function edit(MainSection $mainSection)
{
$subSections = SubSection::query()->where('main_section_id', '=', $mainSection->id)->
orWhere('main_section_id', '=', null)
->get();
$subSection_ids = SubSection::query()->where('main_section_id', '=', $mainSection->id)->pluck('id');
$mainSection = new MainSectionResource($mainSection);
return Inertia::render('AdminPanel/MainSection/Edit', compact('mainSection', 'subSections', 'subSection_ids'));
}
public function update(MainSection $mainSection, Request $request)
{
$data = $request->validate([
'title' => 'required|unique:main_sections|max:50|min:5',
'subSection_ids' => 'array',
'subSection_ids.*' => 'exists:sub_sections,id'
]);
$subSection_ids = $data['subSection_ids'];
unset($data['subSection_ids']);
$mainSection->update($data);
SubSection::query()->where('main_section_id', '=', $mainSection->id)->update(['main_section_id' => NULL]);
SubSection::whereIn('id', $subSection_ids)->update(['main_section_id' => $mainSection->id]);
return redirect()->route('admin.mainSection.index');
}
public function destroy(MainSection $mainSection)
{
SubSection::query()->where('main_section_id', '=', $mainSection->id)->update(['main_section_id' => NULL]);
$mainSection->delete();
}
}
-58
View File
@@ -1,58 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Page\StoreRequest;
use App\Http\Requests\Page\UpdateRequest;
use App\Http\Resources\ClientBreadcrumbPage;
use App\Http\Resources\ClientBreadcrumbSection;
use App\Http\Resources\ClientBreadcrumbSubSection;
use App\Http\Resources\ClientNavigationResource;
use App\Http\Resources\MainSectionResource;
use App\Http\Resources\PageResource;
use App\Http\Resources\RegisteredPageResource;
use App\Models\MainSection;
use App\Models\Page;
use App\Models\Post;
use App\Services\App\Seo\SeoPageProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Redirect;
use Inertia\Inertia;
class PageController extends Controller
{
public function __construct(readonly SeoPageProvider $seoPageProvider){}
public function render(string $path): \Inertia\Response
{
// Генерируем уникальный ключ для кеширования
$cacheKey = 'page_' . md5($path);
// Пытаемся получить данные из кеша
$page = Cache::remember($cacheKey, now()->addHours(48), function () use ($path) {
return Page::where('path', '=', $path)
->with('section.pages.section', 'section.mainSection')
->first();
});
if ($page === null) {
abort(404);
}
$subSectionPages = $page->section ? PageResource::collection($page->section->pages) : null;
$seo = $this->seoPageProvider->getSeoForModel($page);
$page = new PageResource($page);
if ($page->code != 200) {
abort($page->code);
}
return Inertia::render('Page', compact('page', 'subSectionPages', 'seo'));
}
}
-40
View File
@@ -1,40 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Enums\CacheKeys;
use App\Http\Resources\ClientFullInfoPersonResource;
use App\Models\User;
use App\Services\App\Seo\SeoPageProvider;
use Illuminate\Support\Facades\Cache;
use Inertia\Inertia;
class PersonController extends Controller
{
public function __construct(readonly SeoPageProvider $seoPageProvider){}
public function show(string $slug)
{
$cacheKey = CacheKeys::USER_PREFIX->value . md5($slug);
$personData = Cache::remember(
CacheKeys::USER_PREFIX->value . $slug,
now()->addHours(24),
fn() => User::with(['userDetail', 'departments_work.faculty', 'departments_teach.faculty', 'divisions', 'faculties'])
->where('slug', $slug)
->firstOrFail()
);
$seo = Cache::remember(
CacheKeys::USER_PREFIX->value . 'seo_' . $slug,
now()->addHours(24),
fn() => $this->seoPageProvider->getSeoForModel($personData)
);
$person = new ClientFullInfoPersonResource($personData);
return Inertia::render('Client/Persons/Show', compact('person', 'seo'));
}
}
-175
View File
@@ -1,175 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Post\StoreRequest;
use App\Http\Resources\CategoryResource;
use App\Http\Resources\GalleryResource;
use App\Http\Resources\PostResource;
use App\Models\AuthorPost;
use App\Models\Category;
use App\Models\Gallery;
use App\Models\Image;
use App\Models\Post;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Sleep;
use Illuminate\Support\Str;
use Inertia\Inertia;
use Illuminate\Support;
use Intervention\Image\ImageManagerStatic as ImageTool;
class PostController extends Controller
{
/**
* Display a listing of the resource.
*/
function index(Request $request)
{
$posts = PostResource::collection(Post::query()
->when(request()->input('search'), function ($query, $search) {
$query->where('title', 'like', "%{$search}%");
})
->orderBy('publish_at', 'desc')
->paginate(request()->input('perPage', 9))
->withQueryString());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Events/Index', compact('posts', 'filters'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
$categories = CategoryResource::collection(Category::all());
return Inertia::render('AdminPanel/Events/Create', compact('categories'));
}
/**
* Store a newly created resource in storage.
*/
public function store(StoreRequest $request)
{
$data = $request->validated();
$data['slug'] = Str::slug($data['title'], '-');
$count = 0;
$original_slug = $data['slug'];
while (Post::where('slug', '=', $data['slug'])->exists()) {
$count++;
$data['slug'] = $original_slug . '-' . $count + 1;
}
$data['content'] = json_encode($data['content']);
$data['reading_time'] = $this->calculateReadingTime($data['search_data']);
$author = $data['author'];
$images = $data['images'];
unset($data['author']);
unset($data['images']);
$post = Post::create($data);
if (isset($author)) {
AuthorPost::create([
'name' => $author,
'post_id' => $post->id
]);
}
if (isset($images)) {
$gallery = Gallery::create([
'post_id' => $post->id,
]);
foreach ($images as $image) {
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . 'jpeg';
ImageTool::configure(['driver' => 'imagick']);
ImageTool::make($image)
->resize(1200, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
})
->save(storage_path('app/public/images/' . $filename));
$path = "/storage/images/" . $filename;
Image::create([
'path' => $path,
'gallery_id' => $gallery->id,
]);
}
}
return redirect()->route('admin.post.index');
}
/**
* Display the specified resource.
*/
public function show($slug)
{
$post = new PostResource(Post::where('slug', $slug)->firstOrFail());
return Inertia::render('AdminPanel/Events/Show', compact('post'));
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Post $post)
{
$categories = CategoryResource::collection(Category::all());
$post = new PostResource($post);
return Inertia::render('AdminPanel/Events/Edit', compact('post', 'categories'));
}
/**
* Update the specified resource in storage.
*/
public function update(Post $post, Request $request)
{
$data = $request->validate([
'title' => 'required|max:255|min:5',
'content' => 'required|array',
'content.blocks' => 'required|array|min:1',
'category_id' => 'nullable|exists:categories,id',
'is_published' => 'boolean',
]);
$data['slug'] = \Illuminate\Support\Str::slug($data['title'], '-');
$data['content'] = json_encode($data['content']);
$post->update($data);
return redirect()->route('admin.post.index');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Post $post)
{
$post->delete();
return redirect()->route('admin.post.index');
}
private function calculateReadingTime(string $text): int
{
$text = "lorem ipsum - это текст - часто используемый в печати и вэб-дизайне lorem ipsum является стандартной для текстов на латинице с начала xvi века в то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов используя lorem ipsum для распечатки образцов lorem ipsum не только успешно пережил без заметных изменений пять веков но и перешагнул в электронный дизайн его популяризации в новое время послужили публикация листов letraset с образцами lorem ipsum в 60-х годах и в более недавнее время программы электронной вёрстки типа aldus pagemaker в шаблонах которых используется lorem ipsum lorem ipsum - это текст - часто используемый в печати и вэб-дизайне lorem ipsum является стандартной для текстов на латинице с начала xvi века в то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов используя lorem ipsum для распечатки образцов lorem ipsum не только успешно пережил без заметных изменений пять веков но и перешагнул в электронный дизайн его популяризации в новое время послужили публикация листов letraset с образцами lorem ipsum в 60-х годах и в более недавнее время программы электронной вёрстки типа aldus pagemaker в шаблонах которых используется lorem ipsum";
// Calculate the number of words in the text
$wordCount = str_word_count($text,0,"АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя");
// Calculate the average reading speed in words per minute
$wordsPerMinute = 120; // You can adjust this value based on your desired reading speed
// Calculate the reading time in minutes
$readingTime = $wordCount / $wordsPerMinute;
// Round the reading time to the nearest integer
$readingTime = round($readingTime);
return $readingTime;
}
}
@@ -1,63 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\ProfileUpdateRequest;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
use Inertia\Inertia;
use Inertia\Response;
class ProfileController extends Controller
{
/**
* Display the user's profile form.
*/
public function edit(Request $request): Response
{
return Inertia::render('Profile/Edit', [
'mustVerifyEmail' => $request->user() instanceof MustVerifyEmail,
'status' => session('status'),
]);
}
/**
* Update the user's profile information.
*/
public function update(ProfileUpdateRequest $request): RedirectResponse
{
$request->user()->fill($request->validated());
if ($request->user()->isDirty('email')) {
$request->user()->email_verified_at = null;
}
$request->user()->save();
return Redirect::route('profile.edit');
}
/**
* Delete the user's account.
*/
public function destroy(Request $request): RedirectResponse
{
$request->validate([
'password' => ['required', 'current_password'],
]);
$user = $request->user();
Auth::logout();
$user->delete();
$request->session()->invalidate();
$request->session()->regenerateToken();
return Redirect::to('/');
}
}
@@ -1,94 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Schedule\StoreRequest;
use App\Http\Resources\ClientNavigationResource;
use App\Http\Resources\FacultyResource;
use App\Http\Resources\MainSectionResource;
use App\Http\Resources\ScheduleResource;
use App\Models\Faculty;
use App\Models\MainSection;
use App\Models\Schedule;
use App\Models\SubSchedule;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\Rules\File;
use Inertia\Inertia;
class ScheduleController extends Controller
{
public function index()
{
$schedules = ScheduleResource::collection(Schedule::query()->ExistSubSchedule()->orderBy('name')->paginate(10));
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Schedules/Index', compact('schedules', 'filters'));
}
public function create()
{
$faculties = FacultyResource::collection(Faculty::all());
return Inertia::render('AdminPanel/Schedules/Create', compact('faculties'));
}
public function store(StoreRequest $request)
{
$data = $request->validated();
$this->storeSchedules($request->file('files'), $data);
return redirect()->route('admin.index');
}
public function show(Schedule $schedule)
{
$schedule = new ScheduleResource($schedule);
return Inertia::render('AdminPanel/Schedules/Show', compact('schedule'));
}
public function destroy(Schedule $schedule)
{
$schedule->delete();
}
private function storeSchedules($files, $data)
{
foreach ($files as $file) {
$scheduleTitle = $this->generateScheduleTitle($file);
$schedule = $this->storeSchedule($scheduleTitle, $data);
$this->storeSubSchedule($file, $schedule);
}
}
private function generateScheduleTitle($file)
{
$str = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$words = explode(' ', $str);
return implode(' ', array_slice($words, 0, 2));
}
private function storeSchedule($title, $data)
{
return Schedule::firstOrCreate([
'name' => $title,
'faculty_id' => $data['faculty_id'],
'is_fullTime' => $data['is_fullTime'],
]);
}
private function storeSubSchedule($file, $schedule)
{
$path = Storage::disk('public')->putFileAs('/schedules', $file, $file->getClientOriginalName());
SubSchedule::updateOrCreate([
'name' => pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME),
'path_file' => '/storage/'.$path,
'schedule_id' => $schedule->id,
]);
}
}
-175
View File
@@ -1,175 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\AdditionalEducationSearchResource;
use App\Http\Resources\EducationalProgramSearchResource;
use App\Http\Resources\EducationGroupSearchResource;
use App\Http\Resources\EventSearchResource;
use App\Http\Resources\FacultySearchResource;
use App\Http\Resources\PageSearchResource;
use App\Http\Resources\PostSearchResource;
use App\Http\Resources\UserSearchResource;
use App\Models\AdditionalEducation;
use App\Models\EducationalGroup;
use App\Models\EducationalProgram;
use App\Models\Event;
use App\Models\Faculty;
use App\Models\Page;
use App\Models\Post;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Date;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Str;
use ProtoneMedia\LaravelCrossEloquentSearch\Search;
class SearchController extends Controller
{
private array $resourceMap = [
Post::class => PostSearchResource::class,
Page::class => PageSearchResource::class,
EducationalGroup::class => EducationGroupSearchResource::class,
EducationalProgram::class => EducationalProgramSearchResource::class,
Event::class => EventSearchResource::class,
AdditionalEducation::class => AdditionalEducationSearchResource::class, //??
User::class => UserSearchResource::class, //??
Faculty::class => FacultySearchResource::class, //??
];
public function index(Request $request)
{
$req = Str::lower($request->query('search'));
if (!$req) {
return response()->json([
'searchRes' => null,
]);
}
$results = Search::new()
->add(Post::where('status', '=', 'published'), ['title', 'search_data'], 'publish_at')
->add(Page::with('section')->where('searchable', '=', true), ['title', 'search_data'])
->add(Event::where('event_date_start', '>', Date::now()), 'title', 'created_at')
->add(AdditionalEducation::where('is_active', '=', true), 'title')
->add(EducationalGroup::with('schedules'), 'title')
->add(EducationalProgram::where('status', '=', true)->whereHas('admission_plans'), 'name')
->add(Faculty::where('is_active', '=', true), 'title')
->add(User::whereHas('userDetail'), 'name')
->orderByDesc()
->beginWithWildcard()
// ->orderByRelevance()
->includeModelType()
->ignoreCase(true)
->search("$req");
$resourceMap = $this->resourceMap;
$resources = collect($results)->map(function ($result) use ($resourceMap) {
$resourceClass = $resourceMap[get_class($result)] ?? null;
return $resourceClass ? new $resourceClass($result) : null;
});
$result_type = $this->getCategoriesSearchResult($resources);
if ($request->query('category')) {
$resources = $this->sortResourcesByCategory($resources, $request->query('category'));
}
$paginate_data = $this->createPaginate($resources, $request, 7);
$sortedData = $this->sortByType($paginate_data['paginator'], $req);
return response()->json([
'searchRes' => $sortedData,
'result_type' => $result_type,
'selectedCategory' => ($request->query('category') !== null) ? $request->query('category') : null,
'paginate' => [
'current_page' => $paginate_data['paginator']->currentPage(),
'last_page' => $paginate_data['paginator']->lastPage(),
'total' => $paginate_data['paginator']->total(),
'next_page' => $paginate_data['next_page'],
'prev_page' => $paginate_data['prev_page'],
]
]);
}
private function sortByType(object $data, string $searchRequest): array
{
$sortedData = [];
foreach ($data as $item) {
$searchData = $item['search_data'] ?? '';
$matches = $this->getMatches($searchData, $searchRequest);
$sortedData[$item['type']][] = [
'data' => $item,
'matches' => $matches,
'tag' => $item['type']
];
}
return $sortedData;
}
private function getMatches(string $haystack, string $needle): array
{
$matches = [];
// while (($offset = mb_strpos($haystack, $needle, $offset, 'UTF-8')) !== false) {
// $left = max(0, $offset - 50);
// $right = min(mb_strlen($haystack, 'UTF-8'), $offset + 100);
// $excerpt = mb_substr($haystack, $left, $right - $left, 'UTF-8');
// $matches[] = $excerpt;
// $offset += mb_strlen($needle, 'UTF-8');
// }
$offset = 0;
if (($offset = mb_strpos($haystack, $needle, $offset, 'UTF-8')) !== false) {
for ($i = 0; 1 > count($matches); $i++) {
$left = max(0, $offset - 50);
$right = min(mb_strlen($haystack, 'UTF-8'), $offset + 100);
$excerpt = mb_substr($haystack, $left, $right - $left, 'UTF-8');
$matches[] = $excerpt;
}
}
return $matches;
}
private function sortResourcesByCategory(Collection $resources, string $category) : Collection
{
if ($category === "All") {
$data = $resources;
} else {
$data = $resources->where('type', $category);
}
return $data;
}
private function getCategoriesSearchResult(Collection $resources)
{
return $resources->pluck('type')->unique()->values()->all();
}
private function createPaginate($resources, $request, $perPage = 10) : array
{
$currentPage = LengthAwarePaginator::resolveCurrentPage();
// Отрезаем нужные элементы для текущей страницы
$currentItems = $resources->slice(($currentPage - 1) * $perPage, $perPage)->all();
// Создаем экземпляр LengthAwarePaginator
$paginator = new LengthAwarePaginator($currentItems, count($resources), $perPage, $currentPage, [
'path' => $request->url(),
'query' => $request->query,
]);
$nextPage = $paginator->hasMorePages() ? $paginator->currentPage() + 1 : null;
$prevPage = $paginator->onFirstPage() ? null : $paginator->currentPage() - 1;
return [
'paginator' => $paginator,
'next_page' => $nextPage,
'prev_page' => $prevPage
];
}
}
@@ -1,25 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Services\Filament\Services\CategoryFinderService;
use App\Services\Filament\Services\StaticFileSearch;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class StaticSearchController extends Controller
{
public function search(Request $request)
{
return app(StaticFileSearch::class)
->search($request);
}
public function getCategories()
{
return Cache::remember('page_static_categories', now()->addWeek(), function () {
return app(CategoryFinderService::class)->getCategories();
});
}
}
@@ -1,92 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Inertia\Inertia;
use App\Models\Student;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use App\Http\Requests\Student\StoreRequest;
use App\Http\Requests\Student\UpdateRequest;
use App\Http\Resources\StudentResource;
use App\Models\UserDetail;
use Carbon\Carbon;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\ImageManagerStatic as ImageTool;
class StudentController extends Controller
{
public function index()
{
$students = StudentResource::collection(Student::paginate(10));
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Student/Index', compact('students', 'filters'));
}
public function show(Student $student)
{
$student = new StudentResource($student);
return Inertia::render('Client/Student/Show', compact('student'));
}
public function create()
{
return Inertia::render('AdminPanel/Student/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
if ($request->file('photo')) {
$data['photo'] = $this->storePhoto($request->file('photo'));
}
Student::create($data);
return redirect()->route('admin.student.index');
}
public function edit(Student $student)
{
return Inertia::render('AdminPanel/Student/Edit', compact('student'));
}
public function update(Student $student, UpdateRequest $request)
{
$data = $request->validated();
if ($request->file('photo')) {
$data['photo'] = $this->storePhoto($request->file('photo'));
}
$student->update($data);
return redirect()->route('admin.student.index');
}
public function destroy(Student $student)
{
$student->delete();
}
private function storePhoto(UploadedFile $file)
{
if ($file->isValid()) {
$image = $file;
// Генерируем уникальное имя файла, чтобы избежать конфликтов
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . $image->getClientOriginalExtension();
// Сохраняем изображение в директорию public
ImageTool::configure(['driver' => 'imagick']);
ImageTool::make($image)
->resize(1200, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
})
->save(storage_path('app/public/photos/' . $filename));
$path = "/storage/photos/" . $filename;
// Генерируем URL для доступа к изображению
return $path;
}
}
}
@@ -1,16 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Models\SubSchedule;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class SubScheduleController extends Controller
{
public function destroy(SubSchedule $subSchedule)
{
Storage::delete($subSchedule->path_file);
$subSchedule->delete();
}
}
@@ -1,79 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Resources\SubSectionResource;
use App\Models\Page;
use App\Models\SubSection;
use Illuminate\Http\Request;
use Inertia\Inertia;
class SubSectionController extends Controller
{
public function index()
{
$subSections = SubSectionResource::collection(SubSection::paginate(10));
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/SubSection/Index', compact('subSections', 'filters'));
}
public function create()
{
$pages = Page::query()
->where('sub_section_id', '=', null)
->where('is_visible', '=', 1)
->where('title', '!=', null)
->get();
return Inertia::render('AdminPanel/SubSection/Create', compact('pages'));
}
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|unique:main_sections|max:50|min:5',
'page_ids' => 'array',
'page_ids.*' => 'exists:pages,id'
]);
$page_ids = $data['page_ids'];
unset($data['page_ids']);
$subSection = SubSection::create($data);
Page::whereIn('id', $page_ids)->update(['sub_section_id' => $subSection->id]);
return redirect()->route('admin.subSection.index');
}
public function edit(SubSection $subSection)
{
$pages = Page::query()->where('sub_section_id', $subSection->id)
->orWhere(function ($query) {
$query->where('sub_section_id', null);
$query->where('is_visible', 1);
$query->where('title', '!=', null);
})->get();
$page_ids = Page::query()->where('sub_section_id', '=', $subSection->id)->pluck('id');
$subSection = new SubSectionResource($subSection);
return Inertia::render('AdminPanel/SubSection/Edit', compact('subSection', 'pages', 'page_ids'));
}
public function update(SubSection $subSection, Request $request)
{
$data = $request->validate([
'title' => 'required|unique:categories|max:50|min:5',
'page_ids' => 'array',
'page_ids.*' => 'exists:pages,id'
]);
$page_ids = $data['page_ids'];
unset($data['page_ids']);
$subSection->update($data);
Page::query()->where('sub_section_id', '=', $subSection->id)->update(['sub_section_id' => NULL]);
Page::whereIn('id', $page_ids)->update(['sub_section_id' => $subSection->id]);
return redirect()->route('admin.subSection.index');
}
public function destroy(SubSection $subSection)
{
Page::query()->where('sub_section_id', '=', $subSection->id)->update(['sub_section_id' => NULL]);
$subSection->delete();
}
}
-10
View File
@@ -1,10 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TagController extends Controller
{
//
}
@@ -1,23 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Jobs\CreateAdmissionPlan;
use App\Jobs\CreateDirectionStudy;
use App\Jobs\CreateEducationalProgram;
use App\Services\Vicon\EducationalProgram\EducationalProgramService;
class UpdateAdmissionPlansDataApiController extends Controller
{
public function index()
{
$this->clearAndCreateAdmissionPlans();
return redirect()->route('index');
}
private function clearAndCreateAdmissionPlans() : void
{
dispatch(new CreateAdmissionPlan());
}
}
@@ -1,27 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Jobs\CreateDirectionStudy;
use App\Jobs\CreateEducationalProgram;
use App\Services\Vicon\EducationalProgram\EducationalProgramService;
class UpdateEduDataApiController extends Controller
{
public function index()
{
$this->updateOrCreateDirectionStudy();
$this->updateOrCreateEducationProgram();
return redirect()->route('index');
}
private function updateOrCreateDirectionStudy() : void
{
dispatch(new CreateDirectionStudy());
}
private function updateOrCreateEducationProgram() : void
{
dispatch(new CreateEducationalProgram());
}
}
-59
View File
@@ -1,59 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\User\StoreRequest;
use App\Http\Requests\User\UpdateRequest;
use App\Http\Resources\PostResource;
use App\Http\Resources\UserResource;
use App\Models\User;
use Illuminate\Http\Request;
use Inertia\Inertia;
class UserController extends Controller
{
public function index()
{
$users = UserResource::collection(User::all());
$filters = [
'search' => request()->input('search'),
];
return Inertia::render('AdminPanel/Users/Index', compact('users', 'filters'));
}
public function show(int $id)
{
$user = new PostResource(User::find($id));
return Inertia::render('AdminPanel/Users/Show', compact('user'));
}
public function create()
{
return Inertia::render('AdminPanel/Users/Create');
}
public function store(StoreRequest $request)
{
$data = $request->validated();
User::firstOrCreate($data);
return redirect()->route('admin.user.index');
}
public function edit(User $user)
{
$user = new UserResource($user);
return Inertia::render('AdminPanel/Users/Edit', compact('user'));
}
public function update(UpdateRequest $request, User $user)
{
$data = $request->validated();
$user->update($data);
return redirect()->route('admin.user.index');
}
public function destroy(User $user)
{
$user->delete();
}
}
@@ -1,68 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\UserDetail\StoreRequest;
use App\Http\Requests\UserDetail\UpdateRequest;
use App\Models\User;
use App\Models\UserDetail;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Inertia\Inertia;
use Intervention\Image\ImageManagerStatic as ImageTool;
class UserDetailController extends Controller
{
public function create(User $user)
{
$userId = $user->id;
return Inertia::render('AdminPanel/UserDetail/Create', compact('userId'));
}
public function store(StoreRequest $request)
{
$data = $request->validated();
if ($request->file('photo')) {
$data['photo'] = $this->storePhoto($request->file('photo'));
}
UserDetail::create($data);
return redirect()->route('admin.user.index');
}
public function edit(UserDetail $userDetail)
{
return Inertia::render('AdminPanel/UserDetail/Edit', compact('userDetail'));
}
public function update(UserDetail $userDetail, UpdateRequest $request)
{
$data = $request->validated();
if ($request->file('photo')) {
$data['photo'] = $this->storePhoto($request->file('photo'));
}
$userDetail->update($data);
return redirect()->route('admin.user.index');
}
private function storePhoto(UploadedFile $file)
{
if ($file->isValid()) {
$image = $file;
// Генерируем уникальное имя файла, чтобы избежать конфликтов
$filename = md5(Carbon::now() . '_' . $image->getClientOriginalName()) . '.' . $image->getClientOriginalExtension();
// Сохраняем изображение в директорию public
ImageTool::configure(['driver' => 'imagick']);
ImageTool::make($image)
->resize(1200, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
})
->save(storage_path('app/public/photos/' . $filename));
$path = "/storage/photos/" . $filename;
// Генерируем URL для доступа к изображению
return $path;
}
}
}
-18
View File
@@ -1,18 +0,0 @@
<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Str;
use Inertia\Inertia;
class VkAuthController extends Controller
{
}
-66
View File
@@ -1,66 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Jobs\CreateVkPost;
use App\Services\VK\VkAuthService;
use App\Services\VK\VkService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Inertia\Inertia;
use Symfony\Component\Finder\Finder;
use VK\Client\VKApiClient;
use VK\OAuth\Scopes\VKOAuthUserScope;
use VK\OAuth\VKOAuth;
use VK\OAuth\VKOAuthDisplay;
use VK\OAuth\VKOAuthResponseType;
class VkPostController extends Controller
{
private string $wall_token;
private VkService $vkService;
public function __construct()
{
$this->vkService = new VkService(new VKApiClient());
$this->wall_token = env('WALL_ACCESS_VK_TOKEN');
}
public function wall()
{
dd($this->vkService->getPostById(39));
}
public function getImages()
{
// Укажите путь к директории
$directory = 'public/images';
// Получаем все файлы из директории
$files = Storage::files($directory);
// Фильтруем только изображения (например, jpg, png)
$images = array_filter($files, function ($file) {
return in_array(pathinfo($file, PATHINFO_EXTENSION), ['webp', 'jpeg', 'png', 'gif']);
});
// Формируем полный URL для каждого изображения
$imageUrls = array_map(function ($file) {
return url(Storage::url($file)); // Добавляем домен
}, $images);
return $imageUrls; // Возвращаем массив с полными URL изображений
}
}
@@ -1,17 +0,0 @@
<?php
namespace App\Http\Controllers\api;
use App\Http\Controllers\Controller;
use App\Http\Resources\ClientNavigationResource;
use App\Http\Resources\MainSectionResource;
use App\Models\MainSection;
use Illuminate\Http\Request;
class NavigateController extends Controller
{
public function index()
{
return ClientNavigationResource::collection(MainSection::with('subSections.pages')->orderBy('sort', 'asc')->get());
}
}
+1 -2
View File
@@ -2,8 +2,7 @@
namespace App\Http\Middleware;
use App\Models\Page;
use App\Containers\AppStructure\Models\Page;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
@@ -2,7 +2,7 @@
namespace App\Http\Middleware;
use App\Models\CustomForm;
use App\Containers\Widget\Models\CustomForm;
use Carbon\Carbon;
use Closure;
use Illuminate\Http\Request;
+4 -5
View File
@@ -2,13 +2,12 @@
namespace App\Http\Middleware;
use App\Http\Resources\ClientBreadcrumbPage;
use App\Http\Resources\ClientBreadcrumbSection;
use App\Http\Resources\ClientBreadcrumbSubSection;
use App\Models\Page;
use App\Containers\AppStructure\Models\Page;
use App\Ship\Resources\Breadcrumb\ClientBreadcrumbPage;
use App\Ship\Resources\Breadcrumb\ClientBreadcrumbSection;
use App\Ship\Resources\Breadcrumb\ClientBreadcrumbSubSection;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class GenerateBreadcrumbs
{
@@ -2,8 +2,8 @@
namespace App\Http\Middleware;
use App\Http\Resources\ClientNavigationResource;
use App\Models\MainSection;
use App\Containers\AppStructure\Models\MainSection;
use App\Containers\AppStructure\UI\API\Transformers\NavigationResource;
use App\Services\App\Breadcrumb\BreadcrumbService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
@@ -23,7 +23,7 @@ class HandleInertiaRequests extends Middleware
{
// Навигация (кешированная)
$navigation = Cache::remember('navigation', now()->addHours(1), function () {
return ClientNavigationResource::collection(
return NavigationResource::collection(
MainSection::with('subSections.pages.section')
->orderBy('sort', 'asc')
->get()
@@ -1,32 +0,0 @@
<?php
namespace App\Http\Requests\ApplicantQuestion;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'first_name' => 'required|string|min:2',
'last_name' => 'required|string|min:2',
'email' => 'required|email|min:2',
'phone' => 'required|numeric|min:11',
'text' => 'required|string|min:10',
];
}
}
@@ -1,29 +0,0 @@
<?php
namespace App\Http\Requests\Department;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => 'required|unique:faculties|min:2',
'faculty_id' => 'required|exists:faculties,id'
];
}
}
@@ -1,29 +0,0 @@
<?php
namespace App\Http\Requests\Department;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => 'required|min:2|unique:faculties',
'faculty_id' => 'required|exists:faculties,id'
];
}
}
@@ -1,30 +0,0 @@
<?php
namespace App\Http\Requests\Division;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => 'required|string',
'description' => 'required|array',
'description.blocks' => 'required|array|min:1',
];
}
}
@@ -1,30 +0,0 @@
<?php
namespace App\Http\Requests\Division;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => 'required|string',
'description' => 'required|array',
'description.blocks' => 'required|array|min:1',
];
}
}
-33
View File
@@ -1,33 +0,0 @@
<?php
namespace App\Http\Requests\Event;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => 'required|max:255|min:5',
'content' => 'required|array',
'content.blocks' => 'required|array|min:1',
'event_date' => 'required|date',
'address' => 'string',
'is_online' => 'required|boolean',
];
}
}
-34
View File
@@ -1,34 +0,0 @@
<?php
namespace App\Http\Requests\Event;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => 'required|max:255|min:5',
'content' => 'required|array',
'content.blocks' => 'required|array|min:1',
'event_date' => 'required|date',
'address' => 'string',
'is_online' => 'required|boolean',
];
}
}
@@ -1,28 +0,0 @@
<?php
namespace App\Http\Requests\Faculty;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => 'required|unique:faculties|min:2'
];
}
}
@@ -1,28 +0,0 @@
<?php
namespace App\Http\Requests\Faculty;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => 'required|min:2|unique:faculties',
];
}
}
-37
View File
@@ -1,37 +0,0 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class FormResponseRequest extends FormRequest
{
private array $rules;
public function __construct(array $rules)
{
$this->rules = $rules;
}
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
dd(1);
return [
];
}
}
-34
View File
@@ -1,34 +0,0 @@
<?php
namespace App\Http\Requests\Page;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => 'required|max:255|min:5',
'content' => 'required|array',
'content.blocks' => 'required|array|min:1',
'code' => 'required|integer',
'slug' => 'required|unique:pages,slug',
'path' => 'required|unique:pages,path',
'search_data' => 'required|string'
];
}
}
-33
View File
@@ -1,33 +0,0 @@
<?php
namespace App\Http\Requests\Page;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => 'required|max:255|min:5',
'content' => 'required|array',
'content.blocks' => 'required|array|min:1',
'code' => 'required|integer',
'slug' => 'required|unique:pages,slug,'.$this->id,
'path' => 'required|unique:pages,path,'.$this->id,
];
}
}
-35
View File
@@ -1,35 +0,0 @@
<?php
namespace App\Http\Requests\Post;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'title' => 'required|max:255|min:5',
'content' => 'required|array',
'content.blocks' => 'required|array|min:1',
'is_published' => 'required|boolean',
'category_id' => 'nullable|exists:categories,id',
'author' => 'nullable|string|min:5',
'images' => 'nullable|array',
'search_data' => 'required|string'
];
}
}
@@ -1,23 +0,0 @@
<?php
namespace App\Http\Requests;
use App\Models\User;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class ProfileUpdateRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\Rule|array|string>
*/
public function rules(): array
{
return [
'name' => ['string', 'max:255'],
'email' => ['email', 'max:255', Rule::unique(User::class)->ignore($this->user()->id)],
];
}
}
@@ -1,32 +0,0 @@
<?php
namespace App\Http\Requests\Schedule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules\File;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'faculty_id' => 'required|exists:faculties,id|integer',
'is_fullTime' => 'required|boolean',
'files' => 'required|array',
'files.*' => ['required', File::types('pdf')]
];
}
}
@@ -1,35 +0,0 @@
<?php
namespace App\Http\Requests\Student;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'required|string',
'surname' => 'required|string',
'middleName' => 'nullable|string',
'position' => 'nullable|string',
'education' => 'nullable|string',
'vk_link' => 'nullable|string',
'contactEmail' => 'nullable|email',
'contactPhone' => 'nullable|string',
];
}
}
@@ -1,35 +0,0 @@
<?php
namespace App\Http\Requests\Student;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'required|string',
'surname' => 'required|string',
'middleName' => 'nullable|string',
'position' => 'nullable|string',
'education' => 'nullable|string',
'vk_link' => 'nullable|string',
'contactEmail' => 'nullable|email',
'contactPhone' => 'nullable|string',
];
}
}
-29
View File
@@ -1,29 +0,0 @@
<?php
namespace App\Http\Requests\User;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'email' => 'required|email',
'password' => 'required|min:6|confirmed',
];
}
}
-28
View File
@@ -1,28 +0,0 @@
<?php
namespace App\Http\Requests\User;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
//
];
}
}
@@ -1,45 +0,0 @@
<?php
namespace App\Http\Requests\UserDetail;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'user_id' => 'required|exists:users,id|integer',
'name' => 'required|string',
'surname' => 'required|string',
'middleName' => 'nullable|string',
'academicTitle' => 'nullable|string',
'educatorPosition' => 'nullable|string',
'education' => 'nullable|string',
'awards' => 'nullable|string',
'professDisciplines' => 'nullable|string',
'professionalRetraining' => 'nullable|string',
'professionalDevelopment' => 'nullable|string',
'workExperience' => 'nullable|integer',
'attendedConferences' => 'nullable|string',
'participationScience_projects' => 'nullable|string',
'publications' => 'nullable|string',
'trainingAids' => 'nullable|string',
'contactEmail' => 'nullable|email',
'contactPhone' => 'nullable|string',
];
}
}
@@ -1,44 +0,0 @@
<?php
namespace App\Http\Requests\UserDetail;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'required|string',
'surname' => 'required|string',
'middleName' => 'nullable|string',
'academicTitle' => 'nullable|string',
'educatorPosition' => 'nullable|string',
'education' => 'nullable|string',
'awards' => 'nullable|string',
'professDisciplines' => 'nullable|string',
'professionalRetraining' => 'nullable|string',
'professionalDevelopment' => 'nullable|string',
'workExperience' => 'nullable|integer',
'attendedConferences' => 'nullable|string',
'participationScience_projects' => 'nullable|string',
'publications' => 'nullable|string',
'trainingAids' => 'nullable|string',
'contactEmail' => 'nullable|email',
'contactPhone' => 'nullable|string',
];
}
}
@@ -1,23 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class AdditionalEducationCategoryPreviewResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
];
}
}
@@ -1,23 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class AdditionalEducationCategoryResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'additionalEducations' => $this->additionalEducations
];
}
}
@@ -1,31 +0,0 @@
<?php
namespace App\Http\Resources;
use App\Enums\FormEducation;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class AdditionalEducationResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->content,
'category' => $this->category->title,
'directionAdditionalEducation' => new DirectionAdditionalEducationResource($this->category->direction),
'target_group' => $this->target_group,
'price' => $this->price,
'qualification' => $this->qualification,
'learning_time' => $this->learning_time,
'form_education' => $this->form_education->getLabel(),
];
}
}
@@ -1,23 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class AdditionalEducationSearchResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class AdditionalEducationSelectResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}
@@ -1,29 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ApplicantQuestionResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'first_name' => $this->first_name,
'last_name' => $this->last_name,
'email' => $this->email,
'phone' => $this->phone,
'text' => $this->text,
'created_at' => $this->created_at,
];
}
}
@@ -1,24 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class CampaignDegreeResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'slug' => $this->slug,
'naprs' => DirectionStudyResource::collection($this->directionStudiesHasPrograms)
];
}
}
-24
View File
@@ -1,24 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class CategoryResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'created_at' => $this->created_at->diffforhumans(),
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientAcademicJournalListResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}
@@ -1,23 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientBreadcrumbPage extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'title' => $this->title,
'slug' => $this->slug,
'path' => $this->path
];
}
}
@@ -1,22 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientBreadcrumbSection extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'title' => $this->title ?? null,
'slug' => $this->slug ?? null,
];
}
}
@@ -1,22 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientBreadcrumbSubSection extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'title' => $this->title,
'slug' => $this->slug,
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientContactWidgetResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}
@@ -1,23 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientDepartmentPreviewResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
];
}
}
@@ -1,24 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientEducationalGroupResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'schedules' => ClientScheduleSearchResource::collection($this->schedules),
'faculty' => $this->faculty->title,
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientEventCategoryResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}
@@ -1,32 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Carbon;
use Ramsey\Uuid\Type\Integer;
class ClientEventFullResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'content' => $this->content,
'event_date_start' => $this->event_date_start,
'event_time_start' => Carbon::parse($this->event_time_start)->format('H:i'),
'address' => $this->address,
'is_online' => $this->is_online,
'category' => $this->category ?? null,
];
}
}
@@ -1,29 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Carbon;
class ClientEventResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'event_date_start' => $this->event_date_start,
'event_time_start' => Carbon::parse($this->event_time_start)->format('H:i'),
'address' => $this->address,
'is_online' => $this->is_online,
'category' => $this->category ?? null,
];
}
}
-19
View File
@@ -1,19 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientFormResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}
@@ -1,27 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientFullInfoPersonResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'details' => new ClientPersonDetailResource($this->whenLoaded('userDetail')),
'departments_work' => ClientPersonDepartmentsWorkResource::collection($this->whenLoaded('departments_work')),
'departments_teach' => ClientPersonDepartmentsTeachResource::collection($this->whenLoaded('departments_teach')),
'divisions_works' => ClientPersonDivisionsWorkResource::collection($this->whenLoaded('divisions')),
'faculties_works' => ClientPersonFacultiesWorkResource::collection($this->whenLoaded('faculties'))
];
}
}
@@ -1,19 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ClientJournalIssueListResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}

Some files were not shown because too many files have changed in this diff Show More