all(), [ 'name' => 'required|string|max:255', 'login' => 'required|string|max:255|unique:users', 'password' => 'required|string|min:8|confirmed', 'department' => 'required|string', 'position' => 'required|string', 'phone' => 'nullable|string', 'role' => 'required|in:doctor,nurse,head_of_department,statistician,admin', ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'errors' => $validator->errors(), ], 422); } // Проверка прав на создание пользователя if (Auth::check() && ! Auth::user()->isAdmin()) { return response()->json([ 'success' => false, 'message' => 'Недостаточно прав для создания пользователя', ], 403); } $user = User::create([ 'name' => $request->name, 'login' => $request->login, 'password' => Hash::make($request->password), 'department' => $request->department, 'position' => $request->position, 'phone' => $request->phone, 'role' => $request->role, 'is_active' => true, ]); $token = $user->createToken('auth_token')->plainTextToken; return response()->json([ 'success' => true, 'message' => 'Пользователь успешно зарегистрирован', 'user' => $user->only(['id', 'name', 'login', 'department', 'position', 'role']), 'token' => $token, 'permissions' => $user->permissions(), ], 201); } // Вход public function login(Request $request) { // Проверяем, что пользователь уже авторизован через сессию if (! Auth::check()) { return response()->json([ 'error' => 'Not authenticated', ], 401); } $user = Auth::user(); // Удаляем старые токены $user->tokens()->delete(); // Создаем новый токен $token = $user->createToken('auth_token')->plainTextToken; return response()->json([ 'success' => true, 'message' => 'Успешный вход', 'user' => $user->only(['id', 'name', 'login']), 'token' => $token, 'permissions' => $user->permissions(), 'available_departments' => $user->availableDepartments(), ]); } // Выход public function logout(Request $request) { // Удаляем токен $request->user()->currentAccessToken()->delete(); // Выходим из сессии Auth::logout(); return response()->json([ 'success' => true, 'message' => 'Успешный выход', ]); } // Получение текущего пользователя public function user(Request $request) { $user = $request->user(); if (! $user) { return response()->json([ 'success' => false, 'message' => 'Пользователь не авторизован', ], 401); } return response()->json([ 'success' => true, 'user' => $user->only(['id', 'name', 'login', 'department', 'position', 'role', 'phone']), 'permissions' => $user->permissions(), 'available_departments' => $user->availableDepartments(), ]); } // Обновление профиля public function updateProfile(Request $request) { $user = $request->user(); $validator = Validator::make($request->all(), [ 'name' => 'sometimes|string|max:255', 'login' => 'sometimes|unique:users,login,'.$user->id, 'current_password' => 'required_with:password', 'password' => 'sometimes|min:8|confirmed', 'department' => 'sometimes|string', 'phone' => 'sometimes|string', ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'errors' => $validator->errors(), ], 422); } // Проверка текущего пароля при смене пароля if ($request->has('password')) { if (! Hash::check($request->current_password, $user->password)) { return response()->json([ 'success' => false, 'message' => 'Текущий пароль неверен', ], 422); } $user->password = Hash::make($request->password); } if ($request->has('name')) { $user->name = $request->name; } if ($request->has('login')) { $user->login = $request->login; } if ($request->has('department')) { $user->department = $request->department; } if ($request->has('phone')) { $user->phone = $request->phone; } $user->save(); return response()->json([ 'success' => true, 'message' => 'Профиль обновлен', 'user' => $user->only(['id', 'name', 'login', 'department', 'position', 'role', 'phone']), ]); } // Проверка токена public function checkToken(Request $request) { $token = $request->bearerToken(); if (! $token) { return response()->json(['valid' => false], 401); } $accessToken = PersonalAccessToken::findToken($token); if (! $accessToken || ! $accessToken->tokenable) { return response()->json(['valid' => false], 401); } return response()->json(['valid' => true]); } // Получение списка пользователей (только для админов) public function getUsers(Request $request) { $user = $request->user(); if (! $user->isAdmin()) { return response()->json([ 'success' => false, 'message' => 'Недостаточно прав', ], 403); } $users = User::select('id', 'name', 'login', 'department', 'position', 'role', 'phone', 'is_active', 'created_at') ->orderBy('created_at', 'desc') ->get(); return response()->json([ 'success' => true, 'users' => $users, ]); } // Управление пользователями public function updateUser(Request $request, $id) { $currentUser = $request->user(); if (! $currentUser->isAdmin()) { return response()->json([ 'success' => false, 'message' => 'Недостаточно прав', ], 403); } $user = User::findOrFail($id); $validator = Validator::make($request->all(), [ 'is_active' => 'boolean', 'role' => 'in:doctor,nurse,head_of_department,statistician,admin', 'department' => 'string', ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'errors' => $validator->errors(), ], 422); } if ($request->has('is_active')) { $user->is_active = $request->is_active; } if ($request->has('role')) { $user->role = $request->role; } if ($request->has('department')) { $user->department = $request->department; } $user->save(); return response()->json([ 'success' => true, 'message' => 'Пользователь обновлен', 'user' => $user->only(['id', 'name', 'login', 'department', 'position', 'role', 'is_active']), ]); } }