Files
ntspi-app/app/Containers/Dashboard/UI/WEB/Controllers/AdditionalEducationController.php
2026-04-07 17:54:26 +05:00

166 lines
6.3 KiB
PHP

<?php
namespace App\Containers\Dashboard\UI\WEB\Controllers;
use App\Containers\AdditionalEducation\Models\AdditionalEducation;
use App\Containers\Dashboard\Actions\AdditionalEducations\CreateAdditionalEducationAction;
use App\Containers\Dashboard\Actions\AdditionalEducations\DeleteAdditionalEducationAction;
use App\Containers\Dashboard\Actions\AdditionalEducations\ListAdditionalEducationsAction;
use App\Containers\Dashboard\Actions\AdditionalEducations\UpdateAdditionalEducationAction;
use App\Containers\Dashboard\UI\WEB\Requests\StoreAdditionalEducationRequest;
use App\Containers\Dashboard\UI\WEB\Requests\UpdateAdditionalEducationRequest;
use App\Http\Controllers\Controller;
use App\Services\Filament\Domain\Seo\SeoGeneratorService;
use App\Ship\Contracts\SeoDescriptionInterface;
use App\Ship\Contracts\SeoTitleInterface;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Inertia\Inertia;
class AdditionalEducationController extends Controller
{
public function __construct(
private readonly ListAdditionalEducationsAction $listAdditionalEducationsAction,
private readonly CreateAdditionalEducationAction $createAdditionalEducationAction,
private readonly UpdateAdditionalEducationAction $updateAdditionalEducationAction,
private readonly DeleteAdditionalEducationAction $deleteAdditionalEducationAction,
private readonly SeoGeneratorService $seoGeneratorService,
) {}
/**
* Показывает список программ дополнительного образования
*/
public function index(Request $request): \Inertia\Response
{
$filters = $request->only(['search', 'category_id', 'form_education', 'is_active']);
$data = $this->listAdditionalEducationsAction->run($filters);
return Inertia::render('Dashboard/AdditionalEducations/Index', $data);
}
/**
* Показывает форму создания программы
*/
public function create(): \Inertia\Response
{
$data = $this->listAdditionalEducationsAction->run([]);
return Inertia::render('Dashboard/AdditionalEducations/Create', [
'categories' => $data['categories'],
'educationForms' => $data['educationForms'],
]);
}
/**
* Создает новую программу дополнительного образования
*/
public function store(StoreAdditionalEducationRequest $request): RedirectResponse
{
try {
$validated = $request->validated();
$education = $this->createAdditionalEducationAction->run($validated);
$this->createSeo($education);
return redirect()->route('dashboard.additional-educations.index')
->with('success', 'Программа дополнительного образования успешно создана!');
} catch (\Exception $e) {
return back()
->withInput()
->with('error', 'Ошибка при создании программы: ' . $e->getMessage());
}
}
/**
* Показывает форму редактирования программы
*/
public function edit(AdditionalEducation $additionalEducation): \Inertia\Response
{
$additionalEducation->load(['category', 'seo']);
$data = $this->listAdditionalEducationsAction->run([]);
return Inertia::render('Dashboard/AdditionalEducations/Edit', [
'education' => $additionalEducation,
'categories' => $data['categories'],
'educationForms' => $data['educationForms'],
]);
}
/**
* Обновляет существующую программу дополнительного образования
*/
public function update(UpdateAdditionalEducationRequest $request, AdditionalEducation $additionalEducation): RedirectResponse
{
try {
$validated = $request->validated();
$this->updateAdditionalEducationAction->run($additionalEducation, $validated);
$this->updateSeo($additionalEducation);
return redirect()->route('dashboard.additional-educations.index')
->with('success', 'Программа дополнительного образования успешно обновлена!');
} catch (\Exception $e) {
return back()
->withInput()
->with('error', 'Ошибка при обновлении программы: ' . $e->getMessage());
}
}
/**
* Удаляет программу дополнительного образования
*/
public function destroy(AdditionalEducation $additionalEducation): RedirectResponse
{
try {
$this->deleteAdditionalEducationAction->run($additionalEducation);
return redirect()->route('dashboard.additional-educations.index')
->with('success', 'Программа дополнительного образования успешно удалена!');
} catch (\Exception $e) {
return back()
->with('error', 'Ошибка при удалении программы: ' . $e->getMessage());
}
}
/**
* Генерирует и создает SEO данные
*/
private function createSeo(AdditionalEducation $record): void
{
$seoData = $this->generateSeoData($record);
$record->seo()->create($seoData);
}
/**
* Обновляет SEO данные
*/
private function updateSeo(AdditionalEducation $record): void
{
if ($record->seo()->exists()) {
$record->seo()->update($this->generateSeoData($record));
} else {
$this->createSeo($record);
}
}
/**
* Генерирует SEO данные из записи
*/
private function generateSeoData(AdditionalEducation $record): array
{
return $this->seoGeneratorService->generate([
'title' => $record instanceof SeoTitleInterface
? $record->getSeoTitle()
: $record->title,
'content' => $record instanceof SeoDescriptionInterface
? $record->getSeoDescription()
: ($record->content ?? []),
'preview' => $record->preview ?? null,
]);
}
}