Merge branch 'next' into feat/manage-db-using-api
This commit is contained in:
@@ -46,7 +46,10 @@ Route::group([
|
||||
|
||||
Route::get('/projects', [ProjectController::class, 'projects'])->middleware(['api.ability:read']);
|
||||
Route::get('/projects/{uuid}', [ProjectController::class, 'project_by_uuid'])->middleware(['api.ability:read']);
|
||||
Route::get('/projects/{uuid}/environments', [ProjectController::class, 'get_environments'])->middleware(['api.ability:read']);
|
||||
Route::get('/projects/{uuid}/{environment_name_or_uuid}', [ProjectController::class, 'environment_details'])->middleware(['api.ability:read']);
|
||||
Route::post('/projects/{uuid}/environments', [ProjectController::class, 'create_environment'])->middleware(['api.ability:write']);
|
||||
Route::delete('/projects/{uuid}/environments/{environment_name_or_uuid}', [ProjectController::class, 'delete_environment'])->middleware(['api.ability:write']);
|
||||
|
||||
Route::post('/projects', [ProjectController::class, 'create_project'])->middleware(['api.ability:read']);
|
||||
Route::patch('/projects/{uuid}', [ProjectController::class, 'update_project'])->middleware(['api.ability:write']);
|
||||
@@ -59,7 +62,7 @@ Route::group([
|
||||
Route::patch('/security/keys/{uuid}', [SecurityController::class, 'update_key'])->middleware(['api.ability:write']);
|
||||
Route::delete('/security/keys/{uuid}', [SecurityController::class, 'delete_key'])->middleware(['api.ability:write']);
|
||||
|
||||
Route::match(['get', 'post'], '/deploy', [DeployController::class, 'deploy'])->middleware(['api.ability:write,deploy']);
|
||||
Route::match(['get', 'post'], '/deploy', [DeployController::class, 'deploy'])->middleware(['api.ability:deploy']);
|
||||
Route::get('/deployments', [DeployController::class, 'deployments'])->middleware(['api.ability:read']);
|
||||
Route::get('/deployments/{uuid}', [DeployController::class, 'deployment_by_uuid'])->middleware(['api.ability:read']);
|
||||
Route::get('/deployments/applications/{uuid}', [DeployController::class, 'get_application_deployments'])->middleware(['api.ability:read']);
|
||||
|
||||
@@ -37,8 +37,9 @@ use App\Livewire\Security\ApiTokens;
|
||||
use App\Livewire\Security\PrivateKey\Index as SecurityPrivateKeyIndex;
|
||||
use App\Livewire\Security\PrivateKey\Show as SecurityPrivateKeyShow;
|
||||
use App\Livewire\Server\Advanced as ServerAdvanced;
|
||||
use App\Livewire\Server\CaCertificate\Show as CaCertificateShow;
|
||||
use App\Livewire\Server\Charts as ServerCharts;
|
||||
use App\Livewire\Server\CloudflareTunnels;
|
||||
use App\Livewire\Server\CloudflareTunnel;
|
||||
use App\Livewire\Server\Delete as DeleteServer;
|
||||
use App\Livewire\Server\Destinations as ServerDestinations;
|
||||
use App\Livewire\Server\DockerCleanup;
|
||||
@@ -49,8 +50,11 @@ use App\Livewire\Server\Proxy\DynamicConfigurations as ProxyDynamicConfiguration
|
||||
use App\Livewire\Server\Proxy\Logs as ProxyLogs;
|
||||
use App\Livewire\Server\Proxy\Show as ProxyShow;
|
||||
use App\Livewire\Server\Resources as ResourcesShow;
|
||||
use App\Livewire\Server\Security\Patches;
|
||||
use App\Livewire\Server\Show as ServerShow;
|
||||
use App\Livewire\Settings\Advanced as SettingsAdvanced;
|
||||
use App\Livewire\Settings\Index as SettingsIndex;
|
||||
use App\Livewire\Settings\Updates as SettingsUpdates;
|
||||
use App\Livewire\SettingsBackup;
|
||||
use App\Livewire\SettingsEmail;
|
||||
use App\Livewire\SettingsOauth;
|
||||
@@ -70,10 +74,8 @@ use App\Livewire\Team\AdminView as TeamAdminView;
|
||||
use App\Livewire\Team\Index as TeamIndex;
|
||||
use App\Livewire\Team\Member\Index as TeamMemberIndex;
|
||||
use App\Livewire\Terminal\Index as TerminalIndex;
|
||||
use App\Models\GitlabApp;
|
||||
use App\Models\ScheduledDatabaseBackupExecution;
|
||||
use App\Providers\RouteServiceProvider;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
||||
@@ -103,6 +105,9 @@ Route::middleware(['auth', 'verified'])->group(function () {
|
||||
Route::get('/subscription/new', SubscriptionIndex::class)->name('subscription.index');
|
||||
|
||||
Route::get('/settings', SettingsIndex::class)->name('settings.index');
|
||||
Route::get('/settings/advanced', SettingsAdvanced::class)->name('settings.advanced');
|
||||
Route::get('/settings/updates', SettingsUpdates::class)->name('settings.updates');
|
||||
|
||||
Route::get('/settings/backup', SettingsBackup::class)->name('settings.backup');
|
||||
Route::get('/settings/email', SettingsEmail::class)->name('settings.email');
|
||||
Route::get('/settings/oauth', SettingsOauth::class)->name('settings.oauth');
|
||||
@@ -140,7 +145,7 @@ Route::middleware(['auth', 'verified'])->group(function () {
|
||||
Route::get('/admin', TeamAdminView::class)->name('team.admin-view');
|
||||
});
|
||||
|
||||
Route::get('/terminal', TerminalIndex::class)->name('terminal');
|
||||
Route::get('/terminal', TerminalIndex::class)->name('terminal')->middleware('can.access.terminal');
|
||||
Route::post('/terminal/auth', function () {
|
||||
if (auth()->check()) {
|
||||
return response()->json(['authenticated' => true], 200);
|
||||
@@ -152,7 +157,7 @@ Route::middleware(['auth', 'verified'])->group(function () {
|
||||
Route::post('/terminal/auth/ips', function () {
|
||||
if (auth()->check()) {
|
||||
$team = auth()->user()->currentTeam();
|
||||
$ipAddresses = $team->servers()->pluck('ip')->toArray();
|
||||
$ipAddresses = $team->servers->where('settings.is_terminal_enabled', true)->pluck('ip')->toArray();
|
||||
|
||||
return response()->json(['ipAddresses' => $ipAddresses], 200);
|
||||
}
|
||||
@@ -162,19 +167,19 @@ Route::middleware(['auth', 'verified'])->group(function () {
|
||||
|
||||
Route::prefix('invitations')->group(function () {
|
||||
Route::get('/{uuid}', [Controller::class, 'acceptInvitation'])->name('team.invitation.accept');
|
||||
Route::get('/{uuid}/revoke', [Controller::class, 'revoke_invitation'])->name('team.invitation.revoke');
|
||||
Route::get('/{uuid}/revoke', [Controller::class, 'revokeInvitation'])->name('team.invitation.revoke');
|
||||
});
|
||||
|
||||
Route::get('/projects', ProjectIndex::class)->name('project.index');
|
||||
Route::prefix('project/{project_uuid}')->group(function () {
|
||||
Route::get('/', ProjectShow::class)->name('project.show');
|
||||
Route::get('/edit', ProjectEdit::class)->name('project.edit');
|
||||
Route::get('/edit', ProjectEdit::class)->name('project.edit')->middleware('can.update.resource');
|
||||
});
|
||||
Route::prefix('project/{project_uuid}/environment/{environment_uuid}')->group(function () {
|
||||
Route::get('/', ResourceIndex::class)->name('project.resource.index');
|
||||
Route::get('/clone', ProjectCloneMe::class)->name('project.clone-me');
|
||||
Route::get('/new', ResourceCreate::class)->name('project.resource.create');
|
||||
Route::get('/edit', EnvironmentEdit::class)->name('project.environment.edit');
|
||||
Route::get('/clone', ProjectCloneMe::class)->name('project.clone-me')->middleware('can.create.resources');
|
||||
Route::get('/new', ResourceCreate::class)->name('project.resource.create')->middleware('can.create.resources');
|
||||
Route::get('/edit', EnvironmentEdit::class)->name('project.environment.edit')->middleware('can.update.resource');
|
||||
});
|
||||
Route::prefix('project/{project_uuid}/environment/{environment_uuid}/application/{application_uuid}')->group(function () {
|
||||
Route::get('/', ApplicationConfiguration::class)->name('project.application.configuration');
|
||||
@@ -198,14 +203,14 @@ Route::middleware(['auth', 'verified'])->group(function () {
|
||||
Route::get('/deployment', DeploymentIndex::class)->name('project.application.deployment.index');
|
||||
Route::get('/deployment/{deployment_uuid}', DeploymentShow::class)->name('project.application.deployment.show');
|
||||
Route::get('/logs', Logs::class)->name('project.application.logs');
|
||||
Route::get('/terminal', ExecuteContainerCommand::class)->name('project.application.command');
|
||||
Route::get('/terminal', ExecuteContainerCommand::class)->name('project.application.command')->middleware('can.access.terminal');
|
||||
Route::get('/tasks/{task_uuid}', ScheduledTaskShow::class)->name('project.application.scheduled-tasks');
|
||||
});
|
||||
Route::prefix('project/{project_uuid}/environment/{environment_uuid}/database/{database_uuid}')->group(function () {
|
||||
Route::get('/', DatabaseConfiguration::class)->name('project.database.configuration');
|
||||
Route::get('/environment-variables', DatabaseConfiguration::class)->name('project.database.environment-variables');
|
||||
Route::get('/servers', DatabaseConfiguration::class)->name('project.database.servers');
|
||||
Route::get('/import-backups', DatabaseConfiguration::class)->name('project.database.import-backups');
|
||||
Route::get('/import-backups', DatabaseConfiguration::class)->name('project.database.import-backups')->middleware('can.update.resource');
|
||||
Route::get('/persistent-storage', DatabaseConfiguration::class)->name('project.database.persistent-storage');
|
||||
Route::get('/webhooks', DatabaseConfiguration::class)->name('project.database.webhooks');
|
||||
Route::get('/resource-limits', DatabaseConfiguration::class)->name('project.database.resource-limits');
|
||||
@@ -215,7 +220,7 @@ Route::middleware(['auth', 'verified'])->group(function () {
|
||||
Route::get('/danger', DatabaseConfiguration::class)->name('project.database.danger');
|
||||
|
||||
Route::get('/logs', Logs::class)->name('project.database.logs');
|
||||
Route::get('/terminal', ExecuteContainerCommand::class)->name('project.database.command');
|
||||
Route::get('/terminal', ExecuteContainerCommand::class)->name('project.database.command')->middleware('can.access.terminal');
|
||||
Route::get('/backups', DatabaseBackupIndex::class)->name('project.database.backup.index');
|
||||
Route::get('/backups/{backup_uuid}', DatabaseBackupExecution::class)->name('project.database.backup.execution');
|
||||
});
|
||||
@@ -229,7 +234,7 @@ Route::middleware(['auth', 'verified'])->group(function () {
|
||||
Route::get('/resource-operations', ServiceConfiguration::class)->name('project.service.resource-operations');
|
||||
Route::get('/tags', ServiceConfiguration::class)->name('project.service.tags');
|
||||
Route::get('/danger', ServiceConfiguration::class)->name('project.service.danger');
|
||||
Route::get('/terminal', ExecuteContainerCommand::class)->name('project.service.command');
|
||||
Route::get('/terminal', ExecuteContainerCommand::class)->name('project.service.command')->middleware('can.access.terminal');
|
||||
Route::get('/{stack_service_uuid}', ServiceIndex::class)->name('project.service.index');
|
||||
Route::get('/tasks/{task_uuid}', ScheduledTaskShow::class)->name('project.service.scheduled-tasks');
|
||||
});
|
||||
@@ -241,8 +246,9 @@ Route::middleware(['auth', 'verified'])->group(function () {
|
||||
Route::get('/', ServerShow::class)->name('server.show');
|
||||
Route::get('/advanced', ServerAdvanced::class)->name('server.advanced');
|
||||
Route::get('/private-key', PrivateKeyShow::class)->name('server.private-key');
|
||||
Route::get('/ca-certificate', CaCertificateShow::class)->name('server.ca-certificate');
|
||||
Route::get('/resources', ResourcesShow::class)->name('server.resources');
|
||||
Route::get('/cloudflare-tunnels', CloudflareTunnels::class)->name('server.cloudflare-tunnels');
|
||||
Route::get('/cloudflare-tunnel', CloudflareTunnel::class)->name('server.cloudflare-tunnel');
|
||||
Route::get('/destinations', ServerDestinations::class)->name('server.destinations');
|
||||
Route::get('/log-drains', LogDrains::class)->name('server.log-drains');
|
||||
Route::get('/metrics', ServerCharts::class)->name('server.charts');
|
||||
@@ -250,8 +256,10 @@ Route::middleware(['auth', 'verified'])->group(function () {
|
||||
Route::get('/proxy', ProxyShow::class)->name('server.proxy');
|
||||
Route::get('/proxy/dynamic', ProxyDynamicConfigurations::class)->name('server.proxy.dynamic-confs');
|
||||
Route::get('/proxy/logs', ProxyLogs::class)->name('server.proxy.logs');
|
||||
Route::get('/terminal', ExecuteContainerCommand::class)->name('server.command');
|
||||
Route::get('/terminal', ExecuteContainerCommand::class)->name('server.command')->middleware('can.access.terminal');
|
||||
Route::get('/docker-cleanup', DockerCleanup::class)->name('server.docker-cleanup');
|
||||
Route::get('/security', fn () => redirect(route('dashboard')))->name('server.security')->middleware('can.update.resource');
|
||||
Route::get('/security/patches', Patches::class)->name('server.security.patches')->middleware('can.update.resource');
|
||||
});
|
||||
Route::get('/destinations', DestinationIndex::class)->name('destination.index');
|
||||
Route::get('/destination/{destination_uuid}', DestinationShow::class)->name('destination.show');
|
||||
@@ -273,23 +281,20 @@ Route::middleware(['auth'])->group(function () {
|
||||
]);
|
||||
})->name('source.all');
|
||||
Route::get('/source/github/{github_app_uuid}', GitHubChange::class)->name('source.github.show');
|
||||
Route::get('/source/gitlab/{gitlab_app_uuid}', function (Request $request) {
|
||||
$gitlab_app = GitlabApp::ownedByCurrentTeam()->where('uuid', request()->gitlab_app_uuid)->firstOrFail();
|
||||
|
||||
return view('source.gitlab.show', [
|
||||
'gitlab_app' => $gitlab_app,
|
||||
]);
|
||||
})->name('source.gitlab.show');
|
||||
});
|
||||
|
||||
Route::middleware(['auth'])->group(function () {
|
||||
Route::post('/upload/backup/{databaseUuid}', [UploadController::class, 'upload'])->name('upload.backup');
|
||||
Route::get('/download/backup/{executionId}', function () {
|
||||
try {
|
||||
$team = auth()->user()->currentTeam();
|
||||
$user = auth()->user();
|
||||
$team = $user->currentTeam();
|
||||
if (is_null($team)) {
|
||||
return response()->json(['message' => 'Team not found.'], 404);
|
||||
}
|
||||
if ($user->isAdminFromSession() === false) {
|
||||
return response()->json(['message' => 'Only team admins/owners can download backups.'], 403);
|
||||
}
|
||||
$exeuctionId = request()->route('executionId');
|
||||
$execution = ScheduledDatabaseBackupExecution::where('id', $exeuctionId)->firstOrFail();
|
||||
$execution_team_id = $execution->scheduledDatabaseBackup->database->team()?->id;
|
||||
@@ -321,7 +326,11 @@ Route::middleware(['auth'])->group(function () {
|
||||
'root' => '/',
|
||||
]);
|
||||
if (! $disk->exists($filename)) {
|
||||
return response()->json(['message' => 'Backup not found.'], 404);
|
||||
if ($execution->scheduledDatabaseBackup->disable_local_backup === true && $execution->scheduledDatabaseBackup->save_s3 === true) {
|
||||
return response()->json(['message' => 'Backup not available locally, but available on S3.'], 404);
|
||||
}
|
||||
|
||||
return response()->json(['message' => 'Backup not found locally on the server.'], 404);
|
||||
}
|
||||
|
||||
return new StreamedResponse(function () use ($disk, $filename) {
|
||||
|
||||
Reference in New Issue
Block a user