Files
Gnuboard7/app/Http/Controllers/Api/Admin/GeoIpController.php
T
2026-04-20 20:37:49 +09:00

81 lines
2.4 KiB
PHP

<?php
namespace App\Http\Controllers\Api\Admin;
use App\Http\Controllers\Api\Base\AdminBaseController;
use App\Services\GeoIpDatabaseService;
use Illuminate\Http\JsonResponse;
/**
* GeoIP DB 관리 컨트롤러.
*
* 수동 DB 업데이트 트리거를 제공합니다. 정기 갱신은
* routes/console.php의 스케줄(geoip:update)이 담당합니다.
* 비즈니스 로직은 모두 GeoIpDatabaseService에 위임합니다.
*/
class GeoIpController extends AdminBaseController
{
public function __construct(
private GeoIpDatabaseService $geoIpDatabaseService
) {
parent::__construct();
}
/**
* MaxMind GeoLite2-City DB를 즉시 재다운로드합니다.
*
* 내부적으로 GeoIpDatabaseService::updateDatabase(true)를 호출합니다.
* 다운로드는 동기 실행이므로 PHP-FPM/웹서버 타임아웃(90초 이상) 필요.
*
* @return JsonResponse 업데이트 결과 JSON 응답
*/
public function update(): JsonResponse
{
$result = $this->geoIpDatabaseService->updateDatabase(true);
if ($result['success']) {
return $this->success(
'settings.geoip.update_success',
$result['data'] ?? null
);
}
return $this->error(
$this->mapStatusToMessageKey((string) $result['status']),
$this->mapStatusToHttpCode((string) $result['status']),
$result['message'] ?? null
);
}
/**
* Service 상태 코드를 i18n 메시지 키로 매핑합니다.
*
* @param string $status Service 상태 코드
* @return string i18n 키
*/
private function mapStatusToMessageKey(string $status): string
{
return match ($status) {
'missing_license_key' => 'settings.geoip.license_key_missing',
'unauthorized' => 'settings.geoip.license_key_invalid',
'connection_failed' => 'settings.geoip.connection_failed',
default => 'settings.geoip.update_failed',
};
}
/**
* Service 상태 코드를 HTTP 상태 코드로 매핑합니다.
*
* @param string $status Service 상태 코드
* @return int HTTP 상태 코드
*/
private function mapStatusToHttpCode(string $status): int
{
return match ($status) {
'missing_license_key' => 400,
'unauthorized' => 401,
default => 500,
};
}
}