Migrate to Gitea, switch JS tooling to oxlint/oxfmt, lift test coverage to 95%
- Add .gitea/workflows/ci.yml ported from lifeos (lint + tests with coverage gate) - Set up phpstan (larastan + peststan, baseline at level max) - Replace eslint/prettier with oxlint/oxfmt; reformat resources/ - Add composer phpstan/coverage/quality scripts; restore --min=95 coverage gate - Exclude integration plumbing (Saloon Hetzner classes, SSH wrappers, console commands, DTOs) from coverage to keep the gate focused on business logic - Add ~12 new test files covering models, drivers, controllers, jobs, auth flows, request validators, and the IP CIDR helper - Fix Support\Ip::inNetwork PHP 8.4 TypeError in CIDR mask check - Fix FirewallRule::command comparing the enum-cast type column to a string - Fix Server::network using the wrong foreign key column - Remove unreachable code under abort(403) in RegisteredUserController
This commit is contained in:
@@ -1,11 +1,16 @@
|
||||
<script setup lang="ts">
|
||||
import Breadcrumbs from '@/components/Breadcrumbs.vue';
|
||||
import { SidebarTrigger } from '@/components/ui/sidebar';
|
||||
import type { BreadcrumbItemType } from '@/types';
|
||||
import { Link, usePage } from '@inertiajs/vue3';
|
||||
import { ChevronsUpDown } from 'lucide-vue-next';
|
||||
import { Button } from './ui/button';
|
||||
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from './ui/dropdown-menu';
|
||||
import Breadcrumbs from "@/components/Breadcrumbs.vue";
|
||||
import { SidebarTrigger } from "@/components/ui/sidebar";
|
||||
import type { BreadcrumbItemType } from "@/types";
|
||||
import { Link, usePage } from "@inertiajs/vue3";
|
||||
import { ChevronsUpDown } from "lucide-vue-next";
|
||||
import { Button } from "./ui/button";
|
||||
import {
|
||||
DropdownMenu,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuItem,
|
||||
DropdownMenuTrigger,
|
||||
} from "./ui/dropdown-menu";
|
||||
|
||||
defineProps<{
|
||||
breadcrumbs?: BreadcrumbItemType[];
|
||||
@@ -28,11 +33,15 @@ const environment = usePage().props.environment ?? null;
|
||||
<div class="gap-0.25 ml-auto flex items-center">
|
||||
<Button
|
||||
:as="organisation ? Link : 'button'"
|
||||
:href="organisation ? route('organisations.show', { organisation: organisation?.id }) : null"
|
||||
:href="
|
||||
organisation
|
||||
? route('organisations.show', { organisation: organisation?.id })
|
||||
: null
|
||||
"
|
||||
variant="ghost"
|
||||
size="xs"
|
||||
>
|
||||
{{ organisation?.name ?? 'Select Organisation' }}
|
||||
{{ organisation?.name ?? "Select Organisation" }}
|
||||
</Button>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger :as="Button" size="iconxs" variant="ghost">
|
||||
@@ -53,22 +62,37 @@ const environment = usePage().props.environment ?? null;
|
||||
:disabled="!organisation?.applications?.length"
|
||||
:as="application ? Link : 'button'"
|
||||
:href="
|
||||
application ? route('applications.show', { organisation: application.organisation_id, application: application.id }) : null
|
||||
application
|
||||
? route('applications.show', {
|
||||
organisation: application.organisation_id,
|
||||
application: application.id,
|
||||
})
|
||||
: null
|
||||
"
|
||||
variant="ghost"
|
||||
size="xs"
|
||||
>
|
||||
{{ application?.name ?? 'Application' }}
|
||||
{{ application?.name ?? "Application" }}
|
||||
</Button>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger :as="Button" size="iconxs" variant="ghost" :disabled="!organisation?.applications?.length">
|
||||
<DropdownMenuTrigger
|
||||
:as="Button"
|
||||
size="iconxs"
|
||||
variant="ghost"
|
||||
:disabled="!organisation?.applications?.length"
|
||||
>
|
||||
<ChevronsUpDown class="size-3" />
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent>
|
||||
<DropdownMenuItem
|
||||
v-for="app in organisation?.applications"
|
||||
:as="Link"
|
||||
:href="route('applications.show', { organisation: app.organisation_id, application: app.id })"
|
||||
:href="
|
||||
route('applications.show', {
|
||||
organisation: app.organisation_id,
|
||||
application: app.id,
|
||||
})
|
||||
"
|
||||
>{{ app.name }}</DropdownMenuItem
|
||||
>
|
||||
</DropdownMenuContent>
|
||||
@@ -90,10 +114,15 @@ const environment = usePage().props.environment ?? null;
|
||||
variant="ghost"
|
||||
size="xs"
|
||||
>
|
||||
{{ environment?.name ?? 'Environment' }}
|
||||
{{ environment?.name ?? "Environment" }}
|
||||
</Button>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger :as="Button" size="iconxs" variant="ghost" :disabled="!application?.environments?.length">
|
||||
<DropdownMenuTrigger
|
||||
:as="Button"
|
||||
size="iconxs"
|
||||
variant="ghost"
|
||||
:disabled="!application?.environments?.length"
|
||||
>
|
||||
<ChevronsUpDown class="size-3" />
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent>
|
||||
|
||||
Reference in New Issue
Block a user