user(); if ($user['role'] === 'user') { $accountId = (int)($db->fetchOne("SELECT id FROM accounts WHERE user_id = ?", [$user['uid']])['id'] ?? 0); } else { $accountId = (int)($body['account_id'] ?? $_GET['account_id'] ?? 0); if ($accountId && $user['role'] === 'reseller') assert_account_access($accountId); } if (!$accountId) Response::error("account_id required"); $acct = $db->fetchOne("SELECT * FROM accounts WHERE id = ?", [$accountId]); if (!$acct) Response::error("Account not found", 404); match ($action) { 'list' => (function() use ($db, $accountId) { $rows = $db->fetchAll("SELECT * FROM domains WHERE account_id = ? ORDER BY (type='main') DESC, domain", [$accountId]); Response::success($rows); })(), 'add-addon' => (function() use ($db, $body, $accountId, $acct) { $domain = strtolower(trim($body['domain'] ?? '')); if (!$domain) Response::error("domain required"); if (!preg_match('/^[a-z0-9][a-z0-9\-\.]+\.[a-z]{2,}$/', $domain)) Response::error("Invalid domain name"); $exists = $db->fetchOne("SELECT id FROM domains WHERE domain = ?", [$domain]); if ($exists) Response::error("Domain already exists"); $docRoot = $acct['home_dir'] . '/public_html/' . $domain; $db->execute( "INSERT INTO domains (account_id, domain, type, document_root, created_at) VALUES (?,?,?,?,NOW())", [$accountId, $domain, 'addon', $docRoot] ); @mkdir($docRoot, 0755, true); file_put_contents("$docRoot/index.html", "

$domain is ready!

Upload your website files.

"); VhostManager::create([ 'domain' => $domain, 'username' => $acct['username'], 'home_dir' => $acct['home_dir'], 'doc_root' => $docRoot, 'php_ver' => $acct['php_version'] ?? PHP_DEFAULT, ]); DNSManager::createZone($accountId, $domain); audit('domains.add-addon', $domain); Response::success(null, "Addon domain $domain added"); })(), 'add-subdomain' => (function() use ($db, $body, $accountId, $acct) { $sub = strtolower(trim($body['subdomain'] ?? '')); $parent = strtolower(trim($body['parent'] ?? $acct['domain'])); $full = "$sub.$parent"; if (!$sub) Response::error("subdomain required"); $docRoot = $acct['home_dir'] . '/public_html/' . $full; @mkdir($docRoot, 0755, true); file_put_contents("$docRoot/index.html", "

$full

"); $db->execute( "INSERT INTO domains (account_id, domain, type, document_root, created_at) VALUES (?,?,?,?,NOW())", [$accountId, $full, 'subdomain', $docRoot] ); VhostManager::create([ 'domain' => $full, 'username' => $acct['username'], 'home_dir' => $acct['home_dir'], 'doc_root' => $docRoot, 'php_ver' => $acct['php_version'] ?? PHP_DEFAULT, ]); $zone = DB::getInstance()->fetchOne("SELECT id FROM dns_zones WHERE domain = ? AND account_id = ?", [$parent, $accountId]); if ($zone) DNSManager::addRecord((int)$zone['id'], $sub, 'A', gethostbyname(gethostname())); audit('domains.add-subdomain', $full); Response::success(null, "Subdomain $full created"); })(), 'add-alias' => (function() use ($db, $body, $accountId, $acct) { $alias = strtolower(trim($body['domain'] ?? '')); $target = strtolower(trim($body['target'] ?? $acct['domain'])); if (!$alias) Response::error("domain required"); $db->execute( "INSERT INTO domains (account_id, domain, type, document_root, created_at) VALUES (?,?,?,?,NOW())", [$accountId, $alias, 'alias', $acct['home_dir'] . '/public_html'] ); VhostManager::create([ 'domain' => $alias, 'username' => $acct['username'], 'home_dir' => $acct['home_dir'], 'doc_root' => $acct['home_dir'] . '/public_html', 'php_ver' => $acct['php_version'] ?? PHP_DEFAULT, ]); DNSManager::createZone($accountId, $alias); audit('domains.add-alias', $alias); Response::success(null, "Domain alias $alias added"); })(), 'redirect' => (function() use ($db, $body, $accountId) { $id = (int)($body['id'] ?? 0); $url = trim($body['redirect_url'] ?? ''); $code = in_array((int)($body['code'] ?? 301), [301, 302]) ? (int)$body['code'] : 301; if (!$url) Response::error("redirect_url required"); $db->execute("UPDATE domains SET redirect_to=? WHERE id=? AND account_id=?", [$url, $id, $accountId]); // Update vhost to add Redirect directive $dom = $db->fetchOne("SELECT * FROM domains WHERE id = ?", [$id]); if ($dom) { VhostManager::setRedirect($dom['domain'], $url, $code); } Response::success(null, 'Redirect configured'); })(), 'remove' => (function() use ($db, $body, $accountId) { $id = (int)($body['id'] ?? 0); $dom = $db->fetchOne("SELECT * FROM domains WHERE id = ? AND account_id = ?", [$id, $accountId]); if (!$dom) Response::error("Domain not found", 404); if ($dom['type'] === 'main') Response::error("Cannot remove primary domain"); VhostManager::remove($dom['domain']); if ($dom['type'] !== 'subdomain') DNSManager::removeZone($dom['domain']); $db->execute("DELETE FROM domains WHERE id = ?", [$id]); audit('domains.remove', $dom['domain']); Response::success(null, "Domain {$dom['domain']} removed"); })(), default => Response::error("Unknown domains action: $action", 404), };