Files
onboard/app/Http/Controllers/Api/AuthController.php
2026-01-04 23:15:06 +09:00

274 lines
8.5 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Laravel\Sanctum\PersonalAccessToken;
class AuthController extends Controller
{
// Регистрация
public function register(Request $request)
{
return false;
$validator = Validator::make($request->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'])
]);
}
}