diff --git a/README.md b/README.md
index e3f0cad..d9befe4 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,7 @@
## Развертывание проекта
1. `composer install`
2. Настроить подключение к БД в `.env`
+ DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD
3. `php artisan migrate:fresh --seed`
(команда развернет БД, создаст тестового юзера, 11 категорий и 40 сгенерированных событий).
diff --git a/app/Console/Commands/ResetUserPassword.php b/app/Console/Commands/ResetUserPassword.php
new file mode 100644
index 0000000..f60fd98
--- /dev/null
+++ b/app/Console/Commands/ResetUserPassword.php
@@ -0,0 +1,55 @@
+argument('email');
+ $password = $this->argument('password');
+
+ // 1. Поиск пользователя
+ $user = User::where('email', $email)->first();
+
+ if (!$user) {
+ $this->error("Пользователь с email {$email} не найден.");
+ return Command::FAILURE;
+ }
+
+ // 2. Генерация или использование переданного пароля
+ if (!$password) {
+ $password = Str::random(12); // Случайный пароль из 12 символов
+ }
+
+ // 3. Обновление пароля в базе данных
+ $user->password = Hash::make($password);
+ $user->save();
+
+ // 4. Отзыв старых токенов (опционально, для безопасности)
+ $user->tokens()->delete();
+
+ // 5. Создание нового токена Sanctum
+ $token = $user->createToken('console_auth_token')->plainTextToken;
+
+ // 6. Вывод результата в консоль
+ $this->info("Пароль для пользователя {$email} успешно изменен!");
+ $this->line("Новый пароль: {$password}");
+ $this->line("Новый Sanctum токен: {$token}");
+
+ return Command::SUCCESS;
+ }
+}
diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php
new file mode 100644
index 0000000..11964aa
--- /dev/null
+++ b/app/Http/Controllers/Auth/LoginController.php
@@ -0,0 +1,66 @@
+all(), [
+ 'email' => ['required', 'string', 'email'],
+ 'password' => ['required', 'string'],
+ ]);
+
+ if ($validator->fails()) {
+ return response()->json([
+ 'status' => 'error',
+ 'message' => 'Validation failed',
+ 'errors' => $validator->errors()
+ ], 422);
+ }
+
+ // 2. Поиск пользователя
+ $user = User::where('email', $request->email)->first();
+
+ // 3. Проверка пароля
+ if (!$user || !Hash::check($request->password, $user->password)) {
+ return response()->json([
+ 'status' => 'error',
+ 'message' => 'Invalid credentials'
+ ], 401);
+ }
+
+ // 4. Генерация нового токена Sanctum
+ $token = $user->createToken('auth_token')->plainTextToken;
+
+ return response()->json([
+ 'status' => 'success',
+ 'message' => 'Logged in successfully',
+ 'data' => [
+ 'user' => $user,
+ 'token_type' => 'Bearer',
+ 'access_token' => $token,
+ ]
+ ], 200);
+ }
+
+ public function logout(Request $request)
+ {
+ // Удаление текущего токена, с которым пришел пользователь
+ $request->user()->currentAccessToken()->delete();
+
+ return response()->json([
+ 'status' => 'success',
+ 'message' => 'Logged out successfully'
+ ], 200);
+ }
+}
diff --git a/routes/api.php b/routes/api.php
index 69e13dc..849c2aa 100644
--- a/routes/api.php
+++ b/routes/api.php
@@ -3,10 +3,20 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\GigsController;
+use App\Http\Controllers\Auth\LoginController;
+
+// Публичный маршрут для входа
+Route::post('/login', [ LoginController::class, 'login' ]);
+
+// Защищенный маршрут для выхода
+Route::middleware('auth:sanctum')->group(function () {
+ Route::post('/logout', [ LoginController::class, 'logout' ]);
+});
Route::get('/user', function (Request $request) {
return $request->user();
})->middleware('auth:sanctum');
-Route::get('/gigs', [ GigsController::class, 'index' ]);
+Route::get('/gigs', [ GigsController::class, 'index' ])
+ ->middleware('auth:sanctum');