aiblog/app/Http/Controllers/Api/AuthController.php
2024-11-17 11:30:01 +08:00

88 lines
No EOL
2.6 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Http\Requests\Auth\RegisterRequest;
use App\Http\Resources\UserResource;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
class AuthController extends Controller
{
public function register(RegisterRequest $request): JsonResponse
{
$validated = $request->validated();
$validated['password'] = Hash::make($validated['password']);
$user = User::create($validated);
return response()->json([
'message' => 'User registered successfully',
'user' => new UserResource($user),
]);
}
/**
* @OA\Post(
* path="/api/auth/login",
* summary="User login",
* tags={"Authentication"},
* @OA\RequestBody(
* required=true,
* @OA\JsonContent(
* required={"login","password"},
* @OA\Property(property="login", type="string", description="Email or account"),
* @OA\Property(property="password", type="string", format="password")
* )
* ),
* @OA\Response(
* response=200,
* description="Login successful",
* @OA\JsonContent(
* @OA\Property(property="token", type="string"),
* @OA\Property(property="user", type="object")
* )
* ),
* @OA\Response(
* response=422,
* description="Validation error"
* )
* )
*/
public function login(LoginRequest $request): JsonResponse
{
$login = $request->input('login');
$password = $request->input('password');
// 判断登录字段是邮箱还是账号
$field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'account';
$user = User::where($field, $login)->first();
if (! $user || ! Hash::check($password, $user->password)) {
throw ValidationException::withMessages([
'login' => ['The provided credentials are incorrect.'],
]);
}
return response()->json([
'token' => $user->createToken('auth_token')->plainTextToken,
'user' => new UserResource($user),
]);
}
public function logout(): JsonResponse
{
auth()->user()->currentAccessToken()->delete();
return response()->json([
'message' => 'Successfully logged out',
]);
}
}