feat: add test database button for admin panel

This commit is contained in:
Naterfute
2025-10-25 08:40:09 -07:00
parent f7574a33a9
commit 0bdc6dab41
3 changed files with 261 additions and 120 deletions

View File

@@ -9,6 +9,12 @@ use Illuminate\Http\RedirectResponse;
use Prologue\Alerts\AlertsMessageBag;
use Illuminate\View\Factory as ViewFactory;
use Pterodactyl\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
use PDO;
use PDOException;
use Pterodactyl\Services\Databases\Hosts\HostUpdateService;
use Pterodactyl\Http\Requests\Admin\DatabaseHostFormRequest;
use Pterodactyl\Services\Databases\Hosts\HostCreationService;
@@ -31,8 +37,7 @@ class DatabaseController extends Controller
private HostUpdateService $updateService,
private LocationRepositoryInterface $locationRepository,
private ViewFactory $view,
) {
}
) {}
/**
* Display database host index.
@@ -126,4 +131,70 @@ class DatabaseController extends Controller
return redirect()->route('admin.databases');
}
/**
* Test database connection credentials.
*
* @throws \Illuminate\Validation\ValidationException
*/
public function testConnection(Request $request): JsonResponse
{
$this->validate($request, [
'host' => 'required|string',
'port' => 'required|integer|min:1|max:65535',
'username' => 'required|string',
'password' => 'required|string',
]);
Log::error("TestConnection", [
"\nhost" => $request->host,
"\nport" => $request->port,
"\nusername" => $request->username,
"\npassword" => $request->password
]);
try {
$dsn = "mysql:host={$request->input('host')};port={$request->input('port')};charset=utf8";
$pdo = new PDO($dsn, $request->input('username'), $request->input('password'), [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_TIMEOUT => 5, // 5 second timeout
]);
// Test basic query
$version = $pdo->query('SELECT VERSION() as version')->fetchColumn();
// Test GRANT permissions (this is what Pterodactyl needs)
$grants = $pdo->query('SHOW GRANTS FOR CURRENT_USER()')->fetchAll(PDO::FETCH_COLUMN);
$hasGrantOption = false;
foreach ($grants as $grant) {
if (stripos($grant, 'GRANT OPTION') !== false) {
$hasGrantOption = true;
break;
}
}
$message = "Successfully connected to MySQL server (Version: {$version}).";
if (!$hasGrantOption) {
$message .= " Warning: The user appears to lack GRANT OPTION permission which is required for creating databases and users.";
}
return response()->json([
'success' => true,
'message' => $message,
'version' => $version,
'has_grant_option' => $hasGrantOption
]);
} catch (PDOException $e) {
return response()->json([
'success' => false,
'message' => 'Connection failed: ' . $e->getMessage()
], 422);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error: ' . $e->getMessage()
], 422);
}
}
}

View File

