88 lines
No EOL
2.6 KiB
PHP
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',
|
|
]);
|
|
}
|
|
}
|