diff --git a/api/fetch-bsr.ts b/api/fetch-bsr.ts index 22ad347..5af8be4 100644 --- a/api/fetch-bsr.ts +++ b/api/fetch-bsr.ts @@ -1,27 +1,38 @@ -import { promises as fs } from 'fs'; -import path from 'path'; import type { VercelRequest, VercelResponse } from '@vercel/node'; -export default async function handler(req: VercelRequest, res: VercelResponse) { - try { - const filePath = path.join(process.cwd(), 'BSR.xlsx'); +const BSR_DROPBOX_URL = "https://www.dropbox.com/scl/fi/r32r9x6r7bvgg6ckiaowk/BSR.xlsx?rlkey=vka50xyhc637riq901qo5bk16&st=y6ys2oz8&dl=1"; - try { - await fs.access(filePath); - } catch { - return res.status(404).json({ error: 'BSR data file not found' }); +export default async function handler(req: VercelRequest, res: VercelResponse) { + // CORS headers + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + + if (req.method === 'OPTIONS') { + return res.status(200).end(); + } + + try { + console.log('[fetch-bsr] Fetching BSR.xlsx from Dropbox...'); + const response = await fetch(BSR_DROPBOX_URL, { + cache: 'no-store', + headers: { + 'Pragma': 'no-cache', + 'Cache-Control': 'no-cache' + } + }); + + if (!response.ok) { + throw new Error(`Dropbox responded with ${response.status}`); } - const fileBuffer = await fs.readFile(filePath); + const buffer = await response.arrayBuffer(); + console.log('[fetch-bsr] Successfully fetched BSR Excel, size:', buffer.byteLength); res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); - res.setHeader('Content-Disposition', 'attachment; filename="BSR.xlsx"'); - res.setHeader('Cache-Control', 'public, max-age=3600'); - - // Convert Buffer to ArrayBuffer before sending for fetch compatibility on client - res.send(fileBuffer); - } catch (error) { - console.error('Error serving BSR Excel file:', error); - res.status(500).json({ error: 'Failed to serve BSR file' }); + res.status(200).send(Buffer.from(buffer)); + } catch (error: any) { + console.error('[fetch-bsr] Error:', error); + res.status(500).json({ error: error.message }); } } diff --git a/vite.config.ts b/vite.config.ts index 2da9876..1c24da8 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -44,6 +44,12 @@ export default defineConfig(({ mode }) => { changeOrigin: true, rewrite: () => '', followRedirects: true + }, + '/api/fetch-bsr': { + target: 'https://www.dropbox.com/scl/fi/r32r9x6r7bvgg6ckiaowk/BSR.xlsx?rlkey=vka50xyhc637riq901qo5bk16&st=y6ys2oz8&dl=1', + changeOrigin: true, + rewrite: () => '', + followRedirects: true } } },