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.