This repository has been archived on 2025-03-28. You can view files and clone it, but cannot push or open issues or pull requests.
coryd.dev-eleventy/workers/search/index.js

75 lines
2.3 KiB
JavaScript

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("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,
});
}
},
};