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.





















