import { createClient } from "@supabase/supabase-js"; export default { async fetch(request, env) { const allowedOrigin = "https://coryd.dev"; const origin = request.headers.get("Origin") || ""; const referer = request.headers.get("Referer") || ""; if (!origin.startsWith(allowedOrigin) && !referer.startsWith(allowedOrigin)) return new Response("Forbidden", { status: 403 }); const supabase = createClient(env.SUPABASE_URL, env.SUPABASE_KEY); const { searchParams } = new URL(request.url); const query = searchParams.get("q") || ""; const types = searchParams.get("type")?.split(",") || []; const page = parseInt(searchParams.get("page") || "1", 10); const pageSize = parseInt(searchParams.get("pageSize") || "10", 10); const offset = (page - 1) * pageSize; try { let supabaseQuery = supabase .from("optimized_search_index") .select( "id, title, description, url, tags, type, total_plays, genre_name, genre_url", { count: "exact" } ) .range(offset, offset + pageSize - 1); if (types.length > 0) supabaseQuery = supabaseQuery.in("type", types); if (query) { const queryLower = `%${query.toLowerCase()}%`; supabaseQuery = supabaseQuery.or( `title.ilike.${queryLower},description.ilike.${queryLower}` ); } const { data, error, count } = await supabaseQuery; if (error) { console.error("Supabase query error:", error); return new Response(JSON.stringify({ error: "Error fetching data" }), { status: 500, }); } if (!data || data.length === 0) { console.warn("No results found."); return new Response( JSON.stringify({ results: [], total: 0, page, pageSize }), { headers: { "Content-Type": "application/json" } } ); } return new Response( JSON.stringify({ results: data, total: count || 0, page, pageSize, }), { headers: { "Content-Type": "application/json", }, } ); } catch (error) { console.error("Unexpected error:", error); return new Response(JSON.stringify({ error: "Internal Server Error" }), { status: 500, }); } }, };