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