274 lines
8.5 KiB
PHP
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'])
|
|
]);
|
|
}
|
|
}
|