Skip to content

Commit

Permalink
✨ Add filter option in user using key/value
Browse files Browse the repository at this point in the history
  • Loading branch information
Ovi committed Sep 1, 2022
1 parent 72fa3c9 commit 381ea75
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 2 deletions.
27 changes: 27 additions & 0 deletions src/controllers/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const {
dataInMemory: frozenData,
getMultiObjectSubset,
getObjectSubset,
getNestedValue,
} = require('../utils/util');

const controller = {};
Expand Down Expand Up @@ -58,6 +59,32 @@ controller.searchUsers = ({ limit, skip, select, q: searchQuery }) => {
return result;
};

// filter users
controller.filterUsers = ({ limit, skip, select, key, value }) => {
let [...users] = frozenData.users.filter(u => {
const val = getNestedValue(u, key);
return val && val.toString() === value;
});

const total = users.length;

if (skip > 0) {
users = users.slice(skip);
}

if (users.length > limit) {
users.length = limit;
}

if (select) {
users = getMultiObjectSubset(users, select);
}

const result = { users, total, skip, limit: users.length };

return result;
};

// get user by id
controller.getUserById = ({ id, select }) => {
let { ...user } = verifyUserHandler(id);
Expand Down
4 changes: 3 additions & 1 deletion src/middleware/cleanRequest.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const cleanRequest = (req, res, next) => {
const options = {};
req._options = options;

const { limit = 30, skip = 0, q } = req.query;
const { limit = 30, skip = 0, q, key, value } = req.query;
let { select } = req.query;

if (!isNumber(limit)) {
Expand All @@ -40,6 +40,8 @@ const cleanRequest = (req, res, next) => {
options.skip = skip;
options.select = select;
options.q = searchQuery;
options.key = key;
options.value = value;

next();
} catch (e) {
Expand Down
8 changes: 7 additions & 1 deletion src/routes/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const {
addNewUser,
updateUserById,
deleteUserById,
filterUsers,
} = require('../controllers/user');
const { verifyUserHandler } = require('../helpers');

Expand All @@ -17,11 +18,16 @@ router.get('/', (req, res) => {
res.send(getAllUsers({ ...req._options }));
});

// search user
// search users
router.get('/search', (req, res) => {
res.send(searchUsers({ ...req._options }));
});

// filter users
router.get('/filter', (req, res) => {
res.send(filterUsers({ ...req._options }));
});

// get user by id
router.get('/:id', (req, res) => {
const { id } = req.params;
Expand Down
4 changes: 4 additions & 0 deletions src/utils/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -193,4 +193,8 @@ utils.deepFreeze = function(obj) {
return obj;
};

utils.getNestedValue = (obj, keys) => {
return keys.split('.').reduce((o, k) => (o || {})[k], obj);
};

module.exports = utils;
57 changes: 57 additions & 0 deletions views/docs-users.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,63 @@ fetch('https://dummyjson.com/users/search?q=John')
</blockquote>
</div>

<div class="sub-section">
<h3 id="filter">
<a href="#filter" class="no-link">Filter users</a>
</h3>
<p>
<small>
<i class="bx bx-right-arrow bx-xs"></i>
You can pass key (nested keys with ".") and value as params to
filter users. (key and value are case-sensitive)
</small>

<br />

<small>
<i class="bx bx-bulb bx-xs"></i>
"limit", "skip" and "select" works too.
</small>
</p>

<blockquote>
<pre>
<code class="language-js">
fetch('https://dummyjson.com/users/filter?key=hair.color&value=Brown')
.then(res => res.json())
.then(console.log);
</code>
</pre>
</blockquote>

<a class="button" onclick="toggleOutput(event)">
Show output
</a>

<blockquote>
<pre class="result hidden">
<code class="language-json">
{
"users": [
{
"firstName": "Demetrius",
"hair": {
"color": "Brown", // filter matched hair color
},
"id": 9,
"lastName": "Corkery"
// rest user data
}
],
"total": 26,
"skip": 0,
"limit": 26
}
</code>
</pre>
</blockquote>
</div>

<div class="sub-section">
<h3 id="limit_skip">
<a href="#limit_skip" class="no-link">Limit and skip users</a>
Expand Down
6 changes: 6 additions & 0 deletions views/partials/docs-side-nav.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,12 @@
</a>
</li>

<li>
<a href="/docs/users/#filter">
Filter users
</a>
</li>

<li>
<a href="/docs/users/#limit_skip">
Limit & Skip users
Expand Down

0 comments on commit 381ea75

Please sign in to comment.