diff options
Diffstat (limited to 'examples/ssr/server')
-rw-r--r-- | examples/ssr/server/api.mjs | 52 | ||||
-rw-r--r-- | examples/ssr/server/server.mjs | 7 |
2 files changed, 56 insertions, 3 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) { diff --git a/examples/ssr/server/server.mjs b/examples/ssr/server/server.mjs index e760ac2f8..c6f35685e 100644 --- a/examples/ssr/server/server.mjs +++ b/examples/ssr/server/server.mjs @@ -15,9 +15,10 @@ async function handle(req, res) { const route = app.match(req); if (route) { - const html = await app.render(req, route); - - res.writeHead(200, { + /** @type {Response} */ + const response = await app.render(req, route); + const html = await response.text(); + res.writeHead(response.status, { 'Content-Type': 'text/html; charset=utf-8', 'Content-Length': Buffer.byteLength(html, 'utf-8'), }); |