import fs from 'fs'; import lightcookie from 'lightcookie'; const dbJSON = fs.readFileSync(new URL('./db.json', import.meta.url)); const db = JSON.parse(dbJSON); const products = db.products; const productMap = new Map(products.map((product) => [product.id, product])); // Normally this would be in a database. const userCartItems = new Map(); const routes = [ { match: /\/api\/products\/([0-9])+/, async handle(_req, res, [, idStr]) { const id = Number(idStr); if (productMap.has(id)) { const product = productMap.get(id); res.writeHead(200, { 'Content-Type': 'application/json', }); res.end(JSON.stringify(product)); } else { res.writeHead(404, { 'Content-Type': 'text/plain', }); res.end('Not found'); } }, }, { match: /\/api\/products/, async handle(_req, res) { res.writeHead(200, { 'Content-Type': 'application/json', }); res.end(JSON.stringify(products)); }, }, { match: /\/api\/cart/, async handle(req, res) { res.writeHead(200, { 'Content-Type': 'application/json', }); let cookie = req.headers.cookie; let userId = cookie ? lightcookie.parse(cookie)['user-id'] : '1'; // default for testing if (!userId || !userCartItems.has(userId)) { res.end(JSON.stringify({ items: [] })); return; } let items = userCartItems.get(userId); let array = Array.from(items.values()); res.end(JSON.stringify({ items: array })); }, }, { match: /\/api\/add-to-cart/, async handle(req, res) { let body = ''; req.on('data', (chunk) => (body += chunk)); return new Promise((resolve) => { req.on('end', () => { let cookie = req.headers.cookie; let userId = lightcookie.parse(cookie)['user-id']; let msg = JSON.parse(body); if (!userCartItems.has(userId)) { userCartItems.set(userId, new Map()); } let cart = userCartItems.get(userId); if (cart.has(msg.id)) { cart.get(msg.id).count++; } else { cart.set(msg.id, { id: msg.id, name: msg.name, count: 1 }); } res.writeHead(200, { 'Content-Type': 'application/json', }); res.end(JSON.stringify({ ok: true })); }); }); }, }, ]; export async function apiHandler(req, res) { for (const route of routes) { const match = route.match.exec(req.url); if (match) { return route.handle(req, res, match); } } res.writeHead(404, { 'Content-Type': 'text/plain', }); res.end('Not found'); } updates'>cli-flow-updates Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/packages/integrations/netlify (unfollow)
AgeCommit message (Collapse)AuthorFilesLines
2024-08-07Remove tsconfig-resolver from repo (#11642)Gravatar Bjorn Lu 3-56/+14
2024-08-07Improve regex performance (#11635)Gravatar Bjorn Lu 23-32/+39
2024-08-07[ci] formatGravatar Bjorn Lu 1-2/+2
2024-08-07Remove `#astro/*` subpath imports (#11636)Gravatar Bjorn Lu 2-6/+3
2024-08-06Actions: fix 500 on empty object for Vercel serverless (#11634)Gravatar Ben Holmes 5-6/+33
* fix: only set content-type when body is defined * feat(test): content-type is omitted * chore: changeset
2024-08-06Update changeset base branch (#11632)Gravatar Bjorn Lu 2-5/+7