[
'name' => 'required',
'type' => 'required',
'ttl' => 'required',
'value' => 'required|ip|ipv4',
'plesk_id' => 'nullable',
],
'AAAA' => [
'name' => 'required',
'type' => 'required',
'ttl' => 'required',
'value' => 'required|ip|ipv6',
'plesk_id' => 'nullable',
],
'CNAME' => [
'name' => 'required',
'type' => 'required',
'ttl' => 'required',
'value' => 'required',
'plesk_id' => 'nullable',
],
'MX' => [
'name' => 'required',
'type' => 'required',
'ttl' => 'required',
'value' => 'required',
'priority' => 'required',
'plesk_id' => 'nullable',
],
'TXT' => [
'name' => 'required',
'type' => 'required',
'ttl' => 'required',
'value' => 'required',
'plesk_id' => 'nullable',
],
'CAA' => [
'name' => 'required',
'type' => 'required',
'ttl' => 'required',
'value' => 'required',
'plesk_id' => 'nullable',
],
'SRV' => [
'type' => 'required',
'ttl' => 'required',
'value' => 'required',
'service_name' => 'required',
'protocol' => 'required',
'weight' => 'required',
'port' => 'required',
'priority' => 'required',
'plesk_id' => 'nullable',
],
];
public function __construct(
public DnsDomainRepositoryInterface $domainRepository,
public DnsRecordRepositoryInterface $recordRepository,
public ServerService $serverService
) {}
public function index()
{
$title = 'All Records';
return view('Backend.records.index', compact('title'));
}
public function getAll()
{
$records = $this->recordRepository->filter([], ['domain'])->map(function ($record) {
return [
'id' => $record->id,
'name' => Str::limit($record->name, 20, '...'),
'type' => $record->type,
'value' => Str::limit($record->value, 20, '...'),
'domain' => $record->domain ? $record->domain->domain_name : '',
'checkbox' => '',
'created_at' => Carbon::parse($record->created_at)->format('Y-m-d H:i:s'),
'action' => $this->recordActionButtons($record),
];
});
return response()->json(['data' => $records]);
}
public function create(int $id)
{
$title = 'Add Records';
return view('Backend.records.create', compact('title', 'id'));
}
public function store(Request $request, int $id = 0)
{
$domain = $this->domainRepository->find($id);
if (empty($domain)) {
return response()->json(['success' => false, 'message' => 'These credentials do not match our records.']);
}
$validated = Validator::make($request->all(), $this->rules[$request->get('type')] ?? []);
if ($validated->fails()) {
return response()->json(['success' => false, 'message' => $validated->errors()->first()]);
}
$request->merge(['dns_manager_domain_id' => $id, 'domain' => $domain->domain_name]);
if (empty($request->get('plesk_id'))) {
$this->serverService->findServerByID($domain->dns_manager_server_id);
$this->serverService->handlePayload($request->all());
$record = $this->serverService->addRecord();
if (!empty($record) && $record['error']) {
return response()->json(['success' => false, 'message' => $record['message'] ?? 'Failed to add record on server.']);
}
}
DB::beginTransaction();
try {
if (isset($record)) {
$request->merge(['plesk_id' => $record['data']['id'] ?? 0]);
}
$this->recordRepository->create($request->all());
DB::commit();
} catch (Exception $error) {
DB::rollBack();
return response()->json(['success' => false, 'message' => $error->getMessage()]);
}
return response()->json([
'success' => true,
'message' => 'Add record successfully',
'url' => route('admin.domain.record', ['id' => $id]),
]);
}
public function edit(int $id = 0, int $record_id = 0)
{
$domain = $this->domainRepository->find($id);
if (empty($domain)) {
return back()->withErrors('These credentials do not match our records.');
}
$record = $this->recordRepository->find($record_id);
if (empty($record)) {
return back()->withErrors('These credentials do not match our records.');
}
$title = 'Edit Record';
return view('Backend.records.edit', compact('title', 'record', 'id'));
}
public function update(Request $request, int $id = 0, int $record_id = 0)
{
$domain = $this->domainRepository->find($id);
if (empty($domain)) {
return response()->json(['success' => false, 'message' => 'These credentials do not match our records.']);
}
$record = $this->recordRepository->find($record_id);
if (empty($record)) {
return response()->json(['success' => false, 'message' => 'These credentials do not match our records.']);
}
$validated = Validator::make($request->all(), $this->rules[$request->get('type')] ?? []);
if ($validated->fails()) {
return response()->json(['success' => false, 'message' => $validated->errors()->first()]);
}
$this->serverService->findServerByID($domain->dns_manager_server_id);
$this->serverService->handlePayload($request->all());
$updatedRecord = $this->serverService->updateRecord($record->plesk_id);
if (!empty($updatedRecord) && $updatedRecord['error']) {
return response()->json(['success' => false, 'message' => $updatedRecord['message'] ?? 'Failed to update record on server.']);
}
DB::beginTransaction();
try {
$this->recordRepository->update($record_id, $request->all());
DB::commit();
} catch (Exception $error) {
DB::rollBack();
return response()->json(['success' => false, 'message' => $error->getMessage()]);
}
return response()->json([
'success' => true,
'message' => 'Update record successfully',
'url' => route('admin.domain.record', ['id' => $id]),
]);
}
public function destroy(int $id = 0)
{
$record = $this->recordRepository->findWithRelations($id, ['domain']);
if (empty($record) || empty($record->domain)) {
return response()->json(['success' => false, 'message' => 'These credentials do not match our records.']);
}
$this->serverService->findServerByID($record->domain->dns_manager_server_id);
$record_delete = $this->serverService->deleteRecord($record->plesk_id);
if (!empty($record_delete) && $record_delete['error']) {
return response()->json(['success' => false, 'message' => $record_delete['message'] ?? 'Failed to delete record on server.']);
}
DB::beginTransaction();
try {
$domainId = $record->dns_manager_domain_id;
$this->recordRepository->delete($id);
DB::commit();
} catch (Exception $error) {
DB::rollBack();
return response()->json(['success' => false, 'message' => $error->getMessage()]);
}
return response()->json([
'success' => true,
'message' => 'Deleted record successfully',
'url' => route('admin.domain.record', ['id' => $domainId]),
]);
}
public function destroyCustom(RecordRemoveRequest $request)
{
$request->validated();
$records = $this->recordRepository->findWhereIn('id', $request->get('ids'), ['domain']);
if (!$records) {
return response()->json(['success' => false, 'message' => 'These credentials do not match our records.']);
}
try {
foreach ($records->all() as $record) {
if (empty($record->domain)) continue;
$this->serverService->findServerByID($record->domain->dns_manager_server_id);
$this->serverService->deleteRecord($record->plesk_id);
$this->recordRepository->delete($record->id);
}
} catch (Exception $error) {
return response()->json(['success' => false, 'message' => $error->getMessage()]);
}
return response()->json([
'success' => true,
'message' => 'Deleted successfully!',
'url' => route('admin.record.index'),
]);
}
private function recordActionButtons($record): string
{
$domainId = $record->domain ? $record->domain->id : 0;
$editUrl = route('admin.record.edit', ['id' => $domainId, 'record_id' => $record->id]);
$deleteUrl = route('admin.record.destroy', ['id' => $record->id]);
return <<
Edit
Delete
HTML;
}
}