diff --git a/apps/web/src/routes/screenshots/metrics.$metricId.index.tsx b/apps/web/src/routes/screenshots/metrics.$metricId.index.tsx index ba17137b0..ce9b35c2d 100644 --- a/apps/web/src/routes/screenshots/metrics.$metricId.index.tsx +++ b/apps/web/src/routes/screenshots/metrics.$metricId.index.tsx @@ -1,8 +1,12 @@ import { createServerFileRoute } from '@tanstack/react-start/server'; import { chromium } from 'playwright'; import { z } from 'zod'; +import { getMetric } from '@/api/buster_rest/metrics'; +import { getSupabaseServerClient } from '@/integrations/supabase/server'; import { Route as MetricContentRoute } from './_content/metrics.$metricId.content'; +const isDev = import.meta.env.DEV; + export const GetMetricScreenshotParamsSchema = z.object({ metricId: z.string(), }); @@ -16,20 +20,37 @@ export const GetMetricScreenshotQuerySchema = z.object({ export const ServerRoute = createServerFileRoute('/screenshots/metrics/$metricId/').methods({ GET: async ({ request, params }) => { + const bearerToken = request.headers.get('Authorization') || ''; + const accessToken = bearerToken.replace('Bearer ', ''); + const supabase = getSupabaseServerClient(); + const { + data: { user }, + } = await supabase.auth.getUser(accessToken); + + if (!user || user.is_anonymous) { + return new Response('Unauthorized', { status: 401 }); + } + console.time('capture screenshot'); const { metricId } = GetMetricScreenshotParamsSchema.parse(params); const { version_number, type, width, height } = GetMetricScreenshotQuerySchema.parse( Object.fromEntries(new URL(request.url).searchParams) ); const origin = new URL(request.url).origin; + console.timeLog('capture screenshot', 'params parsed'); const browser = await chromium.launch(); console.timeLog('capture screenshot', 'browser launched'); try { - const page = await browser.newPage({ + // Create a session object for Supabase + + // Create browser context with authentication cookies + const context = await browser.newContext({ viewport: { width, height }, }); - console.timeLog('capture screenshot', 'page created'); + + const page = await context.newPage(); + console.timeLog('capture screenshot', 'page created with auth cookie'); const fullPath = `${origin}${MetricContentRoute.fullPath}`; await page.goto(fullPath, { waitUntil: 'networkidle' }); @@ -39,6 +60,21 @@ export const ServerRoute = createServerFileRoute('/screenshots/metrics/$metricId }); console.timeLog('capture screenshot', 'screenshot taken'); console.timeEnd('capture screenshot'); + + if (!isDev) { + return new Response( + JSON.stringify({ + success: true, + }), + { + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + } + ); + } + return new Response(new Uint8Array(screenshotBuffer), { headers: { 'Content-Type': 'image/png',