Summary
I cover a shopping cart application use case in this post. I implement a full CRUD set for the users, products, and carts using the RedisJSON module.
Architecture
The Server-side is implemented as an Express.js app with the node-redis module. The test client is also Node-based with node-fetch used for the HTTP client and a random data generator I concocted with the uniqueNamesGenerator module.
Code Snippets
Random Data Generation
static generateUser() { return { "userID": uuidv4(), "lastName": RandomData.#getLastName(), "firstName": RandomData.#getFirstName(), "street": RandomData.#getStreet(), "city": RandomData.#getCity(), "state": RandomData.#getState(), "zip": RandomData.#getZip() }; }; static #getFirstName() { return uniqueNamesGenerator({ dictionaries:[names], length: 1 }); }; static #getLastName() { return uniqueNamesGenerator({ dictionaries: [adjectives], length: 1, style: 'capital' }); };
Create User - Client-side
async function createUser(dbType, user) { const response = await fetch(`${SERVER.url}/${dbType}/user`, { method: 'POST', body: JSON.stringify(user), headers: { 'Content-Type': 'application/json', 'Authorization': AUTH } }); return await response.json(); }; const user = RandomData.generateUser(); res = await createUser('redis', user);
Update Cart - Server-side
app.patch('/:dbType/cart/:cartID', async (req, res) => { switch (req.params.dbType) { case 'redis': try { var client = await redisConnect(); const updatedItem = req.body; const items = await client.json.get(`cart:${req.params.cartID}`, {path:'.items'}); const newItems = []; let found = false for (let item of items) { if (updatedItem.sku == item.sku) { found = true; if (updatedItem.quantity == 0) { continue; } else { newItems.push(updatedItem) } break; } else { newItems.push(item); } } if (!found) { newItems.push(updatedItem) } const val = await client.json.set(`cart:${req.params.cartID}`, `.items`, newItems); if (val == 'OK') { console.log(`200: Cart ${req.params.cartID} updated`); res.status(200).json({'cartID': req.params.cartID}); } else { throw new Error(`Cart ${req.params.sku} not fully updated`); } } catch (err) { console.error(`400: ${err.message}`); res.status(400).json({error: err.message}); } finally { await client.quit(); }; break; default: const msg = 'Unknown DB Type'; console.error(`400: ${msg}`); res.status(400).json({error: msg}); break; }; });
Source
Copyright ©1993-2024 Joey E Whelan, All rights reserved.