add dev response

This commit is contained in:
Nate Kelley 2025-10-02 15:14:07 -06:00
parent 7e4a2064e2
commit 292a68f0b6
No known key found for this signature in database
GPG Key ID: FD90372AB8D98B4F
1 changed files with 38 additions and 2 deletions

View File

@ -1,8 +1,12 @@
import { createServerFileRoute } from '@tanstack/react-start/server'; import { createServerFileRoute } from '@tanstack/react-start/server';
import { chromium } from 'playwright'; import { chromium } from 'playwright';
import { z } from 'zod'; 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'; import { Route as MetricContentRoute } from './_content/metrics.$metricId.content';
const isDev = import.meta.env.DEV;
export const GetMetricScreenshotParamsSchema = z.object({ export const GetMetricScreenshotParamsSchema = z.object({
metricId: z.string(), metricId: z.string(),
}); });
@ -16,20 +20,37 @@ export const GetMetricScreenshotQuerySchema = z.object({
export const ServerRoute = createServerFileRoute('/screenshots/metrics/$metricId/').methods({ export const ServerRoute = createServerFileRoute('/screenshots/metrics/$metricId/').methods({
GET: async ({ request, params }) => { 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'); console.time('capture screenshot');
const { metricId } = GetMetricScreenshotParamsSchema.parse(params); const { metricId } = GetMetricScreenshotParamsSchema.parse(params);
const { version_number, type, width, height } = GetMetricScreenshotQuerySchema.parse( const { version_number, type, width, height } = GetMetricScreenshotQuerySchema.parse(
Object.fromEntries(new URL(request.url).searchParams) Object.fromEntries(new URL(request.url).searchParams)
); );
const origin = new URL(request.url).origin; const origin = new URL(request.url).origin;
console.timeLog('capture screenshot', 'params parsed'); console.timeLog('capture screenshot', 'params parsed');
const browser = await chromium.launch(); const browser = await chromium.launch();
console.timeLog('capture screenshot', 'browser launched'); console.timeLog('capture screenshot', 'browser launched');
try { 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 }, 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}`; const fullPath = `${origin}${MetricContentRoute.fullPath}`;
await page.goto(fullPath, { waitUntil: 'networkidle' }); await page.goto(fullPath, { waitUntil: 'networkidle' });
@ -39,6 +60,21 @@ export const ServerRoute = createServerFileRoute('/screenshots/metrics/$metricId
}); });
console.timeLog('capture screenshot', 'screenshot taken'); console.timeLog('capture screenshot', 'screenshot taken');
console.timeEnd('capture screenshot'); 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), { return new Response(new Uint8Array(screenshotBuffer), {
headers: { headers: {
'Content-Type': 'image/png', 'Content-Type': 'image/png',