MoviesBay / functions / api.js
api.js
Raw
export async function onRequest(context){const{request:request,env:env,waitUntil:waitUntil}=context,url=new URL(request.url),q=url.searchParams.get("q"),update="true"===url.searchParams.get("update"),cacheKey=context.env.CACHE_KEY_2,cache=caches.default;let data;try{if(!update){const cachedResponse=await cache.match(cacheKey);cachedResponse&&(data=await cachedResponse.json())}if(!data){const apiResponse=await fetch(env.SHEETS_API_URL);if(!apiResponse.ok)throw new Error("Fetch failed");data=await apiResponse.json();const cacheRes=new Response(JSON.stringify(data),{headers:{"Content-Type":"application/json"}});waitUntil(cache.put(cacheKey,cacheRes.clone()))}}catch(err){return new Response(JSON.stringify({error:"Internal Server Error"}),{status:500,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}})}if(q){const matched=data.filter((entry=>entry.html_name===q));return new Response(JSON.stringify(matched),{status:matched.length>0?200:404,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}})}const shortFields=["html_name","content_type","title","plot","poster","genre","carousel_value","quality"],shortData=data.map((entry=>{const filtered={};return shortFields.forEach((field=>{void 0!==entry[field]&&(filtered[field]=entry[field])})),filtered}));return new Response(JSON.stringify(shortData),{headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}})}