feat(reports): generate personal reports by section
Independent Staging Quality Gate / validate (push) Has been cancelled
Independent Staging Quality Gate / publish (push) Has been cancelled

This commit is contained in:
Jesse_Chen
2026-08-30 22:59:17 +08:00
parent 1d1c1d3d24
commit 0ae3e2d796
17 changed files with 1173 additions and 111 deletions
@@ -10,6 +10,7 @@ import {
createSupabasePersonalReportService,
type PersonalReportService,
} from "@/lib/personal-report-service";
import { createSupabasePersonalReportJobService } from "@/lib/personal-report-job-service";
import { isSupabaseConfigurationError } from "@/lib/supabase/config";
import { createServerSupabaseClient } from "@/lib/supabase/server";
@@ -37,15 +38,15 @@ async function resolvePersistenceForUser() {
const supabase = await createServerSupabaseClient();
const { data: { user }, error: authError } = await supabase.auth.getUser();
if (authError || !user) {
return { userId: null as string | null, persistence: null as PersonalReportService | null };
return { userId: null as string | null, persistence: null as PersonalReportService | null, jobs: null };
}
const persistence = createSupabasePersonalReportService(supabase);
return { userId: user.id, persistence };
return { userId: user.id, persistence, jobs: createSupabasePersonalReportJobService(supabase) };
}
export async function GET(request: Request, context: RouteContext) {
try {
const { userId, persistence } = await resolvePersistenceForUser();
const { userId, persistence, jobs } = await resolvePersistenceForUser();
const { reportId } = await context.params;
if (!uuidPattern.test(reportId)) {
return NextResponse.json(
@@ -69,6 +70,7 @@ export async function GET(request: Request, context: RouteContext) {
// canonical server parse (schema + guards + evidence hash recompute)
// before it is returned to the browser. Client-side validation is never
// a substitute.
jobs: jobs ?? undefined,
validateReadyDocument: (document) => {
const parsed = safeParseServerReportDocument(document);
return parsed.ok