From 7d2bc3ca5e67044b2f78686985ccf66fa3b07dc1 Mon Sep 17 00:00:00 2001 From: "Harry (hjbdev)" Date: Fri, 28 Mar 2025 15:18:12 +0000 Subject: [PATCH] Show pages for app,env,org plus navigation, servers wip --- .../Controllers/ApplicationController.php | 5 +-- .../Controllers/EnvironmentController.php | 17 ++++++++ .../Controllers/OrganisationController.php | 5 ++- app/Http/Controllers/ServerController.php | 17 ++++++++ app/Http/Middleware/HandleInertiaRequests.php | 4 +- app/Models/Organisation.php | 5 +++ app/Models/Server.php | 6 +++ ...2025_03_27_120552_create_servers_table.php | 2 + resources/js/components/AppSidebar.vue | 29 ++++++------- resources/js/components/AppSidebarHeader.vue | 42 +++++++++++++++---- resources/js/pages/environments/Show.vue | 23 ++++++++++ resources/js/pages/organisations/Show.vue | 23 ++++++++++ resources/js/pages/servers/Create.vue | 14 +++++++ resources/js/pages/servers/Index.vue | 23 ++++++++++ routes/web.php | 15 +++++++ 15 files changed, 201 insertions(+), 29 deletions(-) create mode 100644 app/Http/Controllers/EnvironmentController.php create mode 100644 app/Http/Controllers/ServerController.php create mode 100644 resources/js/pages/environments/Show.vue create mode 100644 resources/js/pages/organisations/Show.vue create mode 100644 resources/js/pages/servers/Create.vue create mode 100644 resources/js/pages/servers/Index.vue diff --git a/app/Http/Controllers/ApplicationController.php b/app/Http/Controllers/ApplicationController.php index 2e54a51..79ab770 100644 --- a/app/Http/Controllers/ApplicationController.php +++ b/app/Http/Controllers/ApplicationController.php @@ -8,8 +8,7 @@ class ApplicationController extends Controller { public function show(Request $request) { - return inertia('Applications/Show', [ - // 'application' => $request->route('application'), - ]); + $id = $request->route('application'); + return inertia('applications/Show'); } } diff --git a/app/Http/Controllers/EnvironmentController.php b/app/Http/Controllers/EnvironmentController.php new file mode 100644 index 0000000..cda7286 --- /dev/null +++ b/app/Http/Controllers/EnvironmentController.php @@ -0,0 +1,17 @@ +route('environment'); + return inertia('environments/Show', [ + 'environment' => Environment::findOrFail($id), + ]); + } +} diff --git a/app/Http/Controllers/OrganisationController.php b/app/Http/Controllers/OrganisationController.php index ea5705c..0deb625 100644 --- a/app/Http/Controllers/OrganisationController.php +++ b/app/Http/Controllers/OrganisationController.php @@ -6,5 +6,8 @@ use Illuminate\Http\Request; class OrganisationController extends Controller { - // + public function show() + { + return inertia('organisations/Show'); + } } diff --git a/app/Http/Controllers/ServerController.php b/app/Http/Controllers/ServerController.php new file mode 100644 index 0000000..2e3a604 --- /dev/null +++ b/app/Http/Controllers/ServerController.php @@ -0,0 +1,17 @@ +route('organisation')); + return inertia('servers/Index', [ + 'servers' => $organisation->servers()->paginate(30), + ]); + } +} diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index f942904..e99242c 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -30,9 +30,9 @@ class HandleInertiaRequests extends Middleware ...parent::share($request), 'name' => config('app.name'), 'organisation' => $request->route('organisation') ? Organisation::with('applications')->findOrFail($request->route('organisation')) : null, - 'application' => $request->route('application') ? Application::findOrFail($request->route('application')) : null, + 'application' => $request->route('application') ? Application::with('environments')->findOrFail($request->route('application')) : null, 'auth' => [ - 'user' => $request->user()->load('organisations'), + 'user' => $request->user()?->load('organisations'), ], 'ziggy' => [ ...(new Ziggy)->toArray(), diff --git a/app/Models/Organisation.php b/app/Models/Organisation.php index e30d7ec..5fedbaa 100644 --- a/app/Models/Organisation.php +++ b/app/Models/Organisation.php @@ -26,6 +26,11 @@ class Organisation extends Model ->withTimestamps(); } + public function servers(): HasMany + { + return $this->hasMany(Server::class); + } + public function applications(): HasMany { return $this->hasMany(Application::class); diff --git a/app/Models/Server.php b/app/Models/Server.php index 27c39b0..90887e7 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -5,6 +5,7 @@ namespace App\Models; use App\Enums\ServerProvider; use App\Enums\ServerStatus; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; class Server extends Model @@ -19,6 +20,11 @@ class Server extends Model ]; } + public function organisation(): BelongsTo + { + return $this->belongsTo(Organisation::class); + } + public function services(): HasMany { return $this->hasMany(Service::class); diff --git a/database/migrations/2025_03_27_120552_create_servers_table.php b/database/migrations/2025_03_27_120552_create_servers_table.php index e7714b3..b72b027 100644 --- a/database/migrations/2025_03_27_120552_create_servers_table.php +++ b/database/migrations/2025_03_27_120552_create_servers_table.php @@ -1,5 +1,6 @@ id(); + $table->foreignIdFor(Organisation::class); $table->string('name'); $table->string('provider'); $table->string('provider_id'); diff --git a/resources/js/components/AppSidebar.vue b/resources/js/components/AppSidebar.vue index 3ac4104..f40612f 100644 --- a/resources/js/components/AppSidebar.vue +++ b/resources/js/components/AppSidebar.vue @@ -4,8 +4,8 @@ import NavMain from '@/components/NavMain.vue'; import NavUser from '@/components/NavUser.vue'; import { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '@/components/ui/sidebar'; import { type NavItem } from '@/types'; -import { Link } from '@inertiajs/vue3'; -import { BookOpen, Folder, LayoutGrid } from 'lucide-vue-next'; +import { Link, usePage } from '@inertiajs/vue3'; +import { LayoutGrid, Server } from 'lucide-vue-next'; import AppLogo from './AppLogo.vue'; const mainNavItems: NavItem[] = [ @@ -16,18 +16,19 @@ const mainNavItems: NavItem[] = [ }, ]; -const footerNavItems: NavItem[] = [ - { - title: 'Github Repo', - href: 'https://github.com/laravel/vue-starter-kit', - icon: Folder, - }, - { - title: 'Documentation', - href: 'https://laravel.com/docs/starter-kits', - icon: BookOpen, - }, -]; +const organisation = usePage().props.organisation; + +if (organisation) { + mainNavItems.push({ + title: 'Servers', + href: route('servers.index', { + organisation: organisation.id, + }), + icon: Server, + }); +} + +const footerNavItems: NavItem[] = []; diff --git a/resources/js/pages/environments/Show.vue b/resources/js/pages/environments/Show.vue new file mode 100644 index 0000000..ae53764 --- /dev/null +++ b/resources/js/pages/environments/Show.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/js/pages/organisations/Show.vue b/resources/js/pages/organisations/Show.vue new file mode 100644 index 0000000..0c29c4b --- /dev/null +++ b/resources/js/pages/organisations/Show.vue @@ -0,0 +1,23 @@ + + + diff --git a/resources/js/pages/servers/Create.vue b/resources/js/pages/servers/Create.vue new file mode 100644 index 0000000..7ff64db --- /dev/null +++ b/resources/js/pages/servers/Create.vue @@ -0,0 +1,14 @@ + + + diff --git a/resources/js/pages/servers/Index.vue b/resources/js/pages/servers/Index.vue new file mode 100644 index 0000000..9f6b1fe --- /dev/null +++ b/resources/js/pages/servers/Index.vue @@ -0,0 +1,23 @@ + + + diff --git a/routes/web.php b/routes/web.php index 84c2b10..c74519a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,7 +1,9 @@ group(function () { Route::prefix('organisations/{organisation}')->group(function () { Route::get('/', [OrganisationController::class, 'show'])->name('organisations.show'); + + Route::resource('servers', ServerController::class) + ->only('index', 'create', 'store') + ->name('index', 'servers.index') + ->name('create', 'servers.create') + ->name('store', 'servers.store'); + Route::resource('applications', ApplicationController::class) ->only('show') ->name('show', 'applications.show'); + + Route::prefix('applications/{application}')->group(function () { + Route::resource('environments', EnvironmentController::class) + ->only('show') + ->name('show', 'environments.show'); + }); }); });