llmbackend/app/Http/Controllers/Api/Admin/AuthController.php
2024-12-04 16:41:43 +08:00

198 lines
5.6 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Http\Controllers\Api\Admin;
use App\Constants\ErrorCode;
use App\Http\Controllers\Controller;
use App\Models\Admin;
use App\Services\LogService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\ValidationException;
class AuthController extends Controller
{
/**
* @var LogService
*/
private readonly LogService $logService;
public function __construct(LogService $logService)
{
$this->logService = $logService;
}
/**
* 管理员登录
*
* @param Request $request
* @return JsonResponse
* @throws ValidationException
*/
public function login(Request $request): JsonResponse
{
try {
/** @var array{email: string, password: string} $validated */
$validated = $request->validate([
'email' => 'required|email',
'password' => 'required|string',
]);
/** @var Admin|null $admin */
$admin = Admin::where('email', $validated['email'])->first();
if (!$admin || !Hash::check($validated['password'], $admin->password)) {
return $this->error(
ErrorCode::INVALID_CREDENTIALS,
ErrorCode::getMessage(ErrorCode::INVALID_CREDENTIALS)
);
}
/** @var string $token */
$token = $admin->createToken('admin-token')->plainTextToken;
$this->logService->logOperation(
'admin',
$admin->id,
'Admin logged in'
);
return $this->success([
'token' => $token,
'admin' => [
'id' => $admin->id,
'email' => $admin->email,
],
]);
} catch (ValidationException $e) {
return $this->error(
ErrorCode::VALIDATION_ERROR,
ErrorCode::getMessage(ErrorCode::VALIDATION_ERROR),
$e->errors()
);
} catch (\Exception $e) {
Log::error('Error during admin login', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
return $this->error(
ErrorCode::SERVER_ERROR,
ErrorCode::getMessage(ErrorCode::SERVER_ERROR)
);
}
}
/**
* 管理员登出
*
* @param Request $request
* @return JsonResponse
*/
public function logout(Request $request): JsonResponse
{
try {
/** @var Admin|null $admin */
$admin = $request->user();
if (!$admin) {
return $this->error(
ErrorCode::UNAUTHORIZED,
'未登錄或會話已過期。'
);
}
$admin->currentAccessToken()->delete();
$this->logService->logOperation(
'admin',
$admin->id,
'Admin logged out'
);
return $this->success(null, '已成功登出。');
} catch (\Exception $e) {
Log::error('Error during admin logout', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
'admin_id' => $request->user()?->id,
]);
return $this->error(
ErrorCode::SERVER_ERROR,
ErrorCode::getMessage(ErrorCode::SERVER_ERROR)
);
}
}
/**
* 修改管理员密码
*
* @param Request $request
* @return JsonResponse
* @throws ValidationException
*/
public function changePassword(Request $request): JsonResponse
{
try {
/** @var Admin|null $admin */
$admin = $request->user();
if (!$admin) {
return $this->error(
ErrorCode::UNAUTHORIZED,
'未登錄或會話已過期。'
);
}
/** @var array{current_password: string, new_password: string} $validated */
$validated = $request->validate([
'current_password' => 'required|string',
'new_password' => 'required|string|min:8|confirmed',
]);
if (!Hash::check($validated['current_password'], $admin->password)) {
return $this->error(
ErrorCode::INVALID_CREDENTIALS,
'当前密码错误。'
);
}
$admin->password = Hash::make($validated['new_password']);
$admin->save();
$this->logService->logOperation(
'admin',
$admin->id,
'Admin changed password'
);
return $this->success(null, '密码修改成功。');
} catch (ValidationException $e) {
return $this->error(
ErrorCode::VALIDATION_ERROR,
ErrorCode::getMessage(ErrorCode::VALIDATION_ERROR),
$e->errors()
);
} catch (\Exception $e) {
Log::error('Error changing admin password', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
'admin_id' => $request->user()?->id,
]);
return $this->error(
ErrorCode::SERVER_ERROR,
ErrorCode::getMessage(ErrorCode::SERVER_ERROR)
);
}
}
}