@@ -57,36 +57,39 @@
</div>
</div>
</div>
<div class="modal fade" id="newHostModal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<form action="{{ route('admin.databases') }}" method="POST">
<form action="{{ route('admin.databases') }}" method="POST" id="databaseHostForm">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">Create New Database Host</h4>
</div>
<div class="modal-body">
<div id="testResult" style="display: none;"></div>
<div class="form-group">
<label for="pName" class="form-label">Name</label>
<input type="text" name="name" id="pName" class="form-control" />
<input type="text" name="name" id="pName" class="form-control" value="{{ old('name') }}" />
<p class="text-muted small">A short identifier used to distinguish this location from others. Must be between 1 and 60 characters, for example, <code>us.nyc.lvl3</code>.</p>
</div>
<div class="row">
<div class="col-md-6">
<label for="pHost" class="form-label">Host</label>
<input type="text" name="host" id="pHost" class="form-control" />
<input type="text" name="host" id="pHost" class="form-control" value="{{ old('host') }}" />
<p class="text-muted small">The IP address or FQDN that should be used when attempting to connect to this MySQL host <em>from the panel</em> to add new databases.</p>
</div>
<div class="col-md-6">
<label for="pPort" class="form-label">Port</label>
<input type="text" name="port" id="pPort" class="form-control" value="3306"/>
<input type="text" name="port" id="pPort" class="form-control" value="{{ old('port', '3306') }}"/>
<p class="text-muted small">The port that MySQL is running on for this host.</p>
</div>
</div>
<div class="row">
<div class="col-md-6">
<label for="pUsername" class="form-label">Username</label>
<input type="text" name="username" id="pUsername" class="form-control" />
<input type="text" name="username" id="pUsername" class="form-control" value="{{ old('username') }}" />
<p class="text-muted small">The username of an account that has enough permissions to create new users and databases on the system.</p>
</div>
<div class="col-md-6">
@@ -102,7 +105,7 @@
@foreach($locations as $location)
<optgroup label="{{ $location->short }}">
@foreach($location->nodes as $node)
<option value="{{ $node->id }}">{{ $node->name }}</option>
<option value="{{ $node->id }}" {{ old('node_id') == $node->id ? 'selected' : '' }}>{{ $node->name }}</option>
@endforeach
</optgroup>
@endforeach
@@ -114,6 +117,7 @@
<p class="text-danger small text-left">The account defined for this database host <strong>must</strong> have the <code>WITH GRANT OPTION</code> permission. If the defined account does not have this permission requests to create databases <em>will</em> fail. <strong>Do not use the same account details for MySQL that you have defined for this panel.</strong></p>
{!! csrf_field() !!}
<button type="button" class="btn btn-default btn-sm pull-left" data-dismiss="modal">Cancel</button>
<button type="button" id="testDatabaseBtn" class="btn btn-primary btn-sm">Test Database</button>
<button type="submit" class="btn btn-success btn-sm">Create</button>
</div>
</form>
@@ -126,5 +130,70 @@
@parent
<script>
$('#pNodeId').select2();
// Test database connection
$('#testDatabaseBtn').on('click', function() {
const button = $(this);
const originalText = button.text();
const resultDiv = $('#testResult');
// Show loading state
button.prop('disabled', true).text('Testing...');
resultDiv.hide().removeClass('alert alert-danger alert-success').html('');
// Get form data
const formData = {
host: $('#pHost').val(),
port: $('#pPort').val(),
username: $('#pUsername').val(),
password: $('#pPassword').val(),
_token: '{{ csrf_token() }}'
};
// Validate required fields
if (!formData.host || !formData.port || !formData.username || !formData.password) {
resultDiv.html('<strong>Error:</strong> Please fill in all required database connection fields.').addClass('alert alert-danger').show();
button.prop('disabled', false).text(originalText);
return;
}
// Simple AJAX request
$.ajax({
url: '{{ route('admin.databases.test') }}',
method: 'POST',
data: formData,
success: function(response) {
if (response.success) {
resultDiv.html('<strong>Success:</strong> ' + response.message).addClass('alert alert-success').show();
} else {
resultDiv.html('<strong>Error:</strong> ' + response.message).addClass('alert alert-danger').show();
}
},
error: function(xhr) {
let message = 'An unexpected error occurred.';
if (xhr.responseJSON && xhr.responseJSON.message) {
message = xhr.responseJSON.message;
} else if (xhr.statusText) {
message = xhr.statusText;
}
resultDiv.html('<strong>Error:</strong> ' + message).addClass('alert alert-danger').show();
},
complete: function() {
button.prop('disabled', false).text(originalText);
}
});
});
// Clear test results when modal is opened
$('#newHostModal').on('show.bs.modal', function() {
$('#testResult').hide().empty();
});
// Re-open modal if there are old inputs (form was submitted but had errors)
@if($errors->any())
$(document).ready(function() {
$('#newHostModal').modal('show');
});
@endif
</script>
@endsection

View File

