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']) ]); } }