api / src /index.ts
RohanVashisht's picture
Upload 11 files
7a5aa35 verified
raw
history blame
3.83 kB
import { serve } from "bun";
import packages from "../database/packages.json";
import programs from "../database/programs.json";
serve({
port: 3000,
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/searchProgams") {
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 section = url.searchParams.get("section");
const [ll, ul] = (url.searchParams.get("range") || "")
.split("..")
.map(Number);
if (!section || isNaN(ll) || isNaN(ul)) {
return new Response(JSON.stringify([]), {
status: 400,
headers: corsHeaders,
});
}
const getSortedResponse = (sortFn: Function) =>
new Response(JSON.stringify([...programs].sort(sortFn).slice(ll, ul)), {
status: 200,
headers: corsHeaders,
});
if (section === "mostUsed") {
return getSortedResponse(
(a: any, b: any) => b.stargazers_count - a.stargazers_count,
);
}
if (section === "latestRepos") {
return getSortedResponse(
(a: any, b: any) =>
new Date(b.created_at).getTime() - new Date(a.created_at).getTime(),
);
}
return new Response(JSON.stringify([]), {
status: 400,
headers: corsHeaders,
});
}
return new Response("Not Found", {
status: 404,
headers: { "Access-Control-Allow-Origin": "*" },
});
},
});