diff --git a/app/Drivers/DatabaseDriver.php b/app/Drivers/DatabaseDriver.php index b1597b5..b04b0e0 100644 --- a/app/Drivers/DatabaseDriver.php +++ b/app/Drivers/DatabaseDriver.php @@ -15,4 +15,8 @@ abstract class DatabaseDriver extends Driver ?string $containerId = null, ?array $credentials = null, ); + + abstract public function createUser(string $user, string $password): string; + + // abstract public function createDatabase(string $db, string $user): string; } diff --git a/app/Drivers/Postgres/Postgres17Driver.php b/app/Drivers/Postgres/Postgres17Driver.php index bd206f7..200ad71 100644 --- a/app/Drivers/Postgres/Postgres17Driver.php +++ b/app/Drivers/Postgres/Postgres17Driver.php @@ -55,7 +55,7 @@ class Postgres17Driver extends DatabaseDriver } ), new Step( - name: 'Configure firewall', + name: 'Configure firewall', // @todo this should create a Firewallrule script: 'ufw allow 5432/tcp || true', ), ]); @@ -69,4 +69,9 @@ class Postgres17Driver extends DatabaseDriver 'db' => 'keystone', ]; } + + public function createUser(string $user, string $password): string + { + return "psql -U {$this->credentials['user']} -d {$this->credentials['db']} -c \"CREATE USER {$user} WITH PASSWORD '{$password}';\""; + } } diff --git a/app/Http/Controllers/EnvironmentController.php b/app/Http/Controllers/EnvironmentController.php index 070ed4b..1b943fd 100644 --- a/app/Http/Controllers/EnvironmentController.php +++ b/app/Http/Controllers/EnvironmentController.php @@ -16,7 +16,13 @@ class EnvironmentController extends Controller return inertia('environments/Show', [ 'environment' => $environment, 'servers' => inertia()->optional(function () use ($environment) { - return $environment->application?->organisation?->servers->where('status', ServerStatus::ACTIVE)?->values() ?? []; + return $environment + ->application + ?->organisation + ?->servers() + ->where('status', ServerStatus::ACTIVE) + ->with('services') + ->get() ?? []; }), ]); } diff --git a/resources/js/components/RadioButton.vue b/resources/js/components/RadioButton.vue index 1c16fab..3d9723d 100644 --- a/resources/js/components/RadioButton.vue +++ b/resources/js/components/RadioButton.vue @@ -15,7 +15,7 @@ function onChange(event) { -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; +import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Deferred, router } from '@inertiajs/vue3'; +import { LoaderCircleIcon } from 'lucide-vue-next'; import { ref, watch } from 'vue'; import { Card } from './ui/card'; -import { LoaderCircleIcon } from 'lucide-vue-next'; +import ServiceCategory from '@/enums/ServiceCategory'; const props = defineProps({ servers: { type: Array, required: false, }, + serviceCategory: { + type: String, + required: false, + validate: (value) => { + return Object.keys(ServiceCategory).includes(value); + } + } }); const isOpen = ref(false); +defineEmits(['select']); + watch(isOpen, () => { if (isOpen.value && props.servers === undefined) { router.reload({ @@ -36,28 +46,32 @@ watch(isOpen, () => { - + - {{ server.name }} - + {{ server.name }} + {{ !!server.services.filter((s) => s.category === serviceCategory).length ? 'Has Gateway' : 'No Gateway Installed' }} No servers available - Dismiss + diff --git a/resources/js/pages/environments/Show.vue b/resources/js/pages/environments/Show.vue index f29b36c..5fdaf0d 100644 --- a/resources/js/pages/environments/Show.vue +++ b/resources/js/pages/environments/Show.vue @@ -1,8 +1,9 @@ - @@ -35,6 +50,10 @@ defineProps({ }, { title: 'Environments', + href: route('applications.show', { + organisation: $page.props.organisation.id, + application: environment.application.id, + }), }, { title: environment.name, @@ -49,7 +68,7 @@ defineProps({ - + diff --git a/resources/js/pages/servers/Show.vue b/resources/js/pages/servers/Show.vue index f82d048..af6e3bd 100644 --- a/resources/js/pages/servers/Show.vue +++ b/resources/js/pages/servers/Show.vue @@ -8,7 +8,7 @@ import { useCycleList, useInterval } from '@vueuse/core'; import { DatabaseIcon, Layers2Icon, LoaderCircleIcon, PlusIcon } from 'lucide-vue-next'; import { watch } from 'vue'; -const props = defineProps({ +defineProps({ server: { type: Object, required: true,