api / src /index.ts
RohanVashisht's picture
ok
1fca37b
raw
history blame
3.35 kB
import { serve } from "bun";
import packages from "../database/database/packages.json";
import programs from "../database/database/programs.json";
serve({
port: 7860,
fetch(req) {
const url = new URL(req.url);
const pathname = url.pathname;
const q = url.searchParams.get("q")?.trim().toLowerCase();
const filter = url.searchParams.get("filter")?.trim().toLowerCase();
const corsHeaders = {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
};
// CORS preflight handling
if (req.method === "OPTIONS") {
return new Response(null, {
status: 204,
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
},
});
}
if (pathname === "/api/searchPackages") {
const results = packages.filter(
({ name, full_name, description, topics }) => {
if (
filter &&
!topics?.some((t: string) => t.toLowerCase() === filter)
)
return false;
if (!q) return true;
return [name, full_name, description, ...(topics || [])].some(
(field: string) => field?.toLowerCase().includes(q),
);
},
);
return new Response(JSON.stringify(results.slice(0, 25)), {
status: 200,
headers: corsHeaders,
});
}
if (pathname === "/api/searchPrograms") {
const results = programs.filter(({ full_name, description, topics }) => {
if (filter && !topics?.some((t: string) => t.toLowerCase() === filter))
return false;
if (!q) return true;
return [full_name, description, ...(topics || [])].some(
(field: string) => field?.toLowerCase().includes(q),
);
});
return new Response(JSON.stringify(results.slice(0, 25)), {
status: 200,
headers: corsHeaders,
});
}
if (pathname === "/api/infiniteScrollPackages") {
const pageNumberParam = url.searchParams.get("pageNumber");
const pageNumber = parseInt(pageNumberParam || "0", 10);
if (isNaN(pageNumber) || pageNumber < 0) {
return new Response(JSON.stringify({ error: "Invalid page number" }), {
status: 400,
headers: corsHeaders,
});
}
const lowerLimit = pageNumber * 10;
const scrollResults = packages.slice(lowerLimit, lowerLimit + 10);
return new Response(JSON.stringify(scrollResults), {
status: 200,
headers: corsHeaders,
});
}
if (pathname === "/api/infiniteScrollPrograms") {
const pageNumberParam = url.searchParams.get("pageNumber");
const pageNumber = parseInt(pageNumberParam || "0", 10);
if (isNaN(pageNumber) || pageNumber < 0) {
return new Response(JSON.stringify({ error: "Invalid page number" }), {
status: 400,
headers: corsHeaders,
});
}
const lowerLimit = pageNumber * 10;
const scrollResults = programs.slice(lowerLimit, lowerLimit + 10);
return new Response(JSON.stringify(scrollResults), {
status: 200,
headers: corsHeaders,
});
}
return new Response("Not Found", {
status: 404,
headers: { "Access-Control-Allow-Origin": "*" },
});
},
});