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 { // Clear specific domain keys Cache::forget(CacheKey::build('domain', 'detail', ['id' => $domain->id])); Cache::forget(CacheKey::build('domain', 'detail', ['name' => $domain->domain_name])); Cache::forget(CacheKey::build('domain', 'all')); if ($domain->users) { foreach ($domain->users as $user) { Cache::forget(CacheKey::build('domain', 'user-list', ['user_id' => $user->id])); } } if ($domain->dns_manager_server_id) { Cache::forget(CacheKey::build('domain', 'server-list', ['server_id' => $domain->dns_manager_server_id])); } } catch (Exception $e) { Log::warning('Failed to clear domain caches: ' . $e->getMessage()); } } }