diff options
Diffstat (limited to 'examples/ssr/server/api.mjs')
-rw-r--r-- | examples/ssr/server/api.mjs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/examples/ssr/server/api.mjs b/examples/ssr/server/api.mjs index 3d2656815..9bb0be72a 100644 --- a/examples/ssr/server/api.mjs +++ b/examples/ssr/server/api.mjs @@ -1,9 +1,14 @@ 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])+/, @@ -32,6 +37,53 @@ const routes = [ 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) { |