@@ -15,12 +15,12 @@ Route::get('/', [Admin\BaseController::class, 'index'])->name('admin.index');
|
*/
Route::group(['prefix' => 'api'], function () {
Route::get('/', [Admin\ApiController::class, 'index'])->name('admin.api.index');
Route::get('/new', [Admin\ApiController::class, 'create'])->name('admin.api.new');
Route::get('/', [Admin\ApiController::class, 'index'])->name('admin.api.index');
Route::get('/new', [Admin\ApiController::class, 'create'])->name('admin.api.new');
Route::post('/new', [Admin\ApiController::class, 'store']);
Route::post('/new', [Admin\ApiController::class, 'store']);
Route::delete('/revoke/{identifier}', [Admin\ApiController::class, 'delete'])->name('admin.api.delete');
Route::delete('/revoke/{identifier}', [Admin\ApiController::class, 'delete'])->name('admin.api.delete');
});
/*
@@ -32,11 +32,11 @@ Route::group(['prefix' => 'api'], function () {
|
*/
Route::group(['prefix' => 'locations'], function () {
Route::get('/', [Admin\LocationController::class, 'index'])->name('admin.locations');
Route::get('/view/{location:id}', [Admin\LocationController::class, 'view'])->name('admin.locations.view');
Route::get('/', [Admin\LocationController::class, 'index'])->name('admin.locations');
Route::get('/view/{location:id}', [Admin\LocationController::class, 'view'])->name('admin.locations.view');
Route::post('/', [Admin\LocationController::class, 'create']);
Route::patch('/view/{location:id}', [Admin\LocationController::class, 'update']);
Route::post('/', [Admin\LocationController::class, 'create']);
Route::patch('/view/{location:id}', [Admin\LocationController::class, 'update']);
});
/*
@@ -48,12 +48,13 @@ Route::group(['prefix' => 'locations'], function () {
|
*/
Route::group(['prefix' => 'databases'], function () {
Route::get('/', [Admin\DatabaseController::class, 'index'])->name('admin.databases');
Route::get('/view/{host:id}', [Admin\DatabaseController::class, 'view'])->name('admin.databases.view');
Route::get('/', [Admin\DatabaseController::class, 'index'])->name('admin.databases');
Route::get('/view/{host:id}', [Admin\DatabaseController::class, 'view'])->name('admin.databases.view');
Route::post('/', [Admin\DatabaseController::class, 'create']);
Route::patch('/view/{host:id}', [Admin\DatabaseController::class, 'update']);
Route::delete('/view/{host:id}', [Admin\DatabaseController::class, 'delete']);
Route::post('/', [Admin\DatabaseController::class, 'create']);
Route::post('/test', [Admin\DatabaseController::class, 'testConnection'])->name('admin.databases.test');
Route::patch('/view/{host:id}', [Admin\DatabaseController::class, 'update']);
Route::delete('/view/{host:id}', [Admin\DatabaseController::class, 'delete']);
});
/*
@@ -65,30 +66,30 @@ Route::group(['prefix' => 'databases'], function () {
|
*/
Route::group(['prefix' => 'settings'], function () {
Route::get('/', [Admin\Settings\IndexController::class, 'index'])->name('admin.settings');
Route::get('/mail', [Admin\Settings\MailController::class, 'index'])->name('admin.settings.mail');
Route::get('/advanced', [Admin\Settings\AdvancedController::class, 'index'])->name('admin.settings.advanced');
Route::get('/captcha', [Admin\Settings\CaptchaController::class, 'index'])->name('admin.settings.captcha');
Route::get('/', [Admin\Settings\IndexController::class, 'index'])->name('admin.settings');
Route::get('/mail', [Admin\Settings\MailController::class, 'index'])->name('admin.settings.mail');
Route::get('/advanced', [Admin\Settings\AdvancedController::class, 'index'])->name('admin.settings.advanced');
Route::get('/captcha', [Admin\Settings\CaptchaController::class, 'index'])->name('admin.settings.captcha');
Route::group(['prefix' => 'domains'], function () {
Route::get('/', [Admin\Settings\DomainsController::class, 'index'])->name('admin.settings.domains.index');
Route::get('/create', [Admin\Settings\DomainsController::class, 'create'])->name('admin.settings.domains.create');
Route::get('/{domain}/edit', [Admin\Settings\DomainsController::class, 'edit'])->name('admin.settings.domains.edit');
Route::group(['prefix' => 'domains'], function () {
Route::get('/', [Admin\Settings\DomainsController::class, 'index'])->name('admin.settings.domains.index');
Route::get('/create', [Admin\Settings\DomainsController::class, 'create'])->name('admin.settings.domains.create');
Route::get('/{domain}/edit', [Admin\Settings\DomainsController::class, 'edit'])->name('admin.settings.domains.edit');
Route::post('/', [Admin\Settings\DomainsController::class, 'store'])->name('admin.settings.domains.store');
Route::patch('/{domain}', [Admin\Settings\DomainsController::class, 'update'])->name('admin.settings.domains.update');
Route::delete('/{domain}', [Admin\Settings\DomainsController::class, 'destroy'])->name('admin.settings.domains.destroy');
Route::post('/', [Admin\Settings\DomainsController::class, 'store'])->name('admin.settings.domains.store');
Route::patch('/{domain}', [Admin\Settings\DomainsController::class, 'update'])->name('admin.settings.domains.update');
Route::delete('/{domain}', [Admin\Settings\DomainsController::class, 'destroy'])->name('admin.settings.domains.destroy');
Route::post('/test-connection', [Admin\Settings\DomainsController::class, 'testConnection'])->name('admin.settings.domains.test-connection');
Route::get('/provider-schema/{provider}', [Admin\Settings\DomainsController::class, 'getProviderSchema'])->name('admin.settings.domains.provider-schema');
});
Route::post('/test-connection', [Admin\Settings\DomainsController::class, 'testConnection'])->name('admin.settings.domains.test-connection');
Route::get('/provider-schema/{provider}', [Admin\Settings\DomainsController::class, 'getProviderSchema'])->name('admin.settings.domains.provider-schema');
});
Route::post('/mail/test', [Admin\Settings\MailController::class, 'test'])->name('admin.settings.mail.test');
Route::post('/mail/test', [Admin\Settings\MailController::class, 'test'])->name('admin.settings.mail.test');
Route::patch('/', [Admin\Settings\IndexController::class, 'update']);
Route::patch('/mail', [Admin\Settings\MailController::class, 'update']);
Route::patch('/advanced', [Admin\Settings\AdvancedController::class, 'update']);
Route::patch('/captcha', [Admin\Settings\CaptchaController::class, 'update']);
Route::patch('/', [Admin\Settings\IndexController::class, 'update']);
Route::patch('/mail', [Admin\Settings\MailController::class, 'update']);
Route::patch('/advanced', [Admin\Settings\AdvancedController::class, 'update']);
Route::patch('/captcha', [Admin\Settings\CaptchaController::class, 'update']);
});
/*
@@ -100,15 +101,15 @@ Route::group(['prefix' => 'settings'], function () {
|
*/
Route::group(['prefix' => 'users'], function () {
Route::get('/', [Admin\UserController::class, 'index'])->name('admin.users');
Route::get('/accounts.json', [Admin\UserController::class, 'json'])->name('admin.users.json');
Route::get('/new', [Admin\UserController::class, 'create'])->name('admin.users.new');
Route::get('/view/{user:id}', [Admin\UserController::class, 'view'])->name('admin.users.view');
Route::get('/', [Admin\UserController::class, 'index'])->name('admin.users');
Route::get('/accounts.json', [Admin\UserController::class, 'json'])->name('admin.users.json');
Route::get('/new', [Admin\UserController::class, 'create'])->name('admin.users.new');
Route::get('/view/{user:id}', [Admin\UserController::class, 'view'])->name('admin.users.view');
Route::post('/new', [Admin\UserController::class, 'store']);
Route::post('/new', [Admin\UserController::class, 'store']);
Route::patch('/view/{user:id}', [Admin\UserController::class, 'update']);
Route::delete('/view/{user:id}', [Admin\UserController::class, 'delete']);
Route::patch('/view/{user:id}', [Admin\UserController::class, 'update']);
Route::delete('/view/{user:id}', [Admin\UserController::class, 'delete']);
});
/*
@@ -120,38 +121,38 @@ Route::group(['prefix' => 'users'], function () {
|
*/
Route::group(['prefix' => 'servers'], function () {
Route::get('/', [Admin\Servers\ServerController::class, 'index'])->name('admin.servers');
Route::get('/new', [Admin\Servers\CreateServerController::class, 'index'])->name('admin.servers.new');
Route::get('/view/{server:id}', [Admin\Servers\ServerViewController::class, 'index'])->name('admin.servers.view');
Route::get('/', [Admin\Servers\ServerController::class, 'index'])->name('admin.servers');
Route::get('/new', [Admin\Servers\CreateServerController::class, 'index'])->name('admin.servers.new');
Route::get('/view/{server:id}', [Admin\Servers\ServerViewController::class, 'index'])->name('admin.servers.view');
Route::group(['middleware' => [ServerInstalled::class]], function () {
Route::get('/view/{server:id}/details', [Admin\Servers\ServerViewController::class, 'details'])->name('admin.servers.view.details');
Route::get('/view/{server:id}/build', [Admin\Servers\ServerViewController::class, 'build'])->name('admin.servers.view.build');
Route::get('/view/{server:id}/startup', [Admin\Servers\ServerViewController::class, 'startup'])->name('admin.servers.view.startup');
Route::get('/view/{server:id}/database', [Admin\Servers\ServerViewController::class, 'database'])->name('admin.servers.view.database');
Route::get('/view/{server:id}/mounts', [Admin\Servers\ServerViewController::class, 'mounts'])->name('admin.servers.view.mounts');
});
Route::group(['middleware' => [ServerInstalled::class]], function () {
Route::get('/view/{server:id}/details', [Admin\Servers\ServerViewController::class, 'details'])->name('admin.servers.view.details');
Route::get('/view/{server:id}/build', [Admin\Servers\ServerViewController::class, 'build'])->name('admin.servers.view.build');
Route::get('/view/{server:id}/startup', [Admin\Servers\ServerViewController::class, 'startup'])->name('admin.servers.view.startup');
Route::get('/view/{server:id}/database', [Admin\Servers\ServerViewController::class, 'database'])->name('admin.servers.view.database');
Route::get('/view/{server:id}/mounts', [Admin\Servers\ServerViewController::class, 'mounts'])->name('admin.servers.view.mounts');
});
Route::get('/view/{server:id}/manage', [Admin\Servers\ServerViewController::class, 'manage'])->name('admin.servers.view.manage');
Route::get('/view/{server:id}/delete', [Admin\Servers\ServerViewController::class, 'delete'])->name('admin.servers.view.delete');
Route::get('/view/{server:id}/manage', [Admin\Servers\ServerViewController::class, 'manage'])->name('admin.servers.view.manage');
Route::get('/view/{server:id}/delete', [Admin\Servers\ServerViewController::class, 'delete'])->name('admin.servers.view.delete');
Route::post('/new', [Admin\Servers\CreateServerController::class, 'store']);
Route::post('/view/{server:id}/build', [Admin\ServersController::class, 'updateBuild']);
Route::post('/view/{server:id}/startup', [Admin\ServersController::class, 'saveStartup']);
Route::post('/view/{server:id}/database', [Admin\ServersController::class, 'newDatabase']);
Route::post('/view/{server:id}/mounts', [Admin\ServersController::class, 'addMount'])->name('admin.servers.view.mounts.store');
Route::post('/view/{server:id}/manage/toggle', [Admin\ServersController::class, 'toggleInstall'])->name('admin.servers.view.manage.toggle');
Route::post('/view/{server:id}/manage/suspension', [Admin\ServersController::class, 'manageSuspension'])->name('admin.servers.view.manage.suspension');
Route::post('/view/{server:id}/manage/reinstall', [Admin\ServersController::class, 'reinstallServer'])->name('admin.servers.view.manage.reinstall');
Route::post('/view/{server:id}/manage/transfer', [Admin\Servers\ServerTransferController::class, 'transfer'])->name('admin.servers.view.manage.transfer');
Route::post('/view/{server:id}/delete', [Admin\ServersController::class, 'delete']);
Route::post('/new', [Admin\Servers\CreateServerController::class, 'store']);
Route::post('/view/{server:id}/build', [Admin\ServersController::class, 'updateBuild']);
Route::post('/view/{server:id}/startup', [Admin\ServersController::class, 'saveStartup']);
Route::post('/view/{server:id}/database', [Admin\ServersController::class, 'newDatabase']);
Route::post('/view/{server:id}/mounts', [Admin\ServersController::class, 'addMount'])->name('admin.servers.view.mounts.store');
Route::post('/view/{server:id}/manage/toggle', [Admin\ServersController::class, 'toggleInstall'])->name('admin.servers.view.manage.toggle');
Route::post('/view/{server:id}/manage/suspension', [Admin\ServersController::class, 'manageSuspension'])->name('admin.servers.view.manage.suspension');
Route::post('/view/{server:id}/manage/reinstall', [Admin\ServersController::class, 'reinstallServer'])->name('admin.servers.view.manage.reinstall');
Route::post('/view/{server:id}/manage/transfer', [Admin\Servers\ServerTransferController::class, 'transfer'])->name('admin.servers.view.manage.transfer');
Route::post('/view/{server:id}/delete', [Admin\ServersController::class, 'delete']);
Route::patch('/view/{server:id}/details', [Admin\ServersController::class, 'setDetails']);
Route::patch('/view/{server:id}/database', [Admin\ServersController::class, 'resetDatabasePassword']);
Route::patch('/view/{server:id}/details', [Admin\ServersController::class, 'setDetails']);
Route::patch('/view/{server:id}/database', [Admin\ServersController::class, 'resetDatabasePassword']);
Route::delete('/view/{server:id}/database/{database:id}/delete', [Admin\ServersController::class, 'deleteDatabase'])->name('admin.servers.view.database.delete');
Route::delete('/view/{server:id}/mounts/{mount:id}', [Admin\ServersController::class, 'deleteMount'])
->name('admin.servers.view.mounts.delete');
Route::delete('/view/{server:id}/database/{database:id}/delete', [Admin\ServersController::class, 'deleteDatabase'])->name('admin.servers.view.database.delete');
Route::delete('/view/{server:id}/mounts/{mount:id}', [Admin\ServersController::class, 'deleteMount'])
->name('admin.servers.view.mounts.delete');
});
/*
@@ -163,26 +164,26 @@ Route::group(['prefix' => 'servers'], function () {
|
*/
Route::group(['prefix' => 'nodes'], function () {
Route::get('/', [Admin\Nodes\NodeController::class, 'index'])->name('admin.nodes');
Route::get('/new', [Admin\NodesController::class, 'create'])->name('admin.nodes.new');
Route::get('/view/{node:id}', [Admin\Nodes\NodeViewController::class, 'index'])->name('admin.nodes.view');
Route::get('/view/{node:id}/settings', [Admin\Nodes\NodeViewController::class, 'settings'])->name('admin.nodes.view.settings');
Route::get('/view/{node:id}/configuration', [Admin\Nodes\NodeViewController::class, 'configuration'])->name('admin.nodes.view.configuration');
Route::get('/view/{node:id}/allocation', [Admin\Nodes\NodeViewController::class, 'allocations'])->name('admin.nodes.view.allocation');
Route::get('/view/{node:id}/servers', [Admin\Nodes\NodeViewController::class, 'servers'])->name('admin.nodes.view.servers');
Route::get('/view/{node:id}/system-information', Admin\Nodes\SystemInformationController::class);
Route::get('/', [Admin\Nodes\NodeController::class, 'index'])->name('admin.nodes');
Route::get('/new', [Admin\NodesController::class, 'create'])->name('admin.nodes.new');
Route::get('/view/{node:id}', [Admin\Nodes\NodeViewController::class, 'index'])->name('admin.nodes.view');
Route::get('/view/{node:id}/settings', [Admin\Nodes\NodeViewController::class, 'settings'])->name('admin.nodes.view.settings');
Route::get('/view/{node:id}/configuration', [Admin\Nodes\NodeViewController::class, 'configuration'])->name('admin.nodes.view.configuration');
Route::get('/view/{node:id}/allocation', [Admin\Nodes\NodeViewController::class, 'allocations'])->name('admin.nodes.view.allocation');
Route::get('/view/{node:id}/servers', [Admin\Nodes\NodeViewController::class, 'servers'])->name('admin.nodes.view.servers');
Route::get('/view/{node:id}/system-information', Admin\Nodes\SystemInformationController::class);
Route::post('/new', [Admin\NodesController::class, 'store']);
Route::post('/view/{node:id}/allocation', [Admin\NodesController::class, 'createAllocation']);
Route::post('/view/{node:id}/allocation/remove', [Admin\NodesController::class, 'allocationRemoveBlock'])->name('admin.nodes.view.allocation.removeBlock');
Route::post('/view/{node:id}/allocation/alias', [Admin\NodesController::class, 'allocationSetAlias'])->name('admin.nodes.view.allocation.setAlias');
Route::post('/view/{node:id}/settings/token', Admin\NodeAutoDeployController::class)->name('admin.nodes.view.configuration.token');
Route::post('/new', [Admin\NodesController::class, 'store']);
Route::post('/view/{node:id}/allocation', [Admin\NodesController::class, 'createAllocation']);
Route::post('/view/{node:id}/allocation/remove', [Admin\NodesController::class, 'allocationRemoveBlock'])->name('admin.nodes.view.allocation.removeBlock');
Route::post('/view/{node:id}/allocation/alias', [Admin\NodesController::class, 'allocationSetAlias'])->name('admin.nodes.view.allocation.setAlias');
Route::post('/view/{node:id}/settings/token', Admin\NodeAutoDeployController::class)->name('admin.nodes.view.configuration.token');
Route::patch('/view/{node:id}/settings', [Admin\NodesController::class, 'updateSettings']);
Route::patch('/view/{node:id}/settings', [Admin\NodesController::class, 'updateSettings']);
Route::delete('/view/{node:id}/delete', [Admin\NodesController::class, 'delete'])->name('admin.nodes.view.delete');
Route::delete('/view/{node:id}/allocation/remove/{allocation:id}', [Admin\NodesController::class, 'allocationRemoveSingle'])->name('admin.nodes.view.allocation.removeSingle');
Route::delete('/view/{node:id}/allocations', [Admin\NodesController::class, 'allocationRemoveMultiple'])->name('admin.nodes.view.allocation.removeMultiple');
Route::delete('/view/{node:id}/delete', [Admin\NodesController::class, 'delete'])->name('admin.nodes.view.delete');
Route::delete('/view/{node:id}/allocation/remove/{allocation:id}', [Admin\NodesController::class, 'allocationRemoveSingle'])->name('admin.nodes.view.allocation.removeSingle');
Route::delete('/view/{node:id}/allocations', [Admin\NodesController::class, 'allocationRemoveMultiple'])->name('admin.nodes.view.allocation.removeMultiple');
});
/*
@@ -194,17 +195,17 @@ Route::group(['prefix' => 'nodes'], function () {
|
*/
Route::group(['prefix' => 'mounts'], function () {
Route::get('/', [Admin\MountController::class, 'index'])->name('admin.mounts');
Route::get('/view/{mount:id}', [Admin\MountController::class, 'view'])->name('admin.mounts.view');
Route::get('/', [Admin\MountController::class, 'index'])->name('admin.mounts');
Route::get('/view/{mount:id}', [Admin\MountController::class, 'view'])->name('admin.mounts.view');
Route::post('/', [Admin\MountController::class, 'create']);
Route::post('/{mount:id}/eggs', [Admin\MountController::class, 'addEggs'])->name('admin.mounts.eggs');
Route::post('/{mount:id}/nodes', [Admin\MountController::class, 'addNodes'])->name('admin.mounts.nodes');
Route::post('/', [Admin\MountController::class, 'create']);
Route::post('/{mount:id}/eggs', [Admin\MountController::class, 'addEggs'])->name('admin.mounts.eggs');
Route::post('/{mount:id}/nodes', [Admin\MountController::class, 'addNodes'])->name('admin.mounts.nodes');
Route::patch('/view/{mount:id}', [Admin\MountController::class, 'update']);
Route::patch('/view/{mount:id}', [Admin\MountController::class, 'update']);
Route::delete('/{mount:id}/eggs/{egg_id}', [Admin\MountController::class, 'deleteEgg']);
Route::delete('/{mount:id}/nodes/{node_id}', [Admin\MountController::class, 'deleteNode']);
Route::delete('/{mount:id}/eggs/{egg_id}', [Admin\MountController::class, 'deleteEgg']);
Route::delete('/{mount:id}/nodes/{node_id}', [Admin\MountController::class, 'deleteNode']);
});
/*
@@ -216,29 +217,29 @@ Route::group(['prefix' => 'mounts'], function () {
|
*/
Route::group(['prefix' => 'nests'], function () {
Route::get('/', [Admin\Nests\NestController::class, 'index'])->name('admin.nests');
Route::get('/new', [Admin\Nests\NestController::class, 'create'])->name('admin.nests.new');
Route::get('/view/{nest:id}', [Admin\Nests\NestController::class, 'view'])->name('admin.nests.view');
Route::get('/egg/new', [Admin\Nests\EggController::class, 'create'])->name('admin.nests.egg.new');
Route::get('/egg/{egg:id}', [Admin\Nests\EggController::class, 'view'])->name('admin.nests.egg.view');
Route::get('/egg/{egg:id}/export', [Admin\Nests\EggShareController::class, 'export'])->name('admin.nests.egg.export');
Route::get('/egg/{egg:id}/variables', [Admin\Nests\EggVariableController::class, 'view'])->name('admin.nests.egg.variables');
Route::get('/egg/{egg:id}/scripts', [Admin\Nests\EggScriptController::class, 'index'])->name('admin.nests.egg.scripts');
Route::get('/', [Admin\Nests\NestController::class, 'index'])->name('admin.nests');
Route::get('/new', [Admin\Nests\NestController::class, 'create'])->name('admin.nests.new');
Route::get('/view/{nest:id}', [Admin\Nests\NestController::class, 'view'])->name('admin.nests.view');
Route::get('/egg/new', [Admin\Nests\EggController::class, 'create'])->name('admin.nests.egg.new');
Route::get('/egg/{egg:id}', [Admin\Nests\EggController::class, 'view'])->name('admin.nests.egg.view');
Route::get('/egg/{egg:id}/export', [Admin\Nests\EggShareController::class, 'export'])->name('admin.nests.egg.export');
Route::get('/egg/{egg:id}/variables', [Admin\Nests\EggVariableController::class, 'view'])->name('admin.nests.egg.variables');
Route::get('/egg/{egg:id}/scripts', [Admin\Nests\EggScriptController::class, 'index'])->name('admin.nests.egg.scripts');
Route::post('/new', [Admin\Nests\NestController::class, 'store']);
Route::post('/import', [Admin\Nests\EggShareController::class, 'import'])->name('admin.nests.egg.import');
Route::post('/importFromUrl', [Admin\Nests\EggShareController::class, 'importFromUrl'])->name('admin.nests.egg.import_url');
Route::post('/egg/new', [Admin\Nests\EggController::class, 'store']);
Route::post('/egg/{egg:id}/variables', [Admin\Nests\EggVariableController::class, 'store']);
Route::post('/new', [Admin\Nests\NestController::class, 'store']);
Route::post('/import', [Admin\Nests\EggShareController::class, 'import'])->name('admin.nests.egg.import');
Route::post('/importFromUrl', [Admin\Nests\EggShareController::class, 'importFromUrl'])->name('admin.nests.egg.import_url');
Route::post('/egg/new', [Admin\Nests\EggController::class, 'store']);
Route::post('/egg/{egg:id}/variables', [Admin\Nests\EggVariableController::class, 'store']);
Route::put('/egg/{egg:id}', [Admin\Nests\EggShareController::class, 'update']);
Route::put('/egg/{egg:id}', [Admin\Nests\EggShareController::class, 'update']);
Route::patch('/view/{nest:id}', [Admin\Nests\NestController::class, 'update']);
Route::patch('/egg/{egg:id}', [Admin\Nests\EggController::class, 'update']);
Route::patch('/egg/{egg:id}/scripts', [Admin\Nests\EggScriptController::class, 'update']);
Route::patch('/egg/{egg:id}/variables/{variable:id}', [Admin\Nests\EggVariableController::class, 'update'])->name('admin.nests.egg.variables.edit');
Route::patch('/view/{nest:id}', [Admin\Nests\NestController::class, 'update']);
Route::patch('/egg/{egg:id}', [Admin\Nests\EggController::class, 'update']);
Route::patch('/egg/{egg:id}/scripts', [Admin\Nests\EggScriptController::class, 'update']);
Route::patch('/egg/{egg:id}/variables/{variable:id}', [Admin\Nests\EggVariableController::class, 'update'])->name('admin.nests.egg.variables.edit');
Route::delete('/view/{nest:id}', [Admin\Nests\NestController::class, 'destroy']);
Route::delete('/egg/{egg:id}', [Admin\Nests\EggController::class, 'destroy']);
Route::delete('/egg/{egg:id}/variables/{variable:id}', [Admin\Nests\EggVariableController::class, 'destroy']);
Route::delete('/view/{nest:id}', [Admin\Nests\NestController::class, 'destroy']);
Route::delete('/egg/{egg:id}', [Admin\Nests\EggController::class, 'destroy']);
Route::delete('/egg/{egg:id}/variables/{variable:id}', [Admin\Nests\EggVariableController::class, 'destroy']);
});