proofdb/app/controller/Api/AdminAuthController.php
2026-05-08 00:05:51 +08:00

130 lines
3.9 KiB
PHP

<?php
namespace app\controller\Api;
use app\service\AdminAuthService;
use InvalidArgumentException;
use JsonException;
use support\Request;
use support\Response;
use Throwable;
class AdminAuthController
{
public function login(Request $request): Response
{
try {
$payload = $this->payload($request);
$username = trim((string) ($payload['username'] ?? ''));
$password = (string) ($payload['password'] ?? '');
if ($username === '' || $password === '') {
throw new InvalidArgumentException('username and password are required.');
}
$auth = new AdminAuthService();
$user = $auth->authenticate($username, $password);
if ($user === null) {
return $this->jsonResponse([
'code' => 401,
'message' => 'Admin login failed.',
'errors' => ['auth' => 'invalid username or password.'],
], 401);
}
$auth->login($request, $user);
} catch (JsonException $exception) {
return $this->jsonResponse([
'code' => 400,
'message' => 'Invalid JSON body.',
'errors' => ['body' => $exception->getMessage()],
], 400);
} catch (InvalidArgumentException $exception) {
return $this->jsonResponse([
'code' => 422,
'message' => 'Admin login validation failed.',
'errors' => ['auth' => $exception->getMessage()],
], 422);
} catch (Throwable $exception) {
return $this->jsonResponse([
'code' => 500,
'message' => 'Admin login failed.',
'errors' => ['auth' => $exception->getMessage()],
], 500);
}
return $this->jsonResponse([
'code' => 0,
'message' => 'Admin login completed.',
'data' => ['admin' => $user],
], 200);
}
public function logout(Request $request): Response
{
try {
(new AdminAuthService())->logout($request);
} catch (Throwable $exception) {
return $this->jsonResponse([
'code' => 500,
'message' => 'Admin logout failed.',
'errors' => ['auth' => $exception->getMessage()],
], 500);
}
return $this->jsonResponse([
'code' => 0,
'message' => 'Admin logout completed.',
], 200);
}
public function me(Request $request): Response
{
try {
$admin = (new AdminAuthService())->current($request);
} catch (Throwable $exception) {
return $this->jsonResponse([
'code' => 500,
'message' => 'Admin session lookup failed.',
'errors' => ['auth' => $exception->getMessage()],
], 500);
}
if ($admin === null) {
return $this->jsonResponse([
'code' => 401,
'message' => 'Admin session not found.',
], 401);
}
return $this->jsonResponse([
'code' => 0,
'message' => 'Admin session loaded.',
'data' => ['admin' => $admin],
], 200);
}
/**
* @throws JsonException
*/
private function payload(Request $request): array
{
$rawBody = trim($request->rawBody());
if ($rawBody === '') {
return $request->post();
}
$payload = json_decode($rawBody, true, 512, JSON_THROW_ON_ERROR);
return is_array($payload) ? $payload : [];
}
private function jsonResponse(array $data, int $status): Response
{
return response(
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR),
$status,
['Content-Type' => 'application/json']
);
}
}