lasthourcloud/routes/web.php

346 lines
18 KiB
PHP
Raw Normal View History

2023-03-17 14:33:48 +00:00
<?php
2023-06-07 13:08:35 +00:00
use App\Http\Controllers\Controller;
use App\Http\Controllers\MagicController;
use App\Http\Controllers\OauthController;
2024-04-11 10:13:11 +00:00
use App\Http\Controllers\UploadController;
2024-02-08 10:45:19 +00:00
use App\Livewire\Admin\Index as AdminIndex;
2024-01-07 15:23:41 +00:00
use App\Livewire\Boarding\Index as BoardingIndex;
use App\Livewire\CommandCenter\Index as CommandCenterIndex;
2024-06-10 20:43:34 +00:00
use App\Livewire\Dashboard;
use App\Livewire\Dev\Compose as Compose;
2024-01-07 15:23:41 +00:00
use App\Livewire\ForcePasswordReset;
2024-06-10 20:43:34 +00:00
use App\Livewire\Notifications\Discord as NotificationDiscord;
use App\Livewire\Notifications\Email as NotificationEmail;
use App\Livewire\Notifications\Telegram as NotificationTelegram;
use App\Livewire\Profile\Index as ProfileIndex;
2024-01-07 15:23:41 +00:00
use App\Livewire\Project\Application\Configuration as ApplicationConfiguration;
use App\Livewire\Project\Application\Deployment\Index as DeploymentIndex;
use App\Livewire\Project\Application\Deployment\Show as DeploymentShow;
2024-06-10 20:43:34 +00:00
use App\Livewire\Project\CloneMe as ProjectCloneMe;
2024-01-07 15:23:41 +00:00
use App\Livewire\Project\Database\Backup\Execution as DatabaseBackupExecution;
2024-06-10 20:43:34 +00:00
use App\Livewire\Project\Database\Backup\Index as DatabaseBackupIndex;
use App\Livewire\Project\Database\Configuration as DatabaseConfiguration;
use App\Livewire\Project\Edit as ProjectEdit;
use App\Livewire\Project\EnvironmentEdit;
use App\Livewire\Project\Index as ProjectIndex;
use App\Livewire\Project\Resource\Create as ResourceCreate;
use App\Livewire\Project\Resource\Index as ResourceIndex;
2024-01-07 15:23:41 +00:00
use App\Livewire\Project\Service\Configuration as ServiceConfiguration;
use App\Livewire\Project\Service\Index as ServiceIndex;
2023-12-07 18:06:32 +00:00
use App\Livewire\Project\Shared\ExecuteContainerCommand;
use App\Livewire\Project\Shared\Logs;
use App\Livewire\Project\Shared\ScheduledTask\Show as ScheduledTaskShow;
2024-06-10 20:43:34 +00:00
use App\Livewire\Project\Show as ProjectShow;
2023-12-07 18:06:32 +00:00
use App\Livewire\Security\ApiTokens;
2024-01-07 15:23:41 +00:00
use App\Livewire\Security\PrivateKey\Show as SecurityPrivateKeyShow;
2023-12-07 18:06:32 +00:00
use App\Livewire\Server\Destination\Show as DestinationShow;
2024-06-10 20:43:34 +00:00
use App\Livewire\Server\Index as ServerIndex;
2023-12-07 18:06:32 +00:00
use App\Livewire\Server\LogDrains;
use App\Livewire\Server\PrivateKey\Show as PrivateKeyShow;
use App\Livewire\Server\Proxy\DynamicConfigurations as ProxyDynamicConfigurations;
2023-12-07 18:06:32 +00:00
use App\Livewire\Server\Proxy\Logs as ProxyLogs;
2024-06-10 20:43:34 +00:00
use App\Livewire\Server\Proxy\Show as ProxyShow;
use App\Livewire\Server\Resources as ResourcesShow;
use App\Livewire\Server\Show as ServerShow;
use App\Livewire\Settings\Index as SettingsIndex;
use App\Livewire\Settings\License as SettingsLicense;
use App\Livewire\SharedVariables\Environment\Index as EnvironmentSharedVariablesIndex;
use App\Livewire\SharedVariables\Environment\Show as EnvironmentSharedVariablesShow;
use App\Livewire\SharedVariables\Index as SharedVariablesIndex;
use App\Livewire\SharedVariables\Project\Index as ProjectSharedVariablesIndex;
use App\Livewire\SharedVariables\Project\Show as ProjectSharedVariablesShow;
use App\Livewire\SharedVariables\Team\Index as TeamSharedVariablesIndex;
2023-12-07 18:06:32 +00:00
use App\Livewire\Source\Github\Change as GitHubChange;
2024-06-10 20:43:34 +00:00
use App\Livewire\Storage\Index as StorageIndex;
use App\Livewire\Storage\Show as StorageShow;
2024-01-07 15:23:41 +00:00
use App\Livewire\Subscription\Index as SubscriptionIndex;
use App\Livewire\Subscription\Show as SubscriptionShow;
2024-02-01 14:38:12 +00:00
use App\Livewire\Tags\Index as TagsIndex;
use App\Livewire\Tags\Show as TagsShow;
2024-05-21 12:29:06 +00:00
use App\Livewire\Team\AdminView as TeamAdminView;
2024-06-10 20:43:34 +00:00
use App\Livewire\Team\Index as TeamIndex;
use App\Livewire\Team\Member\Index as TeamMemberIndex;
2023-12-07 18:06:32 +00:00
use App\Livewire\Waitlist\Index as WaitlistIndex;
2024-06-10 20:43:34 +00:00
use App\Models\GitlabApp;
use App\Models\PrivateKey;
use App\Models\ScheduledDatabaseBackupExecution;
2024-06-10 20:43:34 +00:00
use App\Models\Server;
use App\Models\StandaloneDocker;
use App\Models\SwarmDocker;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\StreamedResponse;
2023-12-05 12:56:11 +00:00
2023-12-05 14:19:54 +00:00
if (isDev()) {
2023-10-04 12:40:33 +00:00
Route::get('/dev/compose', Compose::class)->name('dev.compose');
}
Route::get('/admin', AdminIndex::class)->name('admin.index');
2023-12-06 09:25:23 +00:00
Route::post('/forgot-password', [Controller::class, 'forgot_password'])->name('password.forgot');
2024-03-12 10:32:40 +00:00
Route::get('/realtime', [Controller::class, 'realtime_test'])->middleware('auth');
2023-09-01 07:34:25 +00:00
Route::get('/waitlist', WaitlistIndex::class)->name('waitlist.index');
2024-01-07 15:23:41 +00:00
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');
2023-09-11 14:51:38 +00:00
Route::middleware(['throttle:login'])->group(function () {
Route::get('/auth/link', [Controller::class, 'link'])->name('auth.link');
});
2024-01-07 15:23:41 +00:00
Route::get('/auth/{provider}/redirect', [OauthController::class, 'redirect'])->name('auth.redirect');
Route::get('/auth/{provider}/callback', [OauthController::class, 'callback'])->name('auth.callback');
2023-06-06 09:35:50 +00:00
Route::prefix('magic')->middleware(['auth'])->group(function () {
2023-06-07 13:08:35 +00:00
Route::get('/servers', [MagicController::class, 'servers']);
Route::get('/destinations', [MagicController::class, 'destinations']);
Route::get('/projects', [MagicController::class, 'projects']);
Route::get('/environments', [MagicController::class, 'environments']);
2023-06-15 07:15:41 +00:00
Route::get('/project/new', [MagicController::class, 'newProject']);
Route::get('/environment/new', [MagicController::class, 'newEnvironment']);
2023-06-05 22:18:48 +00:00
});
2023-06-07 13:08:35 +00:00
2023-10-09 12:20:55 +00:00
Route::middleware(['auth', 'verified'])->group(function () {
2024-01-07 15:23:41 +00:00
Route::middleware(['throttle:force-password-reset'])->group(function () {
Route::get('/force-password-reset', ForcePasswordReset::class)->name('auth.force-password-reset');
});
2023-08-29 12:36:17 +00:00
Route::get('/', Dashboard::class)->name('dashboard');
2024-03-13 11:11:37 +00:00
Route::get('/onboarding', BoardingIndex::class)->name('onboarding');
2023-08-09 14:47:24 +00:00
Route::get('/subscription', SubscriptionShow::class)->name('subscription.show');
2024-02-23 11:59:14 +00:00
Route::get('/subscription/new', SubscriptionIndex::class)->name('subscription.index');
2024-01-07 15:23:41 +00:00
Route::get('/settings', SettingsIndex::class)->name('settings.index');
Route::get('/settings/license', SettingsLicense::class)->name('settings.license');
2023-10-02 11:38:16 +00:00
2024-01-07 15:23:41 +00:00
Route::get('/profile', ProfileIndex::class)->name('profile');
2024-02-01 14:38:12 +00:00
Route::prefix('tags')->group(function () {
Route::get('/', TagsIndex::class)->name('tags.index');
Route::get('/{tag_name}', TagsShow::class)->name('tags.show');
});
Route::prefix('notifications')->group(function () {
Route::get('/email', NotificationEmail::class)->name('notifications.email');
Route::get('/telegram', NotificationTelegram::class)->name('notifications.telegram');
Route::get('/discord', NotificationDiscord::class)->name('notifications.discord');
});
Route::prefix('storages')->group(function () {
Route::get('/', StorageIndex::class)->name('storage.index');
Route::get('/{storage_uuid}', StorageShow::class)->name('storage.show');
});
Route::prefix('shared-variables')->group(function () {
Route::get('/', SharedVariablesIndex::class)->name('shared-variables.index');
Route::get('/team', TeamSharedVariablesIndex::class)->name('shared-variables.team.index');
Route::get('/projects', ProjectSharedVariablesIndex::class)->name('shared-variables.project.index');
Route::get('/project/{project_uuid}', ProjectSharedVariablesShow::class)->name('shared-variables.project.show');
Route::get('/environments', EnvironmentSharedVariablesIndex::class)->name('shared-variables.environment.index');
Route::get('/environment/{project_uuid}/{environment_name}', EnvironmentSharedVariablesShow::class)->name('shared-variables.environment.show');
});
2024-01-07 15:23:41 +00:00
Route::prefix('team')->group(function () {
Route::get('/', TeamIndex::class)->name('team.index');
Route::get('/members', TeamMemberIndex::class)->name('team.member.index');
2024-05-21 12:29:06 +00:00
Route::get('/admin', TeamAdminView::class)->name('team.admin-view');
2023-08-15 12:27:45 +00:00
});
2023-09-20 13:42:41 +00:00
2024-01-07 15:23:41 +00:00
Route::get('/command-center', CommandCenterIndex::class)->name('command-center');
2024-01-07 15:23:41 +00:00
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');
});
2023-04-25 07:38:05 +00:00
2024-01-07 15:23:41 +00:00
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::get('/tasks/{task_uuid}', ScheduledTaskShow::class)->name('project.application.scheduled-tasks');
2024-01-07 15:23:41 +00:00
});
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('/{stack_service_uuid}', ServiceIndex::class)->name('project.service.index');
2024-01-07 15:23:41 +00:00
Route::get('/command', ExecuteContainerCommand::class)->name('project.service.command');
Route::get('/tasks/{task_uuid}', ScheduledTaskShow::class)->name('project.service.scheduled-tasks');
2024-01-07 15:23:41 +00:00
});
2023-04-25 07:38:05 +00:00
2024-01-07 15:23:41 +00:00
Route::get('/servers', ServerIndex::class)->name('server.index');
2024-03-21 13:30:35 +00:00
// Route::get('/server/new', ServerCreate::class)->name('server.create');
2023-04-25 07:38:05 +00:00
2024-01-07 15:23:41 +00:00
Route::prefix('server/{server_uuid}')->group(function () {
Route::get('/', ServerShow::class)->name('server.show');
Route::get('/resources', ResourcesShow::class)->name('server.resources');
2024-01-07 15:23:41 +00:00
Route::get('/proxy', ProxyShow::class)->name('server.proxy');
Route::get('/proxy/dynamic', ProxyDynamicConfigurations::class)->name('server.proxy.dynamic-confs');
2024-01-07 15:23:41 +00:00
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');
2023-08-15 12:27:45 +00:00
});
2023-04-25 07:38:05 +00:00
2024-01-07 15:23:41 +00:00
// Route::get('/security', fn () => view('security.index'))->name('security.index');
2023-09-04 07:44:44 +00:00
Route::get('/security/private-key', fn () => view('security.private-key.index', [
2024-06-10 20:43:34 +00:00
'privateKeys' => PrivateKey::ownedByCurrentTeam(['name', 'uuid', 'is_git_related', 'description'])->get(),
2023-09-04 07:44:44 +00:00
]))->name('security.private-key.index');
2024-03-21 13:30:35 +00:00
// Route::get('/security/private-key/new', SecurityPrivateKeyCreate::class)->name('security.private-key.create');
2024-01-07 15:23:41 +00:00
Route::get('/security/private-key/{private_key_uuid}', SecurityPrivateKeyShow::class)->name('security.private-key.show');
2023-10-20 12:51:01 +00:00
Route::get('/security/api-tokens', ApiTokens::class)->name('security.api-tokens');
2023-05-03 10:38:57 +00:00
});
2023-06-07 13:08:35 +00:00
2023-05-08 11:36:49 +00:00
Route::middleware(['auth'])->group(function () {
2023-06-12 20:02:10 +00:00
Route::get('/sources', function () {
2023-08-22 15:44:49 +00:00
$sources = currentTeam()->sources();
2024-06-10 20:43:34 +00:00
2023-06-12 20:02:10 +00:00
return view('source.all', [
'sources' => $sources,
]);
})->name('source.all');
2023-11-07 08:44:47 +00:00
Route::get('/source/github/{github_app_uuid}', GitHubChange::class)->name('source.github.show');
2023-06-12 20:02:10 +00:00
Route::get('/source/gitlab/{gitlab_app_uuid}', function (Request $request) {
$gitlab_app = GitlabApp::where('uuid', request()->gitlab_app_uuid)->first();
2024-06-10 20:43:34 +00:00
2023-06-12 20:02:10 +00:00
return view('source.gitlab.show', [
'gitlab_app' => $gitlab_app,
]);
})->name('source.gitlab.show');
2023-05-08 11:36:49 +00:00
});
2023-04-25 08:47:13 +00:00
2023-05-02 10:47:52 +00:00
Route::middleware(['auth'])->group(function () {
2024-04-11 10:13:11 +00:00
Route::post('/upload/backup/{databaseUuid}', [UploadController::class, 'upload'])->name('upload.backup');
Route::get('/download/backup/{executionId}', function () {
try {
$team = auth()->user()->currentTeam();
2024-04-29 09:31:50 +00:00
if (is_null($team)) {
return response()->json(['message' => 'Team not found.'], 404);
}
$exeuctionId = request()->route('executionId');
$execution = ScheduledDatabaseBackupExecution::where('id', $exeuctionId)->firstOrFail();
2024-04-29 09:31:50 +00:00
$execution_team_id = $execution->scheduledDatabaseBackup->database->team()?->id;
if ($team->id !== 0) {
if (is_null($execution_team_id)) {
return response()->json(['message' => 'Team not found.'], 404);
}
if ($team->id !== $execution_team_id) {
return response()->json(['message' => 'Permission denied.'], 403);
}
if (is_null($execution)) {
return response()->json(['message' => 'Backup not found.'], 404);
}
}
$filename = data_get($execution, 'filename');
if ($execution->scheduledDatabaseBackup->database->getMorphClass() === 'App\Models\ServiceDatabase') {
$server = $execution->scheduledDatabaseBackup->database->service->destination->server;
} else {
$server = $execution->scheduledDatabaseBackup->database->destination->server;
}
$privateKeyLocation = savePrivateKeyToFs($server);
$disk = Storage::build([
'driver' => 'sftp',
'host' => $server->ip,
'port' => $server->port,
'username' => $server->user,
'privateKey' => $privateKeyLocation,
]);
2024-06-10 20:43:34 +00:00
return new StreamedResponse(function () use ($disk, $filename) {
2024-06-10 20:43:34 +00:00
if (ob_get_level()) {
ob_end_clean();
}
$stream = $disk->readStream($filename);
if ($stream === false) {
abort(500, 'Failed to open stream for the requested file.');
}
2024-06-10 20:43:34 +00:00
while (! feof($stream)) {
echo fread($stream, 2048);
flush();
}
fclose($stream);
2024-06-10 20:43:34 +00:00
}, 200, [
'Content-Type' => 'application/octet-stream',
2024-06-10 20:43:34 +00:00
'Content-Disposition' => 'attachment; filename="'.basename($filename).'"',
]);
} catch (\Throwable $e) {
return response()->json(['message' => $e->getMessage()], 500);
}
})->name('download.backup');
2023-06-13 08:02:58 +00:00
Route::get('/destinations', function () {
2024-03-22 10:34:15 +00:00
$servers = Server::isUsable()->get();
2023-06-13 08:02:58 +00:00
$destinations = collect([]);
foreach ($servers as $server) {
$destinations = $destinations->merge($server->destinations());
}
2023-05-12 11:10:09 +00:00
$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;
}
}
2024-06-10 20:43:34 +00:00
2024-03-22 10:34:15 +00:00
return view('destination.all', [
'destinations' => $destinations,
2024-06-10 20:43:34 +00:00
'servers' => $servers,
'server_id' => $server_id ?? null,
2023-05-03 09:16:08 +00:00
]);
2024-03-22 10:34:15 +00:00
})->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');
2023-05-02 10:47:52 +00:00
Route::get('/destination/{destination_uuid}', function () {
$standalone_dockers = StandaloneDocker::where('uuid', request()->destination_uuid)->first();
$swarm_dockers = SwarmDocker::where('uuid', request()->destination_uuid)->first();
2024-06-10 20:43:34 +00:00
if (! $standalone_dockers && ! $swarm_dockers) {
2023-05-02 10:47:52 +00:00
abort(404);
}
$destination = $standalone_dockers ? $standalone_dockers : $swarm_dockers;
2024-06-10 20:43:34 +00:00
2023-05-02 10:47:52 +00:00
return view('destination.show', [
2023-05-04 09:14:37 +00:00
'destination' => $destination->load(['server']),
2023-05-02 10:47:52 +00:00
]);
})->name('destination.show');
});
2023-12-13 14:29:45 +00:00
Route::any('/{any}', function () {
if (auth()->user()) {
2023-12-27 15:45:01 +00:00
return redirect(RouteServiceProvider::HOME);
2023-12-13 14:29:45 +00:00
}
2024-06-10 20:43:34 +00:00
2023-12-27 15:45:01 +00:00
return redirect()->route('login');
2023-12-13 14:29:45 +00:00
})->where('any', '.*');