Sprint SP-1 maakte 7 module-routes (docker/git/systemd/caddy/flows/ audit/settings) maar liet app/page.tsx de create-next-app starter houden. Tijdelijke kaartjes-grid die auth-check doet en doorlinkt naar elke module. IDEA-060 is gelogd voor een rijke dashboard met live status per module. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
43 lines
1.6 KiB
TypeScript
43 lines
1.6 KiB
TypeScript
import Link from 'next/link'
|
|
import { redirect } from 'next/navigation'
|
|
import { getCurrentUser } from '@/lib/session'
|
|
|
|
export const dynamic = 'force-dynamic'
|
|
|
|
const SECTIONS = [
|
|
{ href: '/docker', title: 'Docker', desc: 'Containers en status' },
|
|
{ href: '/git', title: 'Git', desc: 'Repo checkouts en diffs' },
|
|
{ href: '/systemd', title: 'systemd', desc: 'Services en journals' },
|
|
{ href: '/caddy', title: 'Caddy', desc: 'Config en certs' },
|
|
{ href: '/flows', title: 'Flows', desc: 'Multi-step deployments' },
|
|
{ href: '/audit', title: 'Audit', desc: 'Command-log en runs' },
|
|
{ href: '/settings', title: 'Settings', desc: 'Backups en config' },
|
|
]
|
|
|
|
export default async function Home() {
|
|
const user = await getCurrentUser()
|
|
if (!user) redirect('/login')
|
|
|
|
return (
|
|
<div className="min-h-screen bg-background p-6">
|
|
<div className="mx-auto max-w-6xl space-y-6">
|
|
<div>
|
|
<h1 className="text-2xl font-semibold tracking-tight">Ops Dashboard</h1>
|
|
<p className="text-sm text-muted-foreground">Welkom {user.email}</p>
|
|
</div>
|
|
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3">
|
|
{SECTIONS.map((s) => (
|
|
<Link
|
|
key={s.href}
|
|
href={s.href}
|
|
className="block rounded-lg border bg-card p-5 transition-colors hover:bg-accent"
|
|
>
|
|
<h2 className="text-lg font-medium">{s.title}</h2>
|
|
<p className="mt-1 text-sm text-muted-foreground">{s.desc}</p>
|
|
</Link>
|
|
))}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|