domainRepository->filter([], ['users', 'server'])->map(function ($domain) {
return [
'id' => $domain->id,
'name' => $domain->domain_name,
'server' => $domain->server ? $domain->server->ip_address : '',
'user' => $domain->users->pluck('name')->implode(', '),
'checkbox' => '',
'created_at' => Carbon::parse($domain->created_at)->format('Y-m-d H:i:s'),
'action' => $this->domainActionButtons($domain),
];
});
return response()->json(['data' => $domains]);
}
public function create()
{
$title = 'Add Domain';
return view('Backend.domains.create', compact('title'));
}
public function store(DomainRequest $request)
{
$validated = $request->validated();
$isCreated = $this->domainRepository->findDomain($validated['domain_name']);
if (!empty($isCreated)) {
return response()->json([
'success' => false,
'message' => "Domain '{$validated['domain_name']}' đã tồn tại trong hệ thống!",
]);
}
DB::beginTransaction();
try {
$userIds = $validated['user_id'] ?? [];
$domainData = collect($validated)->except('user_id')->toArray();
$domain = $this->domainRepository->create($domainData);
$domain->users()->attach($userIds);
$domain->save();
try {
$server = $this->serverService->findServerByID($domain->dns_manager_server_id);
if (!$server) {
throw new Exception("Không tìm thấy server với ID: {$domain->dns_manager_server_id}");
}
$existingDomainInfo = $this->serverService->getDomainInfo($domain->domain_name);
if ($existingDomainInfo) {
$this->domainRepository->update($domain->id, [
'is_created' => 1,
'plesk_id' => $existingDomainInfo['id'],
]);
} else {
$response = $this->serverService->createDomain($domain->toArray());
if (!$response || !isset($response['id'])) {
throw new Exception('Không thể tạo domain trên server. Vui lòng kiểm tra lại thông tin server.');
}
$this->domainRepository->update($domain->id, [
'is_created' => 1,
'plesk_id' => $response['id'],
]);
}
} catch (Exception $domainError) {
Log::error('Lỗi khi tạo domain: ' . $domainError->getMessage());
}
DB::commit();
$domain = $domain->refresh();
$message = $domain->is_created == 1 && $domain->plesk_id
? "Domain '{$domain->domain_name}' đã được xử lý thành công trên server!"
: "Domain '{$domain->domain_name}' đã được lưu vào database nhưng chưa thể xử lý trên server.";
return response()->json(['success' => true, 'message' => $message, 'url' => route('admin.domain.index')]);
} catch (Exception $error) {
DB::rollBack();
return response()->json(['success' => false, 'message' => 'Có lỗi xảy ra: ' . $error->getMessage()]);
}
}
public function edit(int $id)
{
$domain = $this->domainRepository->find($id);
if (empty($domain)) {
return back()->withErrors("Không tìm thấy domain với ID: {$id}");
}
$title = 'Edit domain';
return view('Backend.domains.edit', compact('title', 'domain'));
}
public function update(DomainRequest $request, int $id)
{
$domain = $this->domainRepository->find($id);
if (empty($domain)) {
return response()->json(['success' => false, 'message' => "Không tìm thấy domain với ID: {$id}"]);
}
$validated = $request->validated();
DB::beginTransaction();
try {
$userIds = $validated['user_id'] ?? [];
$domainData = collect($validated)->except('user_id')->toArray();
$this->domainRepository->update($id, $domainData);
$domain->users()->sync($userIds);
try {
$updatedDomain = $this->domainRepository->find($id);
$server = $this->serverService->findServerByID($updatedDomain->dns_manager_server_id);
if (!$server) {
throw new Exception("Không tìm thấy server với ID: {$updatedDomain->dns_manager_server_id}");
}
$existingDomainInfo = $this->serverService->getDomainInfo($updatedDomain->domain_name);
if ($existingDomainInfo) {
$this->serverService->updateDomain($existingDomainInfo['id'], $updatedDomain->toArray());
$this->domainRepository->update($updatedDomain->id, [
'is_created' => 1,
'plesk_id' => $existingDomainInfo['id'],
]);
} else {
$response = $this->serverService->createDomain($updatedDomain->toArray());
if (!$response || !isset($response['id'])) {
throw new Exception('Không thể tạo domain trên server.');
}
$this->domainRepository->update($updatedDomain->id, [
'is_created' => 1,
'plesk_id' => $response['id'],
]);
}
} catch (Exception $domainError) {
Log::error('Lỗi khi cập nhật domain: ' . $domainError->getMessage());
}
DB::commit();
$updatedDomain = $this->domainRepository->find($id);
$message = $updatedDomain->is_created == 1 && $updatedDomain->plesk_id
? "Domain '{$updatedDomain->domain_name}' đã được cập nhật thành công trên server!"
: "Domain '{$updatedDomain->domain_name}' đã được cập nhật trong database nhưng chưa thể xử lý trên server.";
return response()->json(['success' => true, 'message' => $message, 'url' => route('admin.domain.index')]);
} catch (Exception $error) {
DB::rollBack();
return response()->json(['success' => false, 'message' => 'Có lỗi xảy ra: ' . $error->getMessage()]);
}
}
public function record(int $id = 0)
{
$domain = $this->domainRepository->findWithRelations($id, ['record']);
if (empty($domain)) {
return back()->withErrors("Không tìm thấy domain với ID: {$id}");
}
$title = strtoupper($domain->domain_name) . ' Records';
return view('Backend.domains.view', compact('domain', 'title', 'id'));
}
public function destroy(int $id)
{
$domain = $this->domainRepository->find($id);
if (!$domain) {
return response()->json(['success' => false, 'message' => "Không tìm thấy domain với ID: {$id}"]);
}
try {
if ($domain->is_created !== 1 || !$domain->plesk_id) {
$this->domainRepository->delete($domain->id);
return response()->json([
'success' => true,
'message' => "Domain '{$domain->domain_name}' đã được xóa khỏi database.",
'url' => route('admin.domain.index'),
]);
}
$server = $this->serverService->findServerByID($domain->dns_manager_server_id);
if (!$server) {
return response()->json(['success' => false, 'message' => "Không tìm thấy server với ID: {$domain->dns_manager_server_id}"]);
}
$removed = $this->serverService->removeDomain($domain->plesk_id);
if (!$removed) {
return response()->json(['success' => false, 'message' => "Không thể xóa domain '{$domain->domain_name}' trên server."]);
}
$this->domainRepository->delete($domain->id);
$this->clearDomainCaches($domain);
return response()->json([
'success' => true,
'message' => "Domain '{$domain->domain_name}' đã được xóa thành công khỏi server và database!",
'url' => route('admin.domain.index'),
]);
} catch (Exception $error) {
return response()->json(['success' => false, 'message' => 'Có lỗi xảy ra khi xóa domain: ' . $error->getMessage()]);
}
}
public function destroyCustom(DomainRemoveRequest $request)
{
$request->validated();
$domains = $this->domainRepository->findWhereIn('id', $request->get('ids'));
if (!$domains || $domains->isEmpty()) {
return response()->json(['success' => false, 'message' => 'Không tìm thấy domain nào.']);
}
$successCount = 0;
$errorCount = 0;
$errors = [];
foreach ($domains as $domain) {
try {
if ($domain->is_created !== 1 || !$domain->plesk_id) {
$this->domainRepository->delete($domain->id);
$successCount++;
continue;
}
$server = $this->serverService->findServerByID($domain->dns_manager_server_id);
if (!$server) {
$errors[] = "Domain '{$domain->domain_name}': Không tìm thấy server";
$errorCount++;
continue;
}
$removed = $this->serverService->removeDomain($domain->plesk_id);
if (!$removed) {
$errors[] = "Domain '{$domain->domain_name}': Không thể xóa trên server";
$errorCount++;
continue;
}
$this->domainRepository->delete($domain->id);
$this->clearDomainCaches($domain);
$successCount++;
} catch (Exception $error) {
$errors[] = "Domain '{$domain->domain_name}': " . $error->getMessage();
$errorCount++;
}
}
if ($successCount > 0 && $errorCount === 0) {
$message = "Đã xóa thành công {$successCount} domain!";
} elseif ($successCount > 0) {
$message = "Đã xóa thành công {$successCount} domain, {$errorCount} domain gặp lỗi.";
} else {
$message = 'Không thể xóa domain nào. Vui lòng kiểm tra lại.';
}
return response()->json([
'success' => $errorCount === 0,
'message' => $message,
'details' => ['success_count' => $successCount, 'error_count' => $errorCount, 'errors' => $errors],
'url' => route('admin.domain.index'),
]);
}
private function domainActionButtons($domain): string
{
$editUrl = route('admin.domain.edit', ['id' => $domain->id]);
$recordUrl = route('admin.domain.record', ['id' => $domain->id]);
$deleteUrl = route('admin.domain.destroy', ['id' => $domain->id]);
return <<
Edit
Records
Delete
HTML;
}
private function clearDomainCaches($domain): void
{
try {
Cache::forget("domain.{$domain->id}");
Cache::forget("domain.{$domain->domain_name}");
Cache::forget('domains.all');
Cache::forget('domains.filtered');
if ($domain->users) {
foreach ($domain->users as $user) {
Cache::forget("user.{$user->id}.domains");
}
}
if ($domain->dns_manager_server_id) {
Cache::forget("server.{$domain->dns_manager_server_id}.domains");
}
} catch (Exception $e) {
Log::warning('Failed to clear domain caches: ' . $e->getMessage());
}
}
}