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

166 lines
5.5 KiB
PHP

<?php
namespace App\Containers\Dashboard\UI\WEB\Controllers;
use App\Containers\Dashboard\Actions\UserDetails\CreateUserDetailAction;
use App\Containers\Dashboard\Actions\UserDetails\DeleteUserDetailAction;
use App\Containers\Dashboard\Actions\UserDetails\UpdateUserDetailAction;
use App\Containers\Dashboard\UI\WEB\Requests\StoreUserDetailRequest;
use App\Containers\Dashboard\UI\WEB\Requests\UpdateUserDetailRequest;
use App\Containers\User\Models\User;
use App\Containers\User\Models\UserDetail;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Inertia\Inertia;
use Inertia\Response;
class UserDetailController extends Controller
{
public function __construct(
private readonly CreateUserDetailAction $createUserDetailAction,
private readonly UpdateUserDetailAction $updateUserDetailAction,
private readonly DeleteUserDetailAction $deleteUserDetailAction,
) {}
/**
* Show the form for creating user detail
*/
public function create(User $user): Response
{
return Inertia::render('Dashboard/Users/UserDetail/Create', [
'user' => $user->only(['id', 'name', 'email']),
]);
}
/**
* Store a newly created user detail
*/
public function store(StoreUserDetailRequest $request, User $user): RedirectResponse
{
try {
$validated = $request->validated();
// Обработка загруженного фото
if ($request->hasFile('photo')) {
$validated['photo'] = $this->handlePhotoUpload($request->file('photo'));
}
// Декодирование JSON полей
$validated = $this->decodeJsonFields($validated);
$this->createUserDetailAction->run($user->id, $validated);
return redirect()->route('dashboard.users.edit', $user->id)
->with('success', 'Детальная информация успешно добавлена!');
} catch (\Exception $e) {
return back()
->withInput()
->with('error', 'Ошибка при добавлении информации: ' . $e->getMessage());
}
}
/**
* Show the form for editing user detail
*/
public function edit(User $user, UserDetail $userDetail): Response
{
// Проверяем принадлежность userDetail к user
if ($userDetail->user_id !== $user->id) {
abort(403, 'Unauthorized access.');
}
return Inertia::render('Dashboard/Users/UserDetail/Edit', [
'user' => $user->only(['id', 'name', 'email']),
'userDetail' => $userDetail,
]);
}
/**
* Update the specified user detail
*/
public function update(UpdateUserDetailRequest $request, User $user, UserDetail $userDetail): RedirectResponse
{
// Проверяем принадлежность userDetail к user
if ($userDetail->user_id !== $user->id) {
abort(403, 'Unauthorized access.');
}
try {
$validated = $request->validated();
// Обработка загруженного фото
if ($request->hasFile('photo')) {
$validated['photo'] = $this->handlePhotoUpload($request->file('photo'));
}
// Декодирование JSON полей
$validated = $this->decodeJsonFields($validated);
$this->updateUserDetailAction->run($userDetail, $validated);
return redirect()->route('dashboard.users.edit', $user->id)
->with('success', 'Детальная информация успешно обновлена!');
} catch (\Exception $e) {
return back()
->withInput()
->with('error', 'Ошибка при обновлении информации: ' . $e->getMessage());
}
}
/**
* Remove the specified user detail
*/
public function destroy(User $user, UserDetail $userDetail): RedirectResponse
{
// Проверяем принадлежность userDetail к user
if ($userDetail->user_id !== $user->id) {
abort(403, 'Unauthorized access.');
}
try {
$this->deleteUserDetailAction->run($userDetail);
return redirect()->route('dashboard.users.edit', $user->id)
->with('success', 'Детальная информация успешно удалена!');
} catch (\Exception $e) {
return back()
->with('error', 'Ошибка при удалении информации: ' . $e->getMessage());
}
}
/**
* Handle photo upload and return file path
*/
private function handlePhotoUpload($file): string
{
$path = $file->store('images', 'public');
return $path;
}
/**
* Decode JSON fields from request data
*/
private function decodeJsonFields(array $data): array
{
$jsonFields = [
'workExperience',
'education',
'professionalRetraining',
'professionalDevelopment',
'awards',
'professDisciplines',
'attendedConferences',
'publications',
'other',
];
foreach ($jsonFields as $field) {
if (isset($data[$field]) && is_string($data[$field])) {
$data[$field] = json_decode($data[$field], true);
}
}
return $data;
}
}