- Implement AdminDomainOrderTest to cover admin functionalities for domain orders including listing, confirming registration, KYC updates, activation, rejection, and refunds. - Implement ClientDomainOrderTest to cover client functionalities for placing domain orders, including validation for balance, duplicate orders, and domain normalization. - Ensure proper handling of domain pricing and service statuses throughout the tests.
276 lines
7.9 KiB
PHP
276 lines
7.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Controllers\Api\Admin\Domain;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Setting;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Http;
|
|
use Illuminate\Support\Facades\Validator;
|
|
|
|
class InetDomainController extends Controller
|
|
{
|
|
private const BASE_URL = 'https://developers.inet.vn/api/gateway/v1/domain';
|
|
|
|
/**
|
|
* Lấy API key từ settings
|
|
*/
|
|
private function getApiKey(): ?string
|
|
{
|
|
$setting = Setting::where('key', 'setting')->first();
|
|
$value = $setting ? json_decode((string) $setting->value, true) : [];
|
|
return $value['inet_api_key'] ?? $value['api_inet'] ?? null;
|
|
}
|
|
|
|
/**
|
|
* Headers mặc định cho iNET API
|
|
*/
|
|
private function defaultHeaders(): array
|
|
{
|
|
$apiKey = $this->getApiKey();
|
|
|
|
if (! $apiKey) {
|
|
return [];
|
|
}
|
|
|
|
return [
|
|
'Authorization' => 'Bearer ' . $apiKey,
|
|
'Accept' => 'application/json',
|
|
];
|
|
}
|
|
|
|
/**
|
|
* GET /administrator/inet-domain/whois/{domain}
|
|
* Tra cứu thông tin WHOIS của tên miền.
|
|
*/
|
|
public function whois(string $domain, Request $request): JsonResponse
|
|
{
|
|
$apiKey = $this->getApiKey();
|
|
|
|
if (! $apiKey) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => 'Chưa cấu hình API key iNET (api_inet).',
|
|
], 400);
|
|
}
|
|
|
|
$url = self::BASE_URL . '/whois/' . urlencode($domain);
|
|
|
|
if ($request->boolean('refreshCache')) {
|
|
$url .= '?refreshCache=true';
|
|
}
|
|
|
|
try {
|
|
$response = Http::withHeaders($this->defaultHeaders())
|
|
->timeout(30)
|
|
->get($url);
|
|
|
|
return $this->proxyResponse($response);
|
|
} catch (\Throwable $e) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => 'Lỗi kết nối iNET API: ' . $e->getMessage(),
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* GET /administrator/inet-domain/check-available
|
|
* Kiểm tra tên miền có khả dụng không.
|
|
*/
|
|
public function checkAvailable(Request $request): JsonResponse
|
|
{
|
|
$apiKey = $this->getApiKey();
|
|
|
|
if (! $apiKey) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => 'Chưa cấu hình API key iNET (api_inet).',
|
|
], 400);
|
|
}
|
|
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'required|string|max:255',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => $validator->errors()->first(),
|
|
], 422);
|
|
}
|
|
|
|
$url = self::BASE_URL . '/check-available?name=' . urlencode($request->input('name'));
|
|
|
|
try {
|
|
$response = Http::withHeaders($this->defaultHeaders())
|
|
->timeout(30)
|
|
->get($url);
|
|
|
|
return $this->proxyResponse($response);
|
|
} catch (\Throwable $e) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => 'Lỗi kết nối iNET API: ' . $e->getMessage(),
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* POST /administrator/inet-domain/bulk-check-available
|
|
* Kiểm tra nhiều tên miền cùng lúc.
|
|
*/
|
|
public function bulkCheckAvailable(Request $request): JsonResponse
|
|
{
|
|
$apiKey = $this->getApiKey();
|
|
|
|
if (! $apiKey) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => 'Chưa cấu hình API key iNET (api_inet).',
|
|
], 400);
|
|
}
|
|
|
|
$validator = Validator::make($request->all(), [
|
|
'domains' => 'required|array|min:1',
|
|
'domains.*' => 'required|string|max:255',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => $validator->errors()->first(),
|
|
], 422);
|
|
}
|
|
|
|
try {
|
|
$response = Http::withHeaders([
|
|
...$this->defaultHeaders(),
|
|
'Content-Type' => 'application/json',
|
|
])
|
|
->timeout(30)
|
|
->post(self::BASE_URL . '/bulk-check-available', [
|
|
'domains' => $request->input('domains'),
|
|
]);
|
|
|
|
return $this->proxyResponse($response);
|
|
} catch (\Throwable $e) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => 'Lỗi kết nối iNET API: ' . $e->getMessage(),
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* POST /administrator/inet-domain/ai-suggest
|
|
* Gợi ý tên miền bằng AI.
|
|
*/
|
|
public function aiSuggest(Request $request): JsonResponse
|
|
{
|
|
$apiKey = $this->getApiKey();
|
|
|
|
if (! $apiKey) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => 'Chưa cấu hình API key iNET (api_inet).',
|
|
], 400);
|
|
}
|
|
|
|
$validator = Validator::make($request->all(), [
|
|
'tlds' => 'required|array|min:1',
|
|
'tlds.*' => 'required|string|max:50',
|
|
'message' => 'required|string|max:500',
|
|
'maxLength' => 'nullable|integer|min:1|max:100',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => $validator->errors()->first(),
|
|
], 422);
|
|
}
|
|
|
|
$payload = [
|
|
'tlds' => $request->input('tlds'),
|
|
'message' => $request->input('message'),
|
|
];
|
|
|
|
if ($request->has('maxLength')) {
|
|
$payload['maxLength'] = $request->input('maxLength');
|
|
}
|
|
|
|
try {
|
|
$response = Http::withHeaders([
|
|
...$this->defaultHeaders(),
|
|
'Content-Type' => 'application/json',
|
|
])
|
|
->timeout(30)
|
|
->post(self::BASE_URL . '/ai-suggest', $payload);
|
|
|
|
return $this->proxyResponse($response);
|
|
} catch (\Throwable $e) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => 'Lỗi kết nối iNET API: ' . $e->getMessage(),
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* GET /administrator/inet-domain/suffixes
|
|
* Lấy danh sách đuôi tên miền (TLD) và bảng giá.
|
|
*/
|
|
public function suffixes(): JsonResponse
|
|
{
|
|
$apiKey = $this->getApiKey();
|
|
|
|
if (! $apiKey) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => 'Chưa cấu hình API key iNET (api_inet).',
|
|
], 400);
|
|
}
|
|
|
|
try {
|
|
$response = Http::withHeaders($this->defaultHeaders())
|
|
->timeout(30)
|
|
->get(self::BASE_URL . '/suffixes');
|
|
|
|
return $this->proxyResponse($response);
|
|
} catch (\Throwable $e) {
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => 'Lỗi kết nối iNET API: ' . $e->getMessage(),
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Xử lý response từ iNET API và trả về client.
|
|
*/
|
|
private function proxyResponse(\Illuminate\Http\Client\Response $response): JsonResponse
|
|
{
|
|
$status = $response->status();
|
|
|
|
if ($response->failed()) {
|
|
$body = $response->json() ?? ['message' => $response->body()];
|
|
return response()->json([
|
|
'error' => true,
|
|
'message' => $body['message'] ?? 'iNET API trả về lỗi HTTP ' . $status,
|
|
'data' => $body,
|
|
], $status >= 400 && $status < 600 ? $status : 500);
|
|
}
|
|
|
|
$body = $response->json();
|
|
|
|
return response()->json([
|
|
'error' => false,
|
|
'data' => $body,
|
|
]);
|
|
}
|
|
}
|