Implement public audit pages

This commit is contained in:
Matthias
2026-06-05 14:14:07 +02:00
parent 03cb65fde4
commit 47ee2c2d51
25 changed files with 1039 additions and 45 deletions

View File

@@ -1,27 +1,66 @@
import { FileText } from "lucide-react";
import type { Metadata } from "next";
import { Suspense } from "react";
import { cacheLife, cacheTag } from "next/cache";
import { fetchQuery } from "convex/nextjs";
export default async function PublicAuditPage({
params,
}: {
import { PublicAuditPage } from "@/components/public-audit/public-audit-page";
import { PublicAuditStatus } from "@/components/public-audit/public-audit-status";
import { api } from "@/convex/_generated/api";
import { publicAuditCacheTag } from "@/lib/audits/public-audit-cache";
import { toPublicAuditRenderState } from "@/lib/audits/public-audit-presenter";
import type { PublicAuditLookupResult } from "@/lib/audits/public-audit-types";
import { parsePublicAuditSlug } from "@/lib/audits/slugs";
export const metadata: Metadata = {
title: "Website-Audit",
robots: {
index: false,
follow: false,
googleBot: {
index: false,
follow: false,
},
},
};
type PublicAuditRouteProps = {
params: Promise<{ slug: string }>;
}) {
const { slug } = await params;
};
async function getCachedPublicAudit(slug: string): Promise<PublicAuditLookupResult> {
"use cache";
const normalizedSlug = parsePublicAuditSlug(slug);
if (!normalizedSlug) {
return null;
}
cacheTag(publicAuditCacheTag(normalizedSlug));
cacheLife("days");
return await fetchQuery(api.audits.getPublicBySlug, { slug: normalizedSlug });
}
async function PublicAuditContent({ params }: PublicAuditRouteProps) {
const { slug } = await params;
const result = await getCachedPublicAudit(slug);
const renderState = toPublicAuditRenderState(result);
if (renderState.kind === "pending") {
return <PublicAuditStatus status="pending" />;
}
if (renderState.kind === "unavailable") {
return <PublicAuditStatus status="unavailable" />;
}
return <PublicAuditPage audit={renderState.audit} />;
}
export default function PublicAuditRoute({ params }: PublicAuditRouteProps) {
return (
<main className="flex min-h-dvh items-center justify-center bg-background px-6 py-12">
<section className="w-full max-w-2xl rounded-lg border bg-card p-6 text-card-foreground">
<FileText className="mb-5 size-6 text-muted-foreground" />
<p className="text-sm font-medium text-muted-foreground">
Audit: {slug}
</p>
<h1 className="mt-3 text-3xl font-semibold tracking-normal">
Dieser Audit ist noch nicht freigegeben
</h1>
<p className="mt-4 text-sm leading-6 text-muted-foreground">
Sobald der Bericht manuell geprueft und veroeffentlicht wurde,
erscheinen hier die freigegebenen Beobachtungen und Empfehlungen.
</p>
</section>
</main>
<Suspense fallback={<PublicAuditStatus status="pending" />}>
<PublicAuditContent params={params} />
</Suspense>
);
}