198 lines
5.6 KiB
PHP
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)
|
|
);
|
|
}
|
|
}
|
|
}
|