feat: Implement Plesk domain and hosting services
- Added PleskDomainService for managing domain operations (create, update, remove, get info). - Introduced PleskHostingService for provisioning hosting accounts and notifying customers. - Created PleskService for handling API requests to Plesk. - Added migration to include 'type' column in dns_manager_servers table. - Created migration for module_hosting_accounts table to track hosting subscriptions. - Created migration for module_hosting_plesk_clients table to manage Plesk client credentials. - Added email templates for notifying customers and admins about hosting account creation.
This commit is contained in:
+16
-113
@@ -5,11 +5,11 @@ namespace App\Services;
|
||||
use App\Facades\BaseHelperFacade as BaseHelper;
|
||||
use App\Models\DnsServer;
|
||||
use App\Repositories\DnsManager\Server\DnsServerRepositoryInterface;
|
||||
use App\Services\Plesk\PleskDomainService;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Http\Client\RequestException;
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class ServerService
|
||||
{
|
||||
@@ -33,7 +33,8 @@ class ServerService
|
||||
];
|
||||
|
||||
public function __construct(
|
||||
public DnsServerRepositoryInterface $serverRepository
|
||||
public DnsServerRepositoryInterface $serverRepository,
|
||||
private PleskDomainService $pleskDomainService,
|
||||
) {
|
||||
$this->server = $this->getServer();
|
||||
}
|
||||
@@ -205,32 +206,15 @@ class ServerService
|
||||
|
||||
public function getDomainInfo(string $domain = ''): array|false
|
||||
{
|
||||
if (empty($domain)) {
|
||||
if (empty($domain) || empty($this->server)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
$response = Http::withoutVerifying()
|
||||
->withBasicAuth($this->server->username, Crypt::decryptString($this->server->password))
|
||||
->timeout(10)
|
||||
->get(BaseHelper::url($this->server->ip_address) . $this->entry_points['domain'], ['name' => $domain]);
|
||||
$result = $this->pleskDomainService->getDomainInfo($this->server, $domain);
|
||||
|
||||
$this->resetServer();
|
||||
$this->resetServer();
|
||||
|
||||
if ($response->successful()) {
|
||||
$domains = $response->json();
|
||||
foreach ($domains as $domainInfo) {
|
||||
if (isset($domainInfo['name']) && $domainInfo['name'] === $domain) {
|
||||
return $domainInfo;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
} catch (RequestException $e) {
|
||||
Log::error($e->getMessage());
|
||||
return false;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function createDomain(array $data = []): array|false
|
||||
@@ -243,42 +227,11 @@ class ServerService
|
||||
$this->server = $this->serverRepository->find($data['dns_manager_server_id']);
|
||||
}
|
||||
|
||||
$param = [
|
||||
'name' => $data['domain_name'],
|
||||
'description' => '',
|
||||
'hosting_type' => 'virtual',
|
||||
'hosting_settings' => [
|
||||
'ftp_login' => str_replace('.', '_', $data['domain_name']),
|
||||
'ftp_password' => Str::random(12),
|
||||
],
|
||||
'ip_addresses' => ['103.42.58.124'],
|
||||
'ipv4' => ['103.42.58.124'],
|
||||
'plan' => ['name' => 'Default Domain'],
|
||||
];
|
||||
$result = $this->pleskDomainService->createDomain($this->server, $data);
|
||||
|
||||
try {
|
||||
$response = Http::withoutVerifying()
|
||||
->withBasicAuth($this->server->username, Crypt::decryptString($this->server->password))
|
||||
->timeout(30)
|
||||
->post(BaseHelper::url($this->server->ip_address) . $this->entry_points['domain'], $param);
|
||||
$this->resetServer();
|
||||
|
||||
$this->resetServer();
|
||||
$responseData = $response->json();
|
||||
|
||||
Log::info('Response Plesk API Created', ['data' => $responseData]);
|
||||
|
||||
if ($response->successful() && isset($responseData['id'], $responseData['guid'])) {
|
||||
return $responseData;
|
||||
}
|
||||
} catch (RequestException $e) {
|
||||
Log::error('Plesk domain creation failed', [
|
||||
'error' => $e->getMessage(),
|
||||
'response' => $e->response?->body(),
|
||||
'data' => $param,
|
||||
]);
|
||||
}
|
||||
|
||||
return false;
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function updateDomain(int $pleskDomainId, array $data = []): array|false
|
||||
@@ -291,42 +244,11 @@ class ServerService
|
||||
$this->server = $this->serverRepository->find($data['dns_manager_server_id']);
|
||||
}
|
||||
|
||||
$param = [
|
||||
'name' => $data['domain_name'],
|
||||
'description' => '',
|
||||
'hosting_type' => 'virtual',
|
||||
'hosting_settings' => [
|
||||
'ftp_login' => str_replace('.', '_', $data['domain_name']),
|
||||
'ftp_password' => Str::random(12),
|
||||
],
|
||||
'ip_addresses' => ['103.42.58.124'],
|
||||
'ipv4' => ['103.42.58.124'],
|
||||
'plan' => ['name' => 'Default Domain'],
|
||||
];
|
||||
$result = $this->pleskDomainService->updateDomain($this->server, $pleskDomainId, $data);
|
||||
|
||||
try {
|
||||
$response = Http::withoutVerifying()
|
||||
->withBasicAuth($this->server->username, Crypt::decryptString($this->server->password))
|
||||
->timeout(30)
|
||||
->put(BaseHelper::url($this->server->ip_address) . $this->entry_points['domain'] . "/{$pleskDomainId}", $param);
|
||||
$this->resetServer();
|
||||
|
||||
$this->resetServer();
|
||||
$responseData = $response->json();
|
||||
|
||||
Log::info('Response Plesk API Updated', ['data' => $responseData]);
|
||||
|
||||
if ($response->successful() && isset($responseData['id'], $responseData['guid'])) {
|
||||
return $responseData;
|
||||
}
|
||||
} catch (RequestException $e) {
|
||||
Log::error('Plesk domain update failed', [
|
||||
'error' => $e->getMessage(),
|
||||
'response' => $e->response?->body(),
|
||||
'data' => $param,
|
||||
]);
|
||||
}
|
||||
|
||||
return false;
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function removeDomain(int $pleskDomainId): bool
|
||||
@@ -335,30 +257,11 @@ class ServerService
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
$response = Http::withoutVerifying()
|
||||
->withBasicAuth($this->server->username, Crypt::decryptString($this->server->password))
|
||||
->timeout(30)
|
||||
->delete(BaseHelper::url($this->server->ip_address) . $this->entry_points['domain'] . "/{$pleskDomainId}");
|
||||
$result = $this->pleskDomainService->removeDomain($this->server, $pleskDomainId);
|
||||
|
||||
$this->resetServer();
|
||||
$this->resetServer();
|
||||
|
||||
if ($response->successful()) {
|
||||
Log::info('Xoá domain thành công', ['plesk_id' => $pleskDomainId, 'status' => $response->status()]);
|
||||
return true;
|
||||
}
|
||||
|
||||
Log::error('Xoá domain thất bại', [
|
||||
'plesk_id' => $pleskDomainId,
|
||||
'status' => $response->status(),
|
||||
'response' => $response->body(),
|
||||
]);
|
||||
|
||||
return false;
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Exception khi xoá domain', ['plesk_id' => $pleskDomainId, 'error' => $e->getMessage()]);
|
||||
return false;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function addServerById(int $serverId): bool
|
||||
|
||||
Reference in New Issue
Block a user