name('dev.compose'); } Route::post('/forgot-password', [Controller::class, 'forgot_password'])->name('password.forgot'); Route::get('/api/v1/test/realtime', [Controller::class, 'realtime_test'])->middleware('auth'); Route::get('/waitlist', WaitlistIndex::class)->name('waitlist.index'); Route::get('/verify', [Controller::class, 'verify'])->middleware('auth')->name('verify.email'); Route::get('/email/verify/{id}/{hash}', [Controller::class, 'email_verify'])->middleware(['auth'])->name('verify.verify'); Route::middleware(['throttle:login'])->group(function () { Route::get('/auth/link', [Controller::class, 'link'])->name('auth.link'); }); Route::prefix('magic')->middleware(['auth'])->group(function () { Route::get('/servers', [MagicController::class, 'servers']); Route::get('/destinations', [MagicController::class, 'destinations']); Route::get('/projects', [MagicController::class, 'projects']); Route::get('/environments', [MagicController::class, 'environments']); Route::get('/project/new', [MagicController::class, 'newProject']); Route::get('/environment/new', [MagicController::class, 'newEnvironment']); }); Route::middleware(['auth', 'verified'])->group(function () { Route::middleware(['throttle:force-password-reset'])->group(function () { Route::get('/force-password-reset', ForcePasswordReset::class)->name('auth.force-password-reset'); }); Route::get('/', Dashboard::class)->name('dashboard'); Route::get('/boarding', BoardingIndex::class)->name('boarding'); Route::get('/subscription', SubscriptionIndex::class)->name('subscription.index'); Route::get('/settings', SettingsIndex::class)->name('settings.index'); Route::get('/settings/license', SettingsLicense::class)->name('settings.license'); Route::get('/profile', ProfileIndex::class)->name('profile'); Route::prefix('team')->group(function () { Route::get('/', TeamIndex::class)->name('team.index'); Route::get('/new', TeamCreate::class)->name('team.create'); Route::get('/members', TeamMemberIndex::class)->name('team.member.index'); Route::get('/notifications', TeamNotificationIndex::class)->name('team.notification.index'); Route::get('/storages', TeamStorageIndex::class)->name('team.storage.index'); Route::get('/storages/new', TeamStorageCreate::class)->name('team.storage.create'); Route::get('/storages/{storage_uuid}', TeamStorageShow::class)->name('team.storage.show'); }); Route::get('/command-center', CommandCenterIndex::class)->name('command-center'); Route::prefix('invitations')->group(function () { Route::get('/{uuid}', [Controller::class, 'accept_invitation'])->name('team.invitation.accept'); Route::get('/{uuid}/revoke', [Controller::class, 'revoke_invitation'])->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::prefix('project/{project_uuid}/{environment_name}')->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::prefix('project/{project_uuid}/{environment_name}/application/{application_uuid}')->group(function () { Route::get('/', ApplicationConfiguration::class)->name('project.application.configuration'); 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('/command', ExecuteContainerCommand::class)->name('project.application.command'); }); Route::prefix('project/{project_uuid}/{environment_name}/database/{database_uuid}')->group(function () { Route::get('/', DatabaseConfiguration::class)->name('project.database.configuration'); Route::get('/logs', Logs::class)->name('project.database.logs'); Route::get('/command', ExecuteContainerCommand::class)->name('project.database.command'); Route::get('/backups', DatabaseBackupIndex::class)->name('project.database.backup.index'); Route::get('/backups/{backup_uuid}', DatabaseBackupExecution::class)->name('project.database.backup.execution'); }); Route::prefix('project/{project_uuid}/{environment_name}/service/{service_uuid}')->group(function () { Route::get('/', ServiceConfiguration::class)->name('project.service.configuration'); Route::get('/{service_name}', ServiceIndex::class)->name('project.service.index'); Route::get('/command', ExecuteContainerCommand::class)->name('project.service.command'); }); Route::get('/servers', ServerIndex::class)->name('server.index'); Route::get('/server/new', ServerCreate::class)->name('server.create'); Route::prefix('server/{server_uuid}')->group(function () { Route::get('/', ServerShow::class)->name('server.show'); Route::get('/proxy', ProxyShow::class)->name('server.proxy'); Route::get('/proxy/logs', ProxyLogs::class)->name('server.proxy.logs'); Route::get('/private-key', PrivateKeyShow::class)->name('server.private-key'); Route::get('/destinations', DestinationShow::class)->name('server.destinations'); Route::get('/log-drains', LogDrains::class)->name('server.log-drains'); }); // Route::get('/security', fn () => view('security.index'))->name('security.index'); Route::get('/security/private-key', fn () => view('security.private-key.index', [ 'privateKeys' => PrivateKey::ownedByCurrentTeam(['name', 'uuid', 'is_git_related'])->get() ]))->name('security.private-key.index'); Route::get('/security/private-key/new', SecurityPrivateKeyCreate::class)->name('security.private-key.create'); Route::get('/security/private-key/{private_key_uuid}', SecurityPrivateKeyShow::class)->name('security.private-key.show'); Route::get('/security/api-tokens', ApiTokens::class)->name('security.api-tokens'); }); Route::middleware(['auth'])->group(function () { Route::get('/source/new', fn () => view('source.new'))->name('source.new'); Route::get('/sources', function () { $sources = currentTeam()->sources(); return view('source.all', [ 'sources' => $sources, ]); })->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::where('uuid', request()->gitlab_app_uuid)->first(); return view('source.gitlab.show', [ 'gitlab_app' => $gitlab_app, ]); })->name('source.gitlab.show'); }); Route::middleware(['auth'])->group(function () { Route::get('/destinations', function () { $servers = Server::all(); $destinations = collect([]); foreach ($servers as $server) { $destinations = $destinations->merge($server->destinations()); } return view('destination.all', [ 'destinations' => $destinations, ]); })->name('destination.all'); Route::get('/destination/new', function () { $servers = Server::isUsable()->get(); $pre_selected_server_uuid = data_get(request()->query(), 'server'); if ($pre_selected_server_uuid) { $server = $servers->firstWhere('uuid', $pre_selected_server_uuid); if ($server) { $server_id = $server->id; } } return view('destination.new', [ "servers" => $servers, "server_id" => $server_id ?? null, ]); })->name('destination.new'); Route::get('/destination/{destination_uuid}', function () { $standalone_dockers = StandaloneDocker::where('uuid', request()->destination_uuid)->first(); $swarm_dockers = SwarmDocker::where('uuid', request()->destination_uuid)->first(); if (!$standalone_dockers && !$swarm_dockers) { abort(404); } $destination = $standalone_dockers ? $standalone_dockers : $swarm_dockers; return view('destination.show', [ 'destination' => $destination->load(['server']), ]); })->name('destination.show'); }); Route::any('/{any}', function () { if (auth()->user()) { return redirect(RouteServiceProvider::HOME); } return redirect()->route('login'); })->where('any', '.